Dijkestra演算法的理解與相應的優化

2021-07-09 22:57:37 字數 534 閱讀 9198

dijkestra演算法是由乙個叫dijkestra的人發明的最短路徑演算法,是一種單源多點的最短路徑演算法,時間複雜度僅為o(n^2),並且非常高效,甚至可以優化成o(nlog2n),並且理解了之後就非常簡單易懂。

其實幾乎所有的最短路徑演算法理解了之後都覺得像bfs,而dijkestra也不例外。這個演算法的具體步驟是這樣的:

1.將所有點到源點的最短距離全部設為inf,即正無窮大,並將源點到自己的距離設為0

2.選一條目前離原點最近的路徑,並將這條路徑中的目前終點的臨近點的距離予以更新

(時間複雜度o(n))

3.如果目前還有路徑可以有臨近點更新,則將第2步繼續

(最多執行n遍)

說實話,我看了之後感覺就好像是加了優先佇列的廣搜,但是同時也用了一些貪心的思想。。所以,這就不難看出,為什麼會有o(nlog2n)的演算法了:用了堆。因此**的具體實現就是廣搜的佇列換為以到原點的最短路徑為比較優先順序的優先佇列,可以用stl的priority_queue,也可以自己手寫堆,效率是可以超過spfa的(但是是在大資料,不過其實不是大資料好像也不用這樣的東西)。

kmp演算法的理解與實現

kmp演算法曾被我戲稱為看毛片演算法,當時笑噴.大三那個時候硬著頭皮把演算法導論的kmp演算法啃完,弄懂了kmp演算法 的原理,甚至還寫出了 這幾天再次溫習的時候,發現忘得比較徹底。我總結,學演算法不能只對著書本學理論,而應該 用自己的理解去看清演算法的本質,最好用文字把你的理解記錄下來,這樣才能做...

對與遞迴演算法的理解

如上圖,當呼叫digui這個函式時,如果有返回型別,那麼返回的結果是digui 3,的結果,在這裡下面加列印語句是為了看清回溯的過程,當呼叫函式時,因為不符合if條件,所以執行else,else語句中呼叫本身,這就是說,當想求digui n 3,時先求digui n2,直到n1時執行了if語句,這時...

演算法學習 遞迴演算法的理解與舉例

原文 遞迴 你開啟面前這扇門,看到屋裡面還有一扇門。你走過去,發現手中的鑰匙還可以開啟它,你推開門,發現裡面還有一扇門,你繼續開啟它。若干次之後,你開啟面前的門後,發現只有一間屋子,沒有門了。然後,你開始原路返回,每走回一間屋子,你數一次,走到入口的時候,你可以回答出你到底用這你把鑰匙開啟了幾扇門 ...