Prim算法用于计算最小生成树。Prim算法分为两种,一种是懒汉式,一种是饿汉式。

懒汉式Prim

懒汉式Prim算法过程例如以下:

  1. 首先将顶点0增加到MST中

  2. 从MST与未訪问顶点之间边中选出最短的边。在满足MST的前提下,将这条边增加到MST

代码

import java.util.LinkedList;
import java.util.List; public class LazyPrim {
private MinPQ<Edge> pq = new MinPQ<Edge>();
private List<Edge> mst = new LinkedList<Edge>();
private boolean[] visited; public LazyPrim(EdgeWeightedGraph G) {
visited = new boolean[G.V()]; // 将第一个顶点增加到MST中
visit(G, 0); // 依次选出最短的边
while (!pq.isEmpty()) {
Edge minEdge = pq.popMin();
int v = minEdge.either();
int w = minEdge.other(v); // 忽略造成回路的边
if (visited[v] && visited[w]) {
continue;
} // 訪问该点。将该边增加到MST
if (!visited[v]) visit(G, v);
else visit(G, w);
mst.add(minEdge);
}
} public Iterable<Edge> edges() {
return mst;
} public double weight() {
double result = 0;
for (Edge e : edges()) {
result += e.weight();
}
return result;
} private void visit(EdgeWeightedGraph G, int v) {
// 将该点标记为已訪问
visited[v] = true; // 将该点伸展的边增加到优先级队列中
for(Edge e:G.adj(v)){
int w = e.other(v);
if(!visited[w]) {
pq.add(e);
}
}
}
}

复杂度

懒汉式Prim算法在最坏的情况下时间复杂度为E logE,空间复杂度是E。

饿汉式Prim

饿汉式Prim的基本思想就是给每一个尚未增加到MST的顶点都仅仅记录一个最短的。连接MST的边。

由于仅仅记录一个边。所以计算量略微降低了一些。

Prim算法中须要用到优先级队列。依据优先级队列的实现方式。算法复杂度也有所差异。假设用二叉堆方式进行时间。那么它的时间复杂度就是E logV,假设用数组方式实现。那么这样的算法的复杂度就是V^2。

对于边数许多的图,使用数组方式时间优先级队列能够提高算法性能,对于边数较少的图,使用二叉堆方式实现优先级队列能够获得较高的性能。

算法8-5:Prim算法的更多相关文章

  1. 算法起步之Prim算法

    原文:算法起步之Prim算法 prim算法是另一种最小生成树算法.他的安全边选择策略跟kruskal略微不同,这点我们可以通过一张图先来了解一下. prim算法的安全边是从与当前生成树相连接的边中选择 ...

  2. 一步一步写算法(之prim算法 下)

    原文:一步一步写算法(之prim算法 下) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前两篇博客我们讨论了prim最小生成树的算法,熟悉 ...

  3. 一步一步写算法(之prim算法 中)

    原文:一步一步写算法(之prim算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] C)编写最小生成树,涉及创建.挑选和添加过程 MI ...

  4. 一步一步写算法(之prim算法 上)

    原文:一步一步写算法(之prim算法 上) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面我们讨论了图的创建.添加.删除和保存等问题.今 ...

  5. 数据结构与算法--最小生成树之Prim算法

    数据结构与算法--最小生成树之Prim算法 加权图是一种为每条边关联一个权值或称为成本的图模型.所谓生成树,是某图的一棵含有全部n个顶点的无环连通子图,它有n - 1条边.最小生成树(MST)是加权图 ...

  6. 算法导论学习-prim算法

    一. 关于最小生成树 对于无向连通图G=(V,E),其中V表示图的顶点,E表示图的边,对于每条边都有一个权值,可以理解为边a->b的权值C为从a走到b要走的路程为C.现在我们希望找到一个无回路的 ...

  7. 算法对比:Prim算法与Dijskra算法

    在图论中,求MST的Prim算法和求最短路的Dijskra算法非常像.可是我一直都对这两个算法处于要懂不懂的状态,现在,就来总结一下这两个算法. 最小生成树(MST)—Prim算法: 算法步骤: •将 ...

  8. 【Python排序搜索基本算法】之Prim算法

    Prim算法是实现最简单的最小生成树(MST)算法,适合于稠密图.要实现Prim算法,我们主要关注的是增量的变化,也就是从每个非树顶点到树顶点的最短距离,使得最后生成一棵包括所有顶点的树,并且这棵树的 ...

  9. 算法笔记_054:Prim算法(Java)

    目录 1 问题描述 2 解决方案 2.1 贪心法   1 问题描述 何为Prim算法? 此处引用网友博客中一段介绍(PS:个人感觉网友的这篇博客对于Prim算法讲解的很清楚,本文与之相区别的地方在于具 ...

随机推荐

  1. python集合set,交集,并集,差集,对称差集,子集和超集

    python集合set,交集,并集,差集,对称差集,子集和超集 x = {1, 2, 3, 4} y = {2, 4, 5, 6} # 交集(取x中与y中相同部分) print(x.intersect ...

  2. 2025年VR虚拟现实技术将渗透人们日常生活

    2025年VR虚拟现实技术将给人们带来什么好处?今年早些时候,虚拟现实VR游戏制造商Survios在广州一个非常大的购物中心内的一个小型灰色墙壁店面,通过AMC中心植入了其位置游戏市场上的第一面旗帜. ...

  3. VUE中使用canvas做签名功能,兼容IE

    <template>         <div>           <div class="msgInput">             &l ...

  4. 英语单词contributors

    contributors 来源——github网站 翻译 n. 贡献者:参与者:编著者(contributor的复数形式) TOEFL | GMAT                   词根:cont ...

  5. Debug模式自定义NSlog

    #ifdef DEBUG # define DLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函数名:%s]\n" "[行号 ...

  6. Python爬虫之抓图

    从"百度图片(http://image.baidu.com/)"的首页下载图片 # -*- coding: utf-8 -*- import urllib import re im ...

  7. 540D - Bad Luck Island(概率DP)

    原题链接:http://codeforces.com/problemset/problem/540/D 题意:给你石头.剪刀.布的数量,它们之间的石头能干掉剪刀,剪刀能干掉布,布能干掉石头,问最后石头 ...

  8. flutter动态列表

    在前面一篇总结flutter里面的列表组件ListView的时候,一直都是使用的静态数据,但是在实际的运用过程中,数据都是从后台获取的动态数据,不能再像前面那样写静态数据了,下面模拟一下如果使用动态数 ...

  9. AcWing 252. 树 (点分治)打卡

    题目:https://www.acwing.com/problem/content/254/ 题意:求一棵树上,路径<=k的有多少条 思路:点分治,我们用两个指针算solve函数,首先对算出来的 ...

  10. Buuctf | sqli-labs

    这个是赵师傅给我们提供的训练靶场,最好都打一遍,但是出于找flag的角度,特此记录一下,flag在哪里[没错,我就是喜欢我的蓝变红,哈] ?id=1' :报错,说明就是用这个闭合的 ?id=0' un ...