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 次迭代中

  1. 在S 中的顶点v (v ≠ 0)的标记是从a 到这个顶点的最短通路的长度。
  2. 不在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算法的数学原理的更多相关文章

  1. PCA主成分分析算法的数学原理推导

    PCA(Principal Component Analysis)主成分分析法的数学原理推导1.主成分分析法PCA的特点与作用如下:(1)是一种非监督学习的机器学习算法(2)主要用于数据的降维(3)通 ...

  2. 机器学习 - 算法 - Xgboost 数学原理推导

    工作原理 基于集成算法的多个树累加, 可以理解为是弱分类器的提升模型 公式表达 基本公式 目标函数 目标函数这里加入了损失函数计算 这里的公式是用的均方误差方式来计算 最优函数解 要对所有的样本的损失 ...

  3. [杂记]对RSA算法的数学原理的一点思考

  4. SVM数学原理推导

    //2019.08.17 #支撑向量机SVM(Support Vector Machine)1.支撑向量机SVM是一种非常重要和广泛的机器学习算法,它的算法出发点是尽可能找到最优的决策边界,使得模型的 ...

  5. DH算法图解+数学证明

    前几天和同事讨论IKE密钥交换流程时,提到了Diffie-Hellman交换.DH算法最主要的作用便是在不安全的网络上成功公共密钥(并未传输真实密钥).但由于对于DH算法的数学原理则不清楚,因此私下对 ...

  6. 非对称加密技术- RSA算法数学原理分析

    非对称加密技术,在现在网络中,有非常广泛应用.加密技术更是数字货币的基础. 所谓非对称,就是指该算法需要一对密钥,使用其中一个(公钥)加密,则需要用另一个(私钥)才能解密. 但是对于其原理大部分同学应 ...

  7. BP神经网络的数学原理及其算法实现

    什么是BP网络 BP网络的数学原理 BP网络算法实现 转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/44514073  上一篇 ...

  8. PCA算法数学原理及实现

    数学原理参考:https://blog.csdn.net/aiaiai010101/article/details/72744713 实现过程参考:https://www.cnblogs.com/ec ...

  9. RSA加密数学原理

    RSA加密数学原理 */--> *///--> *///--> UP | HOME RSA加密数学原理 Table of Contents 1 引言 2 RSA加密解密过程 2.1 ...

随机推荐

  1. Oracle 字符串函数

    平常我们用Oracle主要有两种字符串类型1.char始终为固定的长度,如果设置了长度小于char列的值,则Oracle会自动用空格填充的.当比较char时,Oracle用空格将其填充为等长,再进行比 ...

  2. 在eclipse程序中设置的断点上有一个斜杠,正常启动debug不能够跳转到debug页面,怎么解决

    在run菜单里面,把skip all breakpoints 选项勾去即可,这个选项可能是你无意间选上的.

  3. About_AJAX_02

    学习AJAX基础: 首先要:掌握AJAX技术.掌握AJAX开发步骤.掌握采用AJAX进行实例开发 AJAX应用到的技术: AJAX(Asynchronous JavaScript And XML)涉及 ...

  4. About-PHP-02

    如果要给table里面的td添加颜色,有两种方法: <html> <head> <meta http-equiv="Content-Type" con ...

  5. 如何通过js和jquery获取图片真实的宽度和高度

    什么时候需要获取图片真实的宽度和高度 在做pc网页的时候,有时候会考虑按照插入的图片的尺寸来判断图片是横图还是竖图.然后判断过后给予不同的展示方式! 另外一种就是在手机页面上,在新闻页插入的图片往往都 ...

  6. js实现事件模型bind与trigger

    function Emitter() { this._listener = [];//_listener[自定义的事件名] = [所用执行的匿名函数1, 所用执行的匿名函数2] } //注册事件 Em ...

  7. HTML5 Input 类型

    浏览器支持 Input type IE Firefox Opera Chrome Safari email No 4.0 9.0 10.0 No url No 4.0 9.0 10.0 No numb ...

  8. 状态压缩 DP

    D - Hie with the Pie Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:65536 ...

  9. 导入excle数据将excle数据插入到数据库

    实现功能是,用户可以直接导入对应数据,或者用户下载模板,填写数据,导入模板数据.easyui实现 前台页面 { text : '日清导入', iconCls : 'icon-print', handl ...

  10. Android中layout_gravity和gravity的区别

    安卓中的 layout_gravity 属性和 gravity属性 有啥区别? LinearLayout有两个非常相似的属性: android:gravity与android:layout_gravi ...