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. Git相关命令整理

    git config --global user.name  //配置姓名git config --global user.email  //配置邮箱git config --list  //查看配置 ...

  2. Java JNA (一)—— 调用dll

    Java调用C++动态链接库的方式很多,有jnative,jna等.这里介绍如何通过jna的方式调用动态链接库. 调用代码很简单,就是需要注意几个问题. 补充:如dll内部访问配置文件,需将配置文件放 ...

  3. RESET - 把一个运行时参数值恢复为缺省值

    SYNOPSIS RESET name RESET ALL DESCRIPTION 描述 RESET 将运行时参数恢复为缺省值. RESET 是下面语句的一个变种 SET parameter TO D ...

  4. smbtar - 直接备份SMB/CIFS共享资源到UNIX磁带设备的shell脚本

    总览 smbtar -s server [-p password] [-x service] [-X] [-d directory] [-u user] [-t tape] [-b blocksize ...

  5. UVa1636 Headshot 【迁移自洛谷博客】

    说明:小蒟蒻hkk现在正在做一些概率的题目,由于这方面和数学还有点关系,所以需要一些数学的思维,也需要表述出来,如夏军所述"把自己给讲懂",所以写了些blog,主要为帮助自己理解. ...

  6. Spring---基础配置

    1.@Scope 1.1.描述了Spring容器如何新建Bean的实例: 1.2.@Scope(value="") value值有: 1.2.1.singleton 一个Sprin ...

  7. Raspbian 在虚拟机上运行,运行Flask,供宿主机访问

    Raspbian 在虚拟机上运行,启动Flask,供宿主机访问 参考ref 1, 在virtualbox上跑起来Raspbian OS 参考ref 2, 在Raspbian上安装并运行Falsk, 注 ...

  8. hdu 1451 Area in Triangle(计算几何 三角形)

    Given a triangle field and a rope of a certain length (Figure-1), you are required to use the rope t ...

  9. bzoj4397【Usaco2015 Dec】Breed Counting(前缀和、树状数组)

    题目描述 Farmer John's N cows, conveniently numbered 1…N, are all standing in a row (they seem to do so ...

  10. visual studio code的使用

    1.添加代码片段 参考:https://blog.csdn.net/qq_36370731/article/details/83014439 2.在vscode上运行Git 先打开vscode内置的G ...