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