最短路径算法--Dijkstra算法Python实现

  • 定义
  • 图的定义
  • 算法原理
  • 算法实现
  • 实验对比

定义

最短路径问题是指在有权图中的两点之间找到一条权重最小的路径。今天来讲讲比较经典的Dijkstra算法。在开始将算法之前,先对图(网络)做一个基本定义。

去看原文

图的定义

算法原理

我们的目标是求节点到节点的单源最短路径,简单用图1描述一下。我们的目标是要计算从O(O=1)到D(D=4)的最短路径,假设存在这样一条最短路径P(1,4),那这条最短路径一定是节点4的前继节点(3、2、5)中的一条最短路径加上相应边中最小的一条,即符合:

显然从图1中可以得知是P(1,5),即从节点5到4是最短的路径。那么P(1,5)要如何求了,同样的道理,那也是从节点5的前继节点中找到一条最短的。

这就类似于动态规划,那么把这个过程正向过来,即我们每次都要找到这样的一个节点,即从起点到该节点的权重之和是所有最短路未被确定的节点中最小的那个,然后从该节点向它的后继节点进行扩展。所以需要一个优先队列来保存每个节点当前最优路径的label。

优先队列可以采用斐波那契堆(简称F堆)。以下是一个搜索过程:

算法实现

伪码

实验对比


更多精彩内容,请关注“探索GIS的小蜗牛”。

Dijkstra算法--斐波那契堆,Python实现相关推荐

  1. 算法导论 第20章 斐波那契堆

    斐波那契堆的定义 参看19章 二项堆我们可以看到对于可合并堆操作,二项堆均有O(lgn)的时间,对于本章将要讨论的斐波那契堆也支持这些操作,而且它有着更好的渐进时间界,对于不涉及元素删除的操作,它有着 ...

  2. 算法导论读书笔记-第十九章-斐波那契堆

    算法导论第19章--斐波那契堆 可合并(最小)堆(mergeable min-heap) : 支持以下5种操作的一种数据结构, 其中每一个元素都有一个关键字: MAKE-HEAP(): 创建和返回一个 ...

  3. 算法导论之斐波那契堆

    斐波那契堆,和二项堆类似,也是由一组最小堆有序的树构成.注意区别,不是二项树,是有根而无序的树.导论中,斐波那契堆只是具有理论上的意义,是以平摊分析为指导思想来设计的数据结构,主要是渐进时间界比二项堆 ...

  4. 算法导论--斐波那契堆

    斐波那契堆 斐波那契堆也是数据储存结构的一种,这种数据结构之所以产生,主要有两个优点:1.对于数据合并操作具有很高的效率:2.对于其他一般数据操作平均时间复杂度较好(注意这里是平均复杂度,不是最坏情形 ...

  5. 《算法导论3rd第十九章》斐波那契堆

    前言 第六章堆排序使用了普通的二叉堆性质.其基本操作性能相当好,但union性能相当差. 对于一些图算法问题,EXTRACT-MIN 和DELETE操作次数远远小于DECREASE-KEY.因此有了斐 ...

  6. 《算法导论》第19章-斐波那契堆 引入 19.1 斐波那契堆结构

    引入 1.可合并堆 可合并堆(mergeable heap)是支持以下5种操作: MAKE-HEAP():创建和返回一个新的不含任何元素的堆. INSERT(H,x):将一个已填人关键字的元素x插人堆 ...

  7. 优先队列——斐波那契堆(without source code)

    [0]README 0.1) 本文部分内容转自 数据结构与算法分析,旨在理解 斐波那契堆 的基础知识: 0.2) 文本旨在理清 斐波那契堆的 核心idea,还没有写出源代码实现,表遗憾: 0.3)从实 ...

  8. 斐波那契堆(Fibonacci heaps)

    一:斐波那契堆 1:特性 斐波那契堆同二项堆一样,也是一种可合并堆.斐波那契堆的优势是:不涉及删除元素的操作仅需要O(1)的平摊运行时间(关于平摊分析的知识建议看<算法导论>第17章).和 ...

  9. boost::graph模块实现斐波那契堆的测试程序

    boost::graph模块实现斐波那契堆的测试程序 实现功能 C++实现代码 实现功能 boost::graph模块实现斐波那契堆的测试程序 C++实现代码 #include <boost/c ...

  10. 斐波那契数列 python 高阶解法

    斐波那契数列 python 高阶解法 2022.09.27 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以 ...

最新文章

  1. 鸡啄米vc++2010系列32(标签控件Tab Control 下)
  2. Android4.0.4之后,服务器返回401或者407时,获取不到消息体的解决办法
  3. 亿级商品详情页架构演进技术解密 | 高可用架构系列
  4. python的序列化和反序列化
  5. 如何学习 azure_Azure的监督学习
  6. mysql 笔记05 select语句以及条件语句的使用
  7. yolox: AssertionError: Caught AssertionError in DataLoader worker process 0.
  8. 北大cls_战报 | 第七届CLS“联合杯”篮球联赛
  9. java 实现MQTT客户端
  10. sqlplus 命令导入数据文件
  11. win11拉伸屏幕_win11系统出现拉伸屏幕问题修复办法
  12. 移动互联网之路——Axure RP 8.0网站与APP原型设计从入门到精通
  13. 开源webrtc服务器对比
  14. gis热力专题图制作
  15. MyBatisPlus-基础CRUD操作
  16. 批量提取 srt 字幕文件中的文字
  17. DLbest系列1——GAN生成对抗网络2
  18. vue 引入富文本编辑器(巨简单)
  19. 幼儿园科学教案计算机,幼儿园大班科学教案_大班科学教案_幼教网
  20. 使用matlab进行回声处理(三重回声)-数字信号处理课设

热门文章

  1. echarts2获取series下的data数值
  2. 学习笔记(12):Google开发专家带你学 AI:入门到实战(Keras/Tensorflow)(附源码)-深度学习“四件套”:数据、模型、损失函数与优化器
  3. my android机器人作文,机器人作文400字
  4. 如何将在不同文件夹下的批量plt文件转换为txt文件--python
  5. 联想计算机不能使用ghost,如何解决联想台式机不能重装系统
  6. 计算机程序设计流程图循环,流程图循环画法_流程图用什么办公软件
  7. android 上位机下位机串口通讯,上位机下位机串口通信.doc
  8. BT.2020 新一代超高清UHD视频制作与显示系统标准
  9. python爬取酷狗音乐top500_Python爬取酷狗音乐TOP500榜单
  10. Android 9.0 TV版导入GMS组件以及Google Play