按:今天看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演算法的另一種證明
按 今天看tanenbaum的計算機網路時講到了dijkstra演算法。關於演算法的正確性,演算法導論 給出了嚴格的證明。clrs的證明基於乙個通用的框架,非常清晰。今天只是隨意想想是否有其他證明的方式,結果發現是有的。雖然這種證明方法可能早已有人用過,不算新鮮。不過自己想了一通就把它放到這裡純粹博...
另一種尊重
上中學的時候,有一節課印象非常深刻。老師問我們如果無意闖入乙個房間,發現房間裡有一位女士正在洗澡,這時應該怎麼辦?有同學回答就當什麼也沒看見,退出房間。還有同學回答 說聲對不起!女士。然後退出去。老師笑了笑說,還有更好的答案,那就是 對不起,先生!有一對結婚多年的夫妻,有一次出差在外的妻子有一件急事...
另一種勝利
另一種勝利 written by allen lee 剛才我的扣殺,出界了5.3厘公尺。雖然很可惜,但還是出界了,請確認下吧。幹 真是的,那些任性的傢伙!但是,到最後還只顧自己網球原則的正直笨蛋,和一定要用迴旋蛇標打中單人區的笨蛋,給我們看了場好比賽啊。龍崎 海棠和幹他們雖然輸了這場比賽,但他們堅持...