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. OI刷题记录

    从六月一号开始记录啦 6月1日 link-cut-tree BZOJ2631 tree                                     

  2. java画图程序_图片用字母画出来_源码发布_版本二

    在上一个版本:java画图程序_图片用字母画出来_源码发布 基础上,增加了图片同比例缩放,使得大像素图片可以很好地显示画在Notepad++中. 项目结构: 运行效果1: 原图:http://imag ...

  3. Erlang及Rabbitmq安装

    1. 下载erlang源代码及RabbitMQ rpm安装包      $ wget http://www.erlang.org/download/otp_src_R16B02.tar.gz $ wg ...

  4. Equivalent Strings

    Equivalent Strings 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=84562#problem/E 题意: 给出 ...

  5. 《深入.NET平台和C# 编程》内测纠错记录

    1.  .NET框架的核心组件包括(BD)(选择两项) A.CTS   (通用类型系统) B.CLR   (公共语言运行时,.NET的基础) C.CLS   (公共语言规范) D.FCL   (框架类 ...

  6. 拿到添加对象的id号方法

    以前Hibernate添加对象,想拿到id号的时候都是根据id排序拿到第一条 ,才知道 这样也可以 /**         * @Description: 添加一个角色信息        * @ret ...

  7. python中的进程、线程(threading、multiprocessing、Queue、subprocess)

    Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...

  8. SBT Assembly - Deduplicate error & Exclude error

    sbt assembly java.lang.RuntimeException: deduplicate: different file contents found in the following ...

  9. 关于Jquery获取Table中td内的内容

    $(this).children().eq(1).text()获取的是显示的值$(this).children().eq(1).html()获取的是<td></td>之间的所有 ...

  10. HDU3732 背包DP

    Ahui Writes Word Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...