Dijkstra演算法的思想和數學歸納法

2021-08-25 01:27:17 字數 1595 閱讀 8513

數學歸納法是一種藝術,玩過多公尺諾骨牌的都知道,要使得任意數量的所有牌全部翻掉需要兩個條件而且只需要兩個條件,乙個就是任意兩張牌間隔足夠近,另乙個條件就是你必須推到第一張牌,就是這麼簡單。於是如果你往這個遊戲靠攏你會發現,牌的倒掉和牌的數量以及牌上的內容沒有任何關係,那麼任何可以歸結到這個遊戲的數學模型都可以用這個原理進行求解,多公尺諾骨牌遊戲的數學模型就是數學歸納法,數學歸納法進行的證明需要兩點,第一就是初始條件(推到第一張牌),第二就是假設n成立證明n+1成立(兩張牌間隔足夠近),貪心演算法是乙個步驟問題,如果我們可以證明貪心演算法的第一部很顯然正確並且在歸納假設的情況下證明歸納假設的系乙個步驟也正確的話,那麼貪心演算法的區域性最優解結合成的全域性解一定是全域性最優解,這是一定的。

dijkstra演算法是乙個貪心演算法,那麼我們可以通過數學歸納法證明其正確性,關鍵就是如何建立數學模型。dijkstra演算法的步驟是顯然的,是簡單的,我們只需要證明這個演算法產生的路徑就是最短的就可以了,於是模型就有了,很多書上都用open-set作為「外面」的點,將close-set作為加入到「裡面」的點,那麼我們就證明每通過dijkstra演算法加入到close-set的點到原點的距離就是到原點距離的最短距離,這樣我們就證明了演算法本身的正確性,因此開始用數學歸納法證明吧,當close-set中除了原點只有乙個點的時候,這個點p離原點s的距離一定是最短的,因為如果s先到x再到p的距離比s直接到p還短,那麼s到x會更短,演算法就不會選中p而會選中x,與假設矛盾,這裡已經證明了初始條件,下面開始歸納假設,設close-set中有k個點時,所有close-set中的k個點根據演算法算出的距離都是最短的距離,那麼我們考慮加入第k+1個點加入時的情形,只要能證明k+1個點按照演算法加入進close-set從而算出的距離也是最短距離的話,那麼問題得證,這個問題也是很好證明的,同樣用反證法,假設不是靠演算法加入的,那麼路徑中一定除了終點p之外還有乙個點在open-set中,如果這樣的話,根本就不可選中終點p而會選中那個經過的點,也是矛盾的,由此問題得證。在上面額證明中,所有在close-set中和p相連的點都會參與最後的最短距離競爭,因此就在它們當中選一條路徑最為結果就是問題的答案,而這正是演算法的行為。

這裡可以看到有時候貪心演算法可以用數學歸納法來證明,但是有的時候不能,不能的原因就在於約束條件太多,要麼就是因為初始條件無法被證明但是歸納假設卻正確,其實千萬不要過度懷疑貪心演算法,我們人做事的時候不是也都是在用貪心演算法嗎?如果有誰在做事之前來個全域性證明或者必須證明其嚴密性的話,那麼這個人最終會因為理智過度要麼被社會淘汰,要麼成為劃時代的思想家。貪心演算法來自於乙個事實,那就是**,**波的包絡面總是呈球面向外擴撒,球面剛接觸到乙個點的時候,這個點到**源的距離肯定最短,這不是廢話嗎?這個點到**源的連線不是一條線段嗎?很多的時候是一條線段,但是考慮到**不是在乙個密度相同的沒有障礙物的地方,而是在乙個建築物裡面,該建築物內部有複雜的小隔間,而且各個隔間相通,隔間之間是堅固的鋼板隔開,**無法摧毀這些隔板,那麼**波的包絡面雖然是球面,但是實際路線卻不是線段,而是沿著各個隔間之間的通道走的,這個時候首先被波及的點沿著**波的路線回到**點,路線肯定是最短的,這是事實啊,好事怎麼也波及不到我們,壞事總是用最快的是速度到來。

有時候覺得人做事很多時候挺像計算機的,用了很多的演算法,按經驗步驟進行,不求甚解,而我們從小學開始學的那些數學,比如解方程,函式求導之類的卻是純思維的東西,這些一般來用發掘新的演算法,人的演算法還來自於經驗,但是到底哪個更重要呢?

Dijkstra演算法的實現

dijkstra演算法的實現 讀入 dijkstratxt 中的部分網路資料 test.txt 弧段起點id,弧段終點id,弧段距離 用dijkstra演算法生成的最佳路徑再寫入 routetxt.txt 檔案中 include include include include using names...

Dijkstra演算法的實現

最近自學了dijkstra演算法,跟著自己的理解寫了個 想加深對dijkstra演算法的理解,如有不足,還請多多指教。首先,dijkstra演算法主要是適用於找兩點之間的最小權值之和。思路 開始的時候,假設有兩個集合 分別為a,b集合 a集合為空 用來存放使用過的點 b集合存放著圖中的各點 當然,在...

演算法 Dijkstra演算法筆記

參考文章 隨記參考邏輯 dijkstra演算法採用的是一種貪心的策略。演算法的基本思想是 通過不斷更新的距離陣列,每次從距離陣列找到離源點最近的乙個且沒有掃瞄過的節點,然後以該頂點為中心進行bfs擴充套件,直到所有節點都掃瞄一遍,最終得到源點到其餘所有點的最短路徑 1 起點固定,若要記錄到達路徑,則...