問題:求圖中點1到其他各點的最短距離
演算法描述:
設初始時圖的所有點的集合u
把起點s放入初始集合set中
u=u-
set=set+
找s經過集合set中的點,能達到的距離最短的點k(k\(\in\)u),將k併入set
言外之意k的前乙個點必然屬於setu=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(v是s經過set所能到達的u中距離最近的點)所以對於引入的第k+1個點v,s->v序列中set中的點一定是連續的(如下圖。因為s->v中的set的最後乙個點u之前的所有點必然都屬於set)
則頂點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時演算法正確...