Dijkstra算法正确性证明
問題:求圖中點1到其他各點的最短距離
策略:
?
變量的命名:
Set={1,2,,,,,,x}? ? ? //已找到start(本例中是1點)到1,2,,,,,x的最短路徑的點的集合Set
dist[u]:? ? ? ? ? ? ?//從start點開始,經過Set中的點,到u點的最短距離
short[u]:? ? ? ? ? ? ?//從start開始到u的全局最短路徑(不一定經過Set中的點)
可知short[u] <= dist[u]
?
證明過程:
命題:算法進行到第k步時,Set中的每個節點Set_i的dist[Set_i]等于全局最短路徑short[Set_i]
(第n步時,dist[n]=short[n],此時找到點1到所有點的最短距離)
?
歸納基礎:
k=1,Set={start_point} => dist[start_point] == short[start_point] ==0,命題正確
歸納假設:
第k步成立,則第k+1步成立
設k+1步選擇了頂點v(v是剩余集合中,經過Set到start_point距離最近的點)
該頂點與Set中的u點相連, 想要證明dist[v] == short[v]
反證法:假設命題不正確,即:存在從起點start_point到點v的更短路徑 L(綠色部分)為最短路徑short[v],
該路徑經過集合中的最后一個點為last_point,經過未收錄集合的點集 uncollected_point_set中的,任1個或者多個點到達v.
本例以單點y為例,多點同理:(v和last_point不可能直接相連,若直接相連,因為dist[v]最后一點經過u,且為最短,此時L必然>=dist[v],不是更短路徑)
此時 L == dist[y] + distance[y, v] ==?short[v]
由題意知,dist[v] <= dist[y] (即:文章開頭的每次從剩余集合中找到距離最短的點)
=>? ?dist[v] <= L ?==?short[v]
dist[v]是相對于L更短的路徑=>假設不成立,不存在更短的路徑L為全局最短路徑,第k+1步選擇的點即為全局最短路 => 命題成立!
?
參考鏈接
1.? Proof of Dijkstra algorithm
總結
以上是生活随笔為你收集整理的Dijkstra算法正确性证明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: zcmu 1603 卡斯丁狗的战舰帝国(
- 下一篇: NIST 网络安全框架导读