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中取出的店的權值為最優這個性質,故算法的正確性得證。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM