迪杰斯特拉算法(Dijkstra)证明
首先,这篇文章是在讲《图论》时候写文章
(所以,还是以理论为主,以后有空的时候,会把代码发上来,不过我觉得大家看完理论,如果讲得好,代码也就比较容易了。如果讲得不好,网上的代码也是大把,不看这篇文章也罢了)
任务目标:
给个起点S,找到图中每个点距离起点S的最小距离(考虑联通性的问题)。
算法思路概述
先选第一个距离S最近的点。之后,更新其他图中的点到S的距离。更新原因:新增加的最近点可以作为一个桥。
- 输入是:点之间的距离矩阵。
- 维护是:上面矩阵中的某一行
下图为老师的课件内容部分,我觉得虽然详尽,但也有些枯燥。可能是为了凝练语言吧。如果有耐心看的话,倒真的是一篇非常好的文章。
我在后面会用自己的语言阐述,可能会比较清晰(但废话可能也比较多)。
其中前面的黄色部分是我自己标注的(老师写的),后面的黄色部分是我自己写的。
阐述
- 首先,选定一个点v0v0v0,先假设所有的点到某个点的路径都是无穷(当然自己到自己肯定得是长度是0…)。
- 然后确定一个集合SSS,这集合表示已经被访问的过点。(那么没有被访问过的点,也是很容易解决的…),这里用个bool数组什么的标记一下吧。
- 之后,先更新所有点到这个v0v0v0的距离。怎么更新呢?
- 所有点通过已经被访问过的点到达v0v0v0的距离,在结合d(v0,vi)=minvj∈(S)(d(v0,vj)+w(vj,vi))d(v0, vi) = min_{vj \in (S)}(d(v0, vj) + w(vj, vi))d(v0,vi)=minvj∈(S)(d(v0,vj)+w(vj,vi)) ( 一般就是新增加的那个点考虑下就好了 )。就是在中间搭一个桥,如果,通过这个桥的点会让这个路变得更近,就更新这个路径的长度。
- 然后选个最近的点,然后把这个最近的点标记访问过。纳入到集合SSS
- 然后,一直到把所有的点都纳入进去之后,就没什么事情了~
这里面,有很多的问题,乍一看都是有点合情合理,但是却让人一下子想不明白的。
归结到一条,就是,为什么这样子,就能保证一定会是得到了所有的点,到这个点v0v0v0的最短距离呢?
证明(不严格的证明)
- 首先,我们能保证,拿到的第一个点,一定是跟v0v0v0最近的点。 因为,首先我们选择的是与v0v0v0直接相连的点中到v0v0v0最近的点。如果之后的选的方法得到点,有能够得到的点到v0v0v0的距离小于一开始选的这个点的话,这是不科学的。因为,我们每次选点,都是根据我们维护的一个数组。这个数组的变化过程是,以这个数组中很早就被选中的点的为中转的点,然后,再加上这个中转的点到这个的点的距离,来替代的。但是,我们知道,任意两点的距离都是大于0的,那么,更新的基本算法是“加法”那么更新之后, 怎么可能得到的数是比之前的数要小呢?
- 同样的道理,第二次被选的点,一定是比以后要选的点都要更近v0v0v0一点。(最多是相等)。有没有一种感觉,就跟堆排序的方法是一样的。每次,都是把距离v0v0v0最近的点给“生产”出来了。然后不断迭代出所有与v0的点更近的点。
证明(较为严格的证明)
通过归纳法
(1) i=0i = 0i=0
首先,还是一样,根据上面的方式,来依次产生出这些点。这是一个序列,称其为V=v0,v1,v2,....,vnV= {v0, v1, v2, ....,vn}V=v0,v1,v2,....,vn这n个点。vivivi对应的距离就是dididi。
(2) 设i<=ki <= ki<=k时成立,下面看 i=k+1i = k + 1i=k+1的情况
vivivi通过上述方法生成的点,所得到的到v0v0v0的距离不是最近的,也就是说,还存在一条路,使得vivivi到v0v0v0的距离小于dididi。
由于,dididi的产生方法,我们可以知道,这样的点,必定通过了后面的点(vi>=k+2v_{i >= k + 2}vi>=k+2)。但是,我们同样知道vi>=k+2v_{i >= k + 2}vi>=k+2到v0v0v0的距离一定是会大于vi<=kv_{i <= k }vi<=k的。(递增的特点)。所以,只要是通过了后面的点,到达v0v0v0的距离,一定是大于等于,我们只通过前面的点vi<=kv_{i <= k }vi<=k到达所致的。但是,这与我们之前的假设有矛盾。这样我们就知道了, i=k+1i = k + 1i=k+1时候也是成立的!
综上所述…
迪杰斯特拉算法(Dijkstra)证明相关推荐
- dijkstra算法_最短路径问题——迪杰斯特拉算法(Dijkstra)
假期过长,导致停更了好长时间,复习一道算法题找找感觉. 前段时间看到一篇文章,里面提到了统治世界的十大算法,其中之一就是迪杰斯特拉算法(Dijkstra),该算法主要解决的"最短路径&quo ...
- dij算法堆优化_迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少
算法实现步骤: a.初始时,只包括源点,即S = {v},v的距离为0.U包含除v以外的其他顶点,即:U ={其余顶点},若v与U中顶点u有边,则(u,v)为正常权值,若u不是v的出边邻接点,则(u, ...
- dij算法堆优化_迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少(示例代码)...
算法实现步骤: a.初始时,只包括源点,即S = {v},v的距离为0.U包含除v以外的其他顶点,即:U ={其余顶点},若v与U中顶点u有边,则(u,v)为正常权值,若u不是v的出边邻接点,则(u, ...
- 迪杰斯特拉算法的证明
求V0到V8的最短距离: 迪杰斯特拉算法的思想是依次求出距离V0第1近,第2近--.一直到第8近,也就是从距离V0最近到最远的点.而每求一个最近距离就修正V0到剩下点的最短距离. 设A为包含V0和已经 ...
- 最短路径算法之迪杰斯特拉算法(Dijkstra)和佛洛依德算法(Floyd)
今天学习了这两种算法,都是用来求最小路径的算法,但是迪杰斯特拉算法只能从某个特定点到所有点的最短路径,而佛洛依德算法可以查出任意点到任意点的最小路径. 迪杰斯特拉: package dijkstra; ...
- 最短路径算法-迪杰斯特拉(Dijkstra)
迪杰斯特拉(Dijkstra) 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径 ...
- c语言迪杰斯特拉算法求最短路径,迪杰斯特拉 ( Dijkstra ) 最短路径算法
迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径.它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本 ...
- 算法提升:图的Dijkstra(迪杰斯特拉)算法
目录 概念 思路 代码 概念 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路 ...
- MATLAB轻松绘制地图路线——Dijkstra(迪杰斯特拉)算法最短路径规划
文章目录 1. 地图绘制 2. 计算各节点之间的距离 3. Dijkstra(迪杰斯特拉)算法 4. 根据计算出的距离利用Dijkstra(迪杰斯特拉)算法找出指定节点之间的最短路径 工程文件(可直接 ...
- 《计算机网络自顶向下》之重头戏迪杰斯特拉算法
迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题.迪杰斯特拉算法主要特 ...
最新文章
- ubuntu14.04上搭建android开发环境
- Nginx 的启动、停止、平滑重启、信号控制和平滑升级
- java温度计的实现_echart 之实现温度计
- InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析
- AbstractListView源码分析2
- POJ - 1966 Cable TV Network(最小割-最大流)
- STP安全特性——bpduguard特性、 bpdufilter特性、guard root 特性、loopguard技术总结与案列(附图,建议PC观看)
- Google 要进军游戏行业了?!
- Android Sensors (3) 传感器坐标系统
- 16进制颜色转换为UIColor
- windows 监控
- 制定自己的SMART目标
- Windows Server 2008 R2远程桌面服务配置和授权激活
- 【安全资讯】引爆点:过去2020年勒索软件攻击激增62%
- 基于PHP+MySQL的汽车零配件生产企业ERP生产管理子系统
- 腾讯云服务器架设mir2
- Unity2018.3.11下载安装详细图文教程
- 蒟蒻的五周总结(解释引用)《挑战》
- 用Python分析《斗破苍穹》
- B站台湾大学郭彦甫|MATLAB 学习笔记|08 图像处理I Image Processing
热门文章
- 武汉区块链软件技术公司:区块链如何化解溯源的短板
- 如何优雅的研究 RGSS3 (七) 加入LOGO屏幕
- innodb行锁理解
- HTML5 处理响应式图片
- Effect of Switchovers, Failovers, and Control File Creation on Backups
- 算法杂货铺——分类算法之贝叶斯网络(Bayesian networks)
- eclipse卸载插件小记
- Administer Service Cloud
- 计算属性|| 计算属性与方法的区别:计算属性是基于它们的依赖进行缓存的 ;方法不存在缓存||侦听器
- 使用 spring 的 IOC 解决程序耦合——获取spring的Ioc核心容器,并根据id获取对象、核心容器的两个接口(ApplicationContext、BeanFactory)引发出的问题