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