Dijkstra算法的另一种证明
按:今天看Tanenbaum的計算機網絡時講到了Dijkstra算法。關于算法的正確性,《算法導論》給出了嚴格的證明。CLRS的證明基于一個通用的框架,非常清晰。今天只是隨意想想是否有其他證明的方式,結果發現是有的。雖然這種證明方法可能早已有人用過,不算新鮮。不過自己想了一通就把它放到這里純粹博大家一樂,我盡量寫的簡潔。
首先敘述下算法:
算法維護兩個集合,S(已找到從源點v開始的最短路徑的點)和Q(未找到從v開始的最短路徑的點)。
算法初始時S為空集;Q中,從v到v本身的最短路徑的權值為0,其他點均為正無窮。
在算法的每次迭代中,從Q中選擇一個權值最小的點u,這個權值即為從v到u的最短路徑,并且放入S。同時,遍歷u的每個鄰接點x,如果從v到u的最短路徑加上從u到x的邊的權值小于Q中記錄的x的權值,則更新x的權值。
(由于實在懶得輸入數學公式,哪些說的不清楚的地方還請參考CLRS。)
算法每次迭代找到一個點的最短路徑直到S=V、Q為空。
?
證明:
使用數學歸納法,假設在某次迭代(不是第一次迭代)之前,S中的點的權值都是最短路徑,我們證明某次迭代之后從Q中取出的點的權值依然是這個點的最短路徑。
利用反正,假設本次迭代從Q中取出的點u的權值不是最短的,那么存在一條從v到u的路徑小于這個權值。可知這條路徑上u的前趨一定有一個屬于S(因為至少v是屬于S的),假設屬于S的第一個前趨為x,而這條路徑上x的后繼為y。由算法的性質可知,這條路徑從v到y的權值一定是不小于從Q中取出的u的權值的,那么可知剛剛找到的這條從v到u的路徑權值也不小于從Q中取出的u的權值。這與假設矛盾。故u的權值是最短的。
而算法第一次迭代也滿足從Q中取出的店的權值為最優這個性質,故算法的正確性得證。
?
總結
以上是生活随笔為你收集整理的Dijkstra算法的另一种证明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HttpURLConnection及Ht
- 下一篇: 大型系统OA--技术