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. springboot的jar包部署

    由于springboot常用war包部署,改为cloud开发模式多端口情况下,部署反而不习惯 毕竟,war包要不要项目名访问都必须放在tomcat的root目录下 而此目录限制只能放置一个项目,并且登 ...

  2. 【学习总结】Python-3-字符串函数split()的妙用

    参考: 菜鸟教程-Python3-Python字符串-split() 语法: str.split(str="", num=string.count(str)) 参数 str -- ...

  3. 【记录】elastiasearch 6.4.3 版本 SearchRequestBuilder字段排序,BoolQueryBuilder

    参考地址: 1:https://www.cnblogs.com/shoutn/p/8027960.html 2:https://www.jianshu.com/p/8402eb930ae7 3:htt ...

  4. poj 1845 Sumdiv (等比求和+逆元)

    题目链接:http://poj.org/problem?id=1845 题目大意:给出两个自然数a,b,求a^b的所有自然数因子的和模上9901 (0 <= a,b <= 50000000 ...

  5. Java使用对象类型作为方法的返回值

  6. PL SQL安装

    首先,在官网下载PL SQL 的对应版本,本机是64位的就下载64位的,网址:https://www.allroundautomations.com/downloads.html#PLS 点击应用程序 ...

  7. CentOS7.5常用命令

    常用命令: 关机shutdown -h now 参数:重启-r定时-r 23:59 分-r 10 查源软件yum list |grep telnet参数:安装install 服务启动systemctl ...

  8. springMVC的controller更改了,如何不重启,而自动刷新的解决办法(亲测,一招解决)

    Tomcat  con/ service.xml  配置如下一行代码: <Context reloadable="true"/> </Host> 然后以de ...

  9. centos6安装完成之后必要的配置

    centos6安装完成之后必要的配置 一配置yum源 [root@centos61 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirro ...

  10. MySQL/RDS数据如何同步到MaxCompute之实践讲解

    摘要:大数据计算服务(MaxCompute,原名ODPS)是阿里云提供的一种快速.完全托管的EB级数据仓库解决方案.本文章中阿里云MaxCompute公有云技术支持人员刘力夺通过一个实验向大家介绍了阿 ...