Dijkstar算法的数学原理
Dijkstar算法是荷兰数学家迪克斯屈拉(or迪杰斯特拉?)在1959年发现的一个算法。是现有的几个求带权图中两个顶点之间最短通路的算法之一。算是一个相当经典的算法了。
迪克斯屈拉算法应用于无向连通简单带权图中,求出顶点a 与z 之间的最短通路的长度。我感觉其算法精髓就是:找到第一个与a 最靠近的顶点,然后找第二个,续行此法,直到找到的顶点是z 为止。该算法依赖于一系列的迭代。通过在每次迭代中添加一个顶点来构造出特殊顶点的集合。在每次迭代中完成一个标记过程。在这个标记过程中,用只包含特殊顶点的从a 到w 的最短通路的长度来标记w。添加到特殊顶点集合中的顶点是在还没有成为特殊顶点的那些顶点中带有最小标记的那个顶点。
算法细节是:首先用0 来标记a 而用∞ 标记其余的顶点。用记号L0(a) = 0 和 L0(v) = ∞ 表示在没有发生任何迭代之前的这些标记(下标0表示第零次迭代)。这些标记是从a 到这些顶点的最短通路的长度。迪克斯屈拉算法是通过形成特殊顶点的集合来进行的。设Sk 表示在标记过程中k 次迭代之后的特殊顶点的集合。首先令S0 = Ø。集合Sk 是通过把不属于Sk-1 的带最小标记的顶点u 添加到Sk-1 里来形成的。一旦把u 添加到Sk 中,就更新所有不属于Sk 的顶点的标记,使得顶点v 在第k 个阶段的标记Lk(v) 是只包含Sk 中顶点(即已有的特殊顶点的集合再加上u )的从a 到v 的最短通路的长度。设v 是不属于SK 的一个顶点。为了更新v 的标记,注意Lk(v) 是只包含Sk 中顶点的从a 到v 的最短通路的长度。当利用下面这个观察结果时,就可以有效地完成这个更新:从a 到v 的只包含Sk 中顶点的最短通路,或者是从a 到v 的只包含Sk-1 中顶点(即不包括u 在内的特殊顶点)的最短通路,或者是在k-1 阶段从a 到u 的最短通路上加上边(u, v)。简言之:Lk(a, v) = min{Lk-1(a, v), Lk-1(a, u) + w(u, v)}。这个过程这样迭代:相继地添加顶点到特殊顶点集合里, 直到添加到z 为止。当把z 添加到特殊顶点集合里时,它的标记就是从a 到z 的最短通路的长度。
下面,我们用数学归纳法来证明这个算法的正确性。
基础步骤:在第零次迭代,即k = 0 时,S = {a},所以从a 到除a 外的顶点的最短通路的长度是∞,而从a 到a 本身的最短长度为0(这里允许一个通路不包含任何边在内)。因此基本情况是正确的。
归纳步骤:用下列断言做归纳假设:在第k 次迭代中
- 在S 中的顶点v (v ≠ 0)的标记是从a 到这个顶点的最短通路的长度。
- 不在S中的顶点的标记是(除了这个顶点自身之外)只包含S 中顶点的从a 到这个顶点的最短通路的长度。
假定归纳假设对k 次迭代成立。令v 是在第k+1 次迭代中添加到S 中的顶点,使得v 是在第k 次迭代结束时带最小标记的不在S 中的顶点(如果该顶点不唯一,可以采用带最小标记的任意顶点)。根据归纳假设,可以看出在第k+1 次迭代之前,S 中的顶点都用从a 出发的最短通路的长度来标记。另外,必须用从a 到v 的最短通路的长度来标记v。假如情况不是这样,那么在第k 次迭代结束时,就可能存在包含不在S 中的顶点的长度小于Lk(v) 的通路(因为Lk(v) 是在第k 次迭代之后,只包含S 中顶点的从a 到v 的最短通路的长度)。设u 是在这样的通路里不属于S 的第一个顶点。则存在一条从a 到u 的只包含S 中顶点的长度小于Lk(v) 的通路。这与对v 的选择矛盾。因此,在第k+1 次迭代结束时1 成立。设u 是在第k+1 次迭代之后不属于S 的一个顶点。从a 到u 的只包含S 里顶点的最短通路要么包含v,要么不包含v。若它不包含v,根据归纳假设,它的长度是Lk(u)。若它确实包含v,则它必然是这样组成的:一条边从a 到v 的具有最短可能长度的通路,其中包含S 中不同于v 的元素,后面接着从v 到u 的边。在这种情况中它的长度是Lk(v) + w(v, u)。这样就证明了2 成立,因为Lk+1(u) = min{Lk(u), Lk(v)+w(v, u)}。
根据数学归纳法原理,我们证明了迪克斯屈拉算法的正确性。
学习算法的过程中,我们常常考察算法的时间复杂度并依此衡量算法的优劣。因此一个很自然的问题就是:迪克斯屈拉算法的时间复杂度是多少?
因为有n 个顶点,所以算法最多使用n-1 次迭代,因为每次迭代添加一个顶点到特殊顶点集合里。而在每个迭代的过程中,可以用不超过n-1 次比较来找出不在S 中的带最小标记的顶点。而每次迭代里要更新的标记也不超过n-1 个。因此每次迭代使用不超过2(n-1) 次运算,粗略估计上界的话,可以得到O(n^2) 是其最坏时间复杂度。严格点的话,可以算一下:
∑(i~1,n)n-i + ∑(i~1,n)2(n-i-1) = (3n^2)/2 - 9n/2。
(完)
Dijkstar算法的数学原理的更多相关文章
- PCA主成分分析算法的数学原理推导
PCA(Principal Component Analysis)主成分分析法的数学原理推导1.主成分分析法PCA的特点与作用如下:(1)是一种非监督学习的机器学习算法(2)主要用于数据的降维(3)通 ...
- 机器学习 - 算法 - Xgboost 数学原理推导
工作原理 基于集成算法的多个树累加, 可以理解为是弱分类器的提升模型 公式表达 基本公式 目标函数 目标函数这里加入了损失函数计算 这里的公式是用的均方误差方式来计算 最优函数解 要对所有的样本的损失 ...
- [杂记]对RSA算法的数学原理的一点思考
- SVM数学原理推导
//2019.08.17 #支撑向量机SVM(Support Vector Machine)1.支撑向量机SVM是一种非常重要和广泛的机器学习算法,它的算法出发点是尽可能找到最优的决策边界,使得模型的 ...
- DH算法图解+数学证明
前几天和同事讨论IKE密钥交换流程时,提到了Diffie-Hellman交换.DH算法最主要的作用便是在不安全的网络上成功公共密钥(并未传输真实密钥).但由于对于DH算法的数学原理则不清楚,因此私下对 ...
- 非对称加密技术- RSA算法数学原理分析
非对称加密技术,在现在网络中,有非常广泛应用.加密技术更是数字货币的基础. 所谓非对称,就是指该算法需要一对密钥,使用其中一个(公钥)加密,则需要用另一个(私钥)才能解密. 但是对于其原理大部分同学应 ...
- BP神经网络的数学原理及其算法实现
什么是BP网络 BP网络的数学原理 BP网络算法实现 转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/44514073 上一篇 ...
- PCA算法数学原理及实现
数学原理参考:https://blog.csdn.net/aiaiai010101/article/details/72744713 实现过程参考:https://www.cnblogs.com/ec ...
- RSA加密数学原理
RSA加密数学原理 */--> *///--> *///--> UP | HOME RSA加密数学原理 Table of Contents 1 引言 2 RSA加密解密过程 2.1 ...
随机推荐
- 【BZOJ】1108: [POI2007]天然气管道Gaz
题意 \(n\)个黑点\(n\)个白点(\(2 \le n \le 50000\)),需要一一配对,使得白点在黑点的右下角,且曼哈顿距离和最小.题目保证有解. 分析 考虑最优解,我们可以交换任意一个配 ...
- ThinkPhp循环出数据库中的内容并输出到模板
<foreach name='user' item='v'> //循环出数据库中的内容 对应控制器->方法中的 $this->assign('user',M('user')- ...
- POJ 1564 经典dfs
1.POJ 1564 Sum It Up 2.总结: 题意:在n个数里输出所有相加为t的情况. #include<iostream> #include<cstring> #in ...
- __attribute__ 变量对齐
http://blog.163.com/sunm_lin/blog/static/9192142200741533038695/ 一. __attribute__ ((aligned (n))) ...
- Infragistics公司的UltraWebGrid控件在显示的时候报“theForm” 未定义错误的解决。
在项目中使用了Infragistics公司的UltraWebGrid控件,浏览器中报错,“theForm” 未定义,并且造成客户端js,滚动条,失效.最后查官网论坛找到问题.需要把web.config ...
- lua日期与时间操作
os.date("%Y%m%d%H%M%S", os.time()) <== 20160405141211 yyyyMMddHHmmss os.time() ...
- Spark RDD Operations(2)
处理数据类型为Value型的Transformation算子可以根据RDD变换算子的输入分区与输出分区关系分为以下几种类型. 1)输入分区与输出分区一对一型. 2)输入分区与输出分区多对一型. 3)输 ...
- unity3d插件Daikon Forge GUI 中文教程1-Daikon Forge介绍
DF-GUI特点: · 深编辑器集成:DF-GUI提供广泛的整合与Unity3D编辑环境,包括自定义检查人员对每个组件向导来简化复杂的多步任务,提高生产力的上下文菜单,编辑控件在一个所见 ...
- PHP执行系统命令
<?phpexec("ping www.baidu.com -n 1",$output,$status);var_dump($output);var_dump($status ...
- css - float浮动模块的高度问题 解决方案
当一个Div中的子元素都是浮动元素时,该div是没有高度的.通常会带来很多困扰,解决方案如下: 低版本统配兼容: overflow: hidden; 下面是不支持低配浏览器,而且似乎该效果对 P 标签 ...