Prim和Dijkstra居然写起来一模一样
一句话概括Prim和Dijkstra:
Dijkstra:依次找距离起点从近到远的点;
Prim:从起点开始找距离最近的点,且不形成环。
这样表述还看不出来什么
我们先对比二者的代码:
def dijkstra2(graph,start):vnum = len(graph)pqueue = []heapq.heappush(pqueue,(0.0,None,start))paths = {vertex : None for vertex in graph}count = 0while count < vnum and pqueue:pair = heapq.heappop(pqueue)distance = pair[0]parent = pair[1]vertex = pair[2]if paths[vertex]:continuepaths[vertex] = (parent,distance)edges = graph[vertex]for v in edges:if paths[v] is None:heapq.heappush(pqueue,(distance + graph[vertex][v],vertex,v))count += 1return paths
#%%
def prim(graph,start): vnum = len(graph)pqueue = []heapq.heappush(pqueue,(0.0,None,start))mst = {vertex : None for vertex in graph}count = 0 while count < vnum and pqueue:pair = heapq.heappop(pqueue)dist = pair[0]parent = pair[1]vertex = pair[2]if mst[vertex]:continuemst[vertex]=(parent,dist)edges = graph[vertex]for v in edges:if mst[v] is None:heapq.heappush(pqueue,(graph[vertex][v],vertex,v))count += 1return mst
AMAZING,看到了没有,简直一模一样!!!!!
只不过压堆时,一个压的是边的距离,一个压的是到起点的距离。
所以我们还要继续思考:Prim和Dijkstra
从起点VertexstartVertex_{start}Vertexstart,到距离这个点最远的点VertexendVertex_{end}Vertexend, 之间的路径我们暂且叫PATHPATHPATH。
Dijkstra实际上是在找这个PATHPATHPATH的最小值,不止最远的点找了,其他点也都找了;
Prim一直再找最近的点,也就是边最短的点,直到找了n-1条边,实际上是在约束条件下(不成环)找走过边和最短的PATHPATHPATH,实际上最短PATHPATHPATH也是不可能有环的,加入有环肯定是绕路了(从这里可以看得出算法的基础是数学,好的算法和数学关系很大);
Dijkstra实际上是在找最远点PATHPATHPATH的最小值,等价于,从起始点,约束条件下不断加最短边,直到加n-1条边。
也就是他们在解决同一个问题。
但是这个还是没有反映出他们的代码为何一模一样,简直是兄弟?
1、图类问题的遍历都是借助于邻居辐射,一传十,十传百,根本就不怕扩算乱了,因为已经做了标记处理了,所以框架都差不多;
2、都是基于贪心的处理,用了堆数据结构,基于的标准不一样(这个不一样成了他们的唯一不一样了);
3、为了记录路径,都用到(parent,node, weight),这也是路径的一般处理方式;
4、他们算法都太简单了(懂了的情况下),没几行,所以就没啥差异了啊。
Prim和Dijkstra居然写起来一模一样相关推荐
- ACM模板--邻接矩阵 无向图 Prim Kruskal Dijkstra
/*** C++: Dijkstra算法获取最短路径(邻接矩阵)** @author skywang* @date 2014/04/24*/#include <iomanip> #incl ...
- ACM模板--邻接表 无向图 Prim Kruskal Dijkstra
/*** C++: Dijkstra算法获取最短路径(邻接表)** @author judyge* @date 2014/04/24*/#include <iomanip> #includ ...
- Prim和Dijkstra算法的区别
在图论中,Prim算法是计算最小生成树的算法,而Dijkstra算法是计算最短路径的算法.二者看起来比较类似,因为假设全部顶点的集合是V,已经被挑选出来的点的集合是U,那么二者都是从集合V-U中不断的 ...
- cs61b学习记录(四)Trie、KDTree、Prim、Dijkstra、Kruskul
cs61b学习记录(四) Lecture21.Prefix Operations and Tries Balanced Search Tree: contains(x): Θ(logN) add(x) ...
- 经典算法研究系列:二、Dijkstra 算法初探
经典算法研究系列:二.Dijkstra 算法初探 July 二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...
- api怎么写_API数据加密框架monkeyapiencrypt
之前有写过一篇加密的文章<前后端API交互如何保证数据安全性>. 主要是在Spring Boot中如何对接口的数据进行自动加解密操作,通过注解的方式来指定是否需要加解密. 原理也很简单,通 ...
- Kruskal Prim模板
1. Kruskal(并查集模板): /*Kruskal:并查集实现,记录两点和距离,按距离升序排序,O (ElogE) */ struct Edge {int u, v, w;bool operat ...
- 和我一起写矩阵类(一)
和我一起写矩阵类(一) 大连理工大学软件学院WAKU(转载请保留署名) 最近Mr.Zeng的一个作业就是自己实现一个矩阵类,这是一个非常有实用价值的类.我花了几天完成了,期间也增长了很多知识,不敢独享 ...
- 图论最短路及生成树(Prim,Djikstra,Spfa,Bellan-ford,kruskal,topsort)
图论在算法中具有举足轻重的地位,只有学好图才能游刃有余.本文章将介绍图论中一些基础算法,可以说总结的十分全面,文章结尾也会分析各算法的差异,清晰易懂.并附上代码模板. 图论(最短路.生成树) 一.拓扑 ...
最新文章
- oracle rac ora 12537,解决11gR2 Rac ORA-12537: TNS:connection closed 一例
- android 颜色值参考,(有颜色图
- C++primer 10.6节练习
- 嵌入式Linux学习1——Linux常用指令1
- spring boot security ajax_Spring 和 SpringBoot 之间到底有啥区别?
- 偏最小二乘 非线性 matlab,求助:Matlab偏最小二乘程序哪错了
- oracle 分段函数,清华大学出版社-图书详情-《新高考数学题型全归纳(基础版)》...
- .Net Core2.*学习手册
- LeetCode 1694. 重新格式化电话号码(模拟)
- 问君能有几多愁,恰似不懂Linux SQL如何调优——聊聊SQL Server on Linux最佳实践
- vue checkbox双向绑定_Vue的双向绑定
- 转:c# 安装包制作
- 初中计算机期末质量分析,初中信息技术教学感悟随笔
- 微信登录显示网页无法连接服务器地址,手机微信登陆不了?
- 大数据自学全套教程,免费分享,赶紧码起来!(纯干货系列)
- 电力电子 中英 对照
- 时光飞逝,博客两周年啦
- R语言中predict函数之logistic建模
- 单片机C语言流水灯花样编程,单片机C语言程序设计:花样流水灯
- 《老鹰抓小鸡》将代表中国动画电影走出国门,走向世界,yyds❤
热门文章
- 计算机省赛教案,《计算机系统的组成》最新 参赛教案.doc
- api可以主动采集用户数据吗_模拟量数字量采集卡之EC-8001篇
- :/index.php,http://localhost/my/INDEX.PHP/INDEX/INDEX无法正常运行:解决时找不到Options FollowSymLinks谢谢...
- vue搜索好友_Vue实现类似通讯录功能(中)
- 抖音提示需要转换为mp4_如何将MP4文件转换为MP3格式?万兴优转帮你轻松完成转换...
- mysql扩展使用_mysql的扩展应用
- git拉取代码如何解决冲突_开源项目 git pull 代码冲突的解决方式?
- 【uniapp】 下拉刷新页面
- java string类型时间段 转换 date类型
- H2Database 转义符