『算法设计_伪代码』贪心算法_最短路径Dijkstra算法
Dijkstra算法实际上是一个贪婪算法(Greedy algorithm)。因为该算法总是试图优先访问每一步循环中距离起始点最近的下一个结点。Dijkstra算法的过程如下图所示。
初始化
- 给定图中的一个结点
s
作为起始点。 - 给定一个数组
dist[]
存储图中所有结点到s
的距离。将dist[s]
初始化为0
。对于图中的其他结点v
,初始化dist[v]
为无穷大。初始化为无穷大的意义在于我们假设其余所有结点在当前情况下尚未与s
联通。随着算法的执行,dist[v]
会保存图中从s
到v
的最短路径的距离。 - 给定一个minimum Heap,记为
Q
。堆顶为当前情况下距离s
最近的结点及相应的距离。将(s, 0)
放入堆中。 - 给定一个Set,记为
S
,保存所有已经访问过的结点。Set初始为空。基于Dijkstra算法的性质,我们总是以最短的路径遍历每一个结点,因此对于任一结点,一旦我们已经访问过,就代表着我们已经得到了从s
到达这一结点的最短路径。
计算最短路径
- 当
Q
不为空的情况下,取出堆顶的元素(v, [dist[v])
—— 也就是当前距离s
最近的结点v
,及其距离dist[v]
。 - 如果
v
在S
中,则代表我们已经访问过v
的最短路径。那么跳过当前v
,重复步骤1。 - 否则,将
v
放在S
中。 - 对于每一个与
v
相邻的结点t
:- 如果
dist[v] + weight(v, t) < dist[t]
,则更新dist[t] = dist[v] + weight(v, t)
。同时将(t, dist[t])
放进Q
中。 - 否则,不做任何处理。
- 如果
当算法结束后,dist[]
中保存图中每一个除s
之外的结点到s
的最短路径的权重值(或长度)。如果从s
到v
不存在联通的路径,则dist[v] = ∞
。
证明算法正确性
假设对于每个已经访问过的结点v
,dist[v]
存储从起始点s
到v
的最短路径。
当算法初始化时,dist[]
中只包含dist[s] = 0
,其正确性显而易见。
对于其余n-1
个结点,假设u
已经被访问且v
尚未被访问,同时u
和v
之间存在一条边u -> v
,其权重为weight(u,v)
,那么一定有dist[v] = dist[u] + weight(u, v)
。否则的话,假设存在另一条更短的路径dist[t]
满足dist[t] + weight(t, v)
,则根据上述算法,t
一定先于u
被访问,则与我们当前的假设产生了矛盾。该论断对于余下的所有结点都成立。
因此Dijkstra算法一定能给出从出发点到其余所有结点(在可以到达的情况下)的最短路径。
复杂度分析
设图中总计有E
条边,N
个结点。
时间复杂度:O(ElogE)
。因为所使用的最小堆最大可达O(E)
大小,同时我们从其中将每个元素取出来一次。
空间复杂度:O(N+E)
。其中O(N)
为存储dist
所用空间。O(E)
为存储图的邻接链表及最小堆所用空间。
『算法设计_伪代码』贪心算法_最短路径Dijkstra算法的更多相关文章
- 最短路径-Dijkstra算法与Floyd算法
一.最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径. AE:1 ADE:2 ADCE:3 ABCE:3 ②在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径 ...
- 最短路径——Dijkstra算法以及二叉堆优化(含证明)
一般最短路径算法习惯性的分为两种:单源最短路径算法和全顶点之间最短路径.前者是计算出从一个点出发,到达所有其余可到达顶点的距离.后者是计算出图中所有点之间的路径距离. 单源最短路径 Dijkstra算 ...
- 有向网络(带权的有向图)的最短路径Dijkstra算法
什么是最短路径? 单源最短路径(所谓单源最短路径就是只指定一个顶点,最短路径是指其他顶点和这个顶点之间的路径的权值的最小值) 什么是最短路径问题? 给定一带权图,图中每条边的权值是非负的,代表着两顶点 ...
- 网络最短路径Dijkstra算法
最近在学习算法,看到有人写过的这样一个算法,我决定摘抄过来作为我的学习笔记: <span style="font-size:18px;">/* * File: shor ...
- 单源最短路径Dijkstra算法,多源最短路径Floyd算法
1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...
- 数据结构实验之图论七:驴友计划 ( 最短路径 Dijkstra 算法 )
数据结构实验之图论七:驴友计划 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...
- Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...
- 单源最短路径——Dijkstra算法学习
每次都以为自己理解了Dijkstra这个算法,但是过没多久又忘记了,这应该是第4.5次重温这个算法了. 这次是看的胡鹏的<地理信息系统>,看完之后突然意识到用数学公式表示算法流程是如此的好 ...
- 单源最短路径——dijkstra算法
dijkstra算法与prim算法的区别 1.先说说prim算法的思想: 众所周知,prim算法是一个最小生成树算法,它运用的是贪心原理(在这里不再证明),设置两个点集合,一个集合为要求的生成树的 ...
随机推荐
- (转)ElasticSearch学习
(二期)21.全文搜索引擎Elasticsearch [课程21]elasticsearch.xmind82.1KB [课程21]lucene.xmind0.8MB [课程21]基本用法....api ...
- 论文笔记:Diffusion-Convolutional Neural Networks (传播-卷积神经网络)
Diffusion-Convolutional Neural Networks (传播-卷积神经网络)2018-04-09 21:59:02 1. Abstract: 我们提出传播-卷积神经网络(DC ...
- 1.2成员变量+类变量+static关键字
成员变量和类变量的区别 由static修饰的变量称为静态变量,其实质上就是一个全局变量.如果某个内容是被所有对象所共享,那么该内容就应该用静态修饰:没有被静态修饰的内容,其实是属于对象的特殊描述. 不 ...
- Bytom交易说明(账户管理模式)
比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 该部分主 ...
- Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project ppcloud-common: Compilation failure
本文为博主原创,未经允许不得转载: [INFO] Finished at: 2018-09-19T20:26:05+08:00[INFO] ------------------------------ ...
- 页面中,禁止html内容被选择
1.通过css的方式 *{ moz-user-select: -moz-none; -moz-user-select: none; -o-user-select:none; -khtml-user-s ...
- mysql基本知识总结
第一天 create database act_web character set utf8; : 创建数据库并设立编码(命令中是不允许使用“-”的) '; :创建用户并设立密码 grant all ...
- HAProxy用法详解
一.HAProxy简介 (1)HAProxy 是一款提供高可用性.负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. HAProx ...
- Meta referrer标签的,可以防止CSRF的攻击
Meta referrer标签的简要介绍 在某些情况下,出于一些原因,网站想要控制页面发送给 server 的 referer 信息的情况下,可以使用这一 referer metadata 参数. 参 ...
- SpringBoot获取全局配置文件的属性以及@ConfigurationProperties实现类型安全的配置
在SpringBoot,可以定义一个全局配置文件,全局配置文件有两种形式: 1). application.properties 2).application.yml 二者的后缀名不同,编辑的格式也不 ...