Dijkstra演算法正確性證明

2022-06-05 20:36:06 字數 2128 閱讀 6380

問題:求圖中點1到其他各點的最短距離

演算法描述:

設初始時圖的所有點的集合u

把起點s放入初始集合set中

u=u-

set=set+

找s經過集合set中的點,能達到的距離最短的點k(k\(\in\)u),將k併入set

言外之意k的前乙個點必然屬於set

u=u-

set=set+

由於每次引入的只有乙個點k,所以只需要基於k對s到達所有點的距離進行更新,之前的點無需考慮

演算法正確性證明:

1. 變數的命名:

set=

記錄已求出最短路徑的頂點

dist[u]

從start點開始,經過set中的點,到u點(u\(\in\)u)的最短距離

short[u]

從start開始到u的全域性最短路徑(路徑中可能有部分點\(\notin\)set)

可知 \(short[u]\leq dist[u]\)

u

所有點除去set中的點組成的集合

2. 證明過程:(貪心正確性的證明)需要證明的命題:演算法進行到第k步時,set中的任意乙個節點set_i的dist[set_i]等於全域性最短路徑short[set_i](第n步時,dist[n]=short[n],此時找到點1到所有點的最短距離)

歸納基礎:

k=1,set= => dist[start_point] == short[start_point] ==0,命題正確

歸納假設:

假設第k步成立,現在來證明第k+1步成立

第k步成立的作用在於s到set中的所有節點(設某節點為k)有dist[k]=short[k]

所以對於引入的第k+1個點v,s->v序列中set中的點一定是連續的(如下圖。因為s->v中的set的最後乙個點u之前的所有點必然都屬於set)

設k+1步選擇了頂點v(v是s經過set所能到達的u中距離最近的點)

則頂點v必然與set中的u點直接相連, 也就是說上圖中非set中的點集為空集

證明如下:

假設藍色部分「非set中的點」所組成的集合不為空,也就是s到v的最短路徑是先有一部分set中的點,再由一部分u中的點組成,那麼

short[v]:s->...->u->...->y->...->v

如下圖

因為之前論證過s->u(u代表set集合中的最後乙個點)過程中所有的點均屬於set,所以有:

s->...->u1->v

s->...->u2->y->v

易知length(s->...->u1->v)\(\leq\)length(s->...->u2->y)

v是s經由set所能達到的距離最小點

又length(y->v)$\geq$0

所以不存在這樣的y,s到v的最短路徑上v的前乙個節點必然為set中的點

從而也就論證了迪傑斯特拉演算法的正確性

Dijkstra演算法正確性證明

問題 求圖中點1到其他各點的最短距離 策略 1.把起點1放入初始集合set中,從剩餘的點中,選取到set 此時set中只有1個點 距離最近的點,併入集合set中,2.從剩餘的點中,找經過集合set,到起點1的最短距離,將最短邊併入set集合 3.依次迴圈,直到所有的邊都併入set 變數的命名 set...

貪心演算法正確性證明

貪心演算法正確性證明 wiki定義 貪心演算法 英語 greedy algorithm 又稱貪婪演算法,是一種在每一步選擇中都採取在當前狀態下最好或最優 即最有利 的選擇,從而希望導致結果是最好或最優的演算法。比如在旅行推銷員問題中,如果旅行員每次都選擇最近的城市,那這就是一種貪心演算法。用大白話說...

Kruskal演算法的正確性證明

1 演算法說明 輸入圖g v,e,w v 輸出圖g的最小生成樹t 設計思想 按照長度從小到大對邊排序 依次考察當前最短邊e,如果e與t的邊不構成迴路,則把e加入樹t,否則跳過e直到選擇了n 1條邊為止。2 證明思路 命題 對於任意n,演算法對n階圖找到一棵最小生成樹 歸納基礎 證明n 2時演算法正確...