迪杰斯特拉算法(Dijkstra)证明
首先,這篇文章是在講《圖論》時候寫文章
(所以,還是以理論為主,以后有空的時候,會把代碼發上來,不過我覺得大家看完理論,如果講得好,代碼也就比較容易了。如果講得不好,網上的代碼也是大把,不看這篇文章也罷了)
任務目標:
給個起點S,找到圖中每個點距離起點S的最小距離(考慮聯通性的問題)。
算法思路概述
先選第一個距離S最近的點。之后,更新其他圖中的點到S的距離。更新原因:新增加的最近點可以作為一個橋。
- 輸入是:點之間的距離矩陣。
- 維護是:上面矩陣中的某一行
下圖為老師的課件內容部分,我覺得雖然詳盡,但也有些枯燥。可能是為了凝練語言吧。如果有耐心看的話,倒真的是一篇非常好的文章。
我在后面會用自己的語言闡述,可能會比較清晰(但廢話可能也比較多)。
其中前面的黃色部分是我自己標注的(老師寫的),后面的黃色部分是我自己寫的。
闡述
這里面,有很多的問題,乍一看都是有點合情合理,但是卻讓人一下子想不明白的。
歸結到一條,就是,為什么這樣子,就能保證一定會是得到了所有的點,到這個點v0v0v0的最短距離呢?
證明(不嚴格的證明)
證明(較為嚴格的證明)
通過歸納法
(1) i=0i = 0i=0
首先,還是一樣,根據上面的方式,來依次產生出這些點。這是一個序列,稱其為V=v0,v1,v2,....,vnV= {v0, v1, v2, ....,vn}V=v0,v1,v2,....,vn這n個點。vivivi對應的距離就是dididi。
(2) 設i<=ki <= ki<=k時成立,下面看 i=k+1i = k + 1i=k+1的情況
vivivi通過上述方法生成的點,所得到的到v0v0v0的距離不是最近的,也就是說,還存在一條路,使得vivivi到v0v0v0的距離小于dididi。
由于,dididi的產生方法,我們可以知道,這樣的點,必定通過了后面的點(vi>=k+2v_{i >= k + 2}vi>=k+2?)。但是,我們同樣知道vi>=k+2v_{i >= k + 2}vi>=k+2?到v0v0v0的距離一定是會大于vi<=kv_{i <= k }vi<=k?的。(遞增的特點)。所以,只要是通過了后面的點,到達v0v0v0的距離,一定是大于等于,我們只通過前面的點vi<=kv_{i <= k }vi<=k?到達所致的。但是,這與我們之前的假設有矛盾。這樣我們就知道了, i=k+1i = k + 1i=k+1時候也是成立的!
綜上所述…
總結
以上是生活随笔為你收集整理的迪杰斯特拉算法(Dijkstra)证明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cisco Packet Tracer
- 下一篇: 查看网页服务器搭建方式(Python3)