算法之「迪傑斯特拉(Dijkstra)算法」

2021-02-13 清塵閒聊
最短路徑

生活中,我們常常會面臨著對路徑的最優選擇問題,可能是路程最短,也可能是時間最短,這個的最短路徑就類似路程最短的選擇。

比如在上海,乘地鐵去某個地方,上海的地鐵路線很多,從地圖上看上去就是一個網。去某個地方就會有多條路線的選擇,我們一般就會選最短那條路線。當然,在現實生活中,還會考慮時間、換乘等因素,這裡只是舉個例子說什麼是最短路徑。

地鐵換乘貌似一眼就可以看出來那條路線是最優的路線。但是在一些複雜的情況下,人眼就很難確定最優路線來,比如送外賣、自駕車等。人眼就很難做出最優選擇,因為路況等因素,根本沒法判斷。這時就需要用算法來選擇最佳路線了。這也是這篇文章的主角:迪傑斯特拉(Dijkstra)算法。

迪傑斯特拉算法

迪傑斯特拉(Dijkstra,又譯戴克斯特拉)算法由荷蘭計算機科學家艾茲赫爾·迪傑斯特拉在1956年提出。使用了廣度優先搜索解決帶權有向圖的單源最短路徑問題。通過一個頂點作為源節點然後找到該頂點到圖中所有其它節點的最短路徑,產生一個最短路徑樹。

迪傑斯特拉算法步驟

1.標記所選的初始頂點,當前距離為 0,其餘頂點設為無窮大。
2.將具有最小當前距離的非訪問頂點設置為當前頂點 C。
3.對於當前頂點 C 的每個鄰居頂點 N:將當前距離 C 與連接 C—N 的邊緣的權重相加。 如果它小於頂點 N 的當前距離,則將其設置為 N 的新當前距離。
4.將當前頂點 C 標記為已訪問。
5.如果有非訪問頂點,重複步驟2,直到所有頂點均訪問。


迪傑斯特拉算法時間複雜度

假如我們有 V 表示圖中的頂點個數,E 表示圖中的邊個數。

如果用一個鍊表或者數組來存儲所有頂點的集合,要找到最短路徑算法所需的運行時間是 。

如果用鄰接表 + 二叉堆來用作優先隊列來查找最小的頂點,那麼算法所需的時間為


如果用鄰接表 + 斐波納契堆能稍微提高一些性能,讓算法運行時間達到 


迪傑斯特拉算法示例

Dijkstra的算法是用來計算一個頂點(起始點)與圖中每個其他頂點之間的最短路徑。

搜索頂點 C 和圖中其他頂點之間的最短路徑。

首先我們需要初始化數據,選擇頂點 C 為初始頂點,當前距離為 0,對於其餘頂點,由於我們不知道最小距離,因此它開始為無窮大。

現在與 C 相鄰的頂點為 A、B、D,因為沒有特定的順序,我們選擇從 A 開始。由於 C 到 A 的權值為 1,當前頂點的最小距離加 C—A 的權值小於默認的無窮大,所以 C—A 的最小距離為 0+1=1。

由於 C 到 B 的權值為 7,當前頂點的最小距離加 C—B 的權值小於默認的無窮大,所以 C—B 的最小距離為 0+7=7。

由於 C 到 D 的權值為 2,當前頂點的最小距離加 C—D 的權值小於默認的無窮大,所以 C—D 的最小距離為 0+2=2。
此時 C—A 的最短距離為 1。
C—B 的最短距離為 7。
C—D 的最短距離為 2。

選取下一個當前頂點為 A,由於 A 到 B 的權值為 3,當前頂點的最小距離加 A—B 的權值小於 7,所以 C—B 的最小距離為 1+3=4。
當前的最短路徑分別為 C—A、C—A—B、C—D。

選取下一個當前頂點為 D,由於 D 到 E 的權值為 7,當前頂點的最小距離加 D—E 的權值小於無限大,所以 C—E 的最小距離為 2+7=9。
此時 D—B 的權值為 5,C—B 的最小距離為 2+5=7,大於當前的最小距離,因此不用更新 C—B 的距離。
當前的最短路徑分別為 C—A、C—A—B、C—D、C—D—E。

選取下一個當前頂點為 B,由於 B 到 E 的權值為 1,當前頂點的最小距離加 B—E 的權值小於 9,所以 C—E 的最小距離為 4+1=5。現在更新C—E 的最短距離為 5,所有頂點都以標記完成。

最後,最短距離分別為 C—A=1,C—B=4,C—D=2,C—E=5。
最短路徑分別為 C—A、C—A—B、C—D、C—A—B—E。

總結

迪傑斯特拉(Dijkstra)算法使用了廣度優先搜索解決帶權有向圖的單源最短路徑問題。通過一個頂點作為源節點然後找到該頂點到圖中所有其它節點的最短路徑。

用一個鍊表或者數組來做存儲的數據結構時,時間複雜度為 。

但通過對存儲結構的優化,用二叉堆或者斐波納契堆來存儲時,效率上有一定的提升。

THE END

更多精彩內容在路上,歡迎「掃碼」訂閱

我走得很慢,但不會後退;一直在路上,用心寫未來。

相關焦點

  • SDN應用路由算法實現工具之Networkx
    最短路徑算法Dijkstra和Floyd計算單源到其他所有節點的最短路徑的Dijkstra算法和計算所有節點之間最短路徑的Floyd算法是最經典的網絡算法之一。在networkx中對於二者的實現將在如下介紹。
  • Libra 採用的 HotStuff 算法作者親述:「尤物」誕生記
    共識算法,而 LibraBFT 算法則是「HotStuff」的一個變種。 2018 年暑期期間,他在 VMware Research 實習時提出了「HotStuff」協議中核心算法,並完成了相關論文。 我們邀請 Ted Yin 撰文分享了他提出 「HotStuff」核心算法前前後後的經歷。
  • 用算法「種」出的草莓裡,藏著年輕人與農業的未來
    用數字種植服務小農 「還是低估了。」 工程師出身的程飈在兩個多月前,參加了「多多農研科技大賽」——一個高原草莓種植的「人機對戰」比賽,要求在 120 天的時間內,用 AI 算法遠程控制草莓的生長,最終綜合比拼草莓的產量、口感、成本等等。同時,有來自國內草莓大縣的頂尖農人作為對照組。 過程是出人意料的。
  • 「暴躁」帶貨主播在線吵架,實屬大數據算法支配下的情非得已
    換句話說,哪個主播能讓觀看的人更多,看的時間更長,互動更多,誰就能順著算法來到更多人面前。 這就是為什麼電商直播競爭白熱化之後「套路百出」的原因,用吸引眼球的元素讓觀眾停下,也是無奈之舉,誰不願意體面著把錢掙了。
  • 到底什麼是算法穩定幣?
    而Basis爆紅後,算法穩定幣板塊中快速出現了一系列「仿盤」,已有項目被懷疑開發團隊套現跑路,幣價跌至1美元下方後無人問津。算法穩定幣也呈現出硬幣的兩面,被喝彩和質疑裹挾。火爆表象之下,算法穩定幣能否登堂入室,還需繼續試驗才能得出結果。
  • 誰是靠算法挑戰華爾街的賭神?
    賭場的「21點」遊戲可以說在愛德華 · 索普的人生中佔據了十分重要的地位。之所以說他是個另類天才,是因為索普年輕時發表的論文《21點的常勝策略》(A Winning Strategy for BlackJack)的論文,從數學角度分析了 「21點」遊戲,證明了玩家可以憑藉自己的力量打敗莊家,收到了全美賭徒的追捧。
  • 算法有沒有價值觀?知乎內容推薦算法解析
    如「加V:xxxxxx」,是否需要包含「加V」。通常情況下,答案應該是不包含,因為我們的實體是微信號,「加 V」不屬於我們要識別的實體。  但是,我們在實驗過程中發現,如果不加前後綴,模型會把大量的英文單詞,或者字母數字組合,標記為導流內容。原因是,作為中文社區,英文單詞出現頻率很低,同時大部分導流信息都是字母數字組合,從而使得模型出現錯誤。
  • 機器學習算法之K-means算法
    K-means舉例shi'li1 K-means算法簡介k-means算法是一種聚類算法,所謂聚類,即根據相似性原則2 K-means算法原理k-means算法中的k代表類簇個數,means代表類簇內數據對象的均值(這種均值是一種對類簇中心的描述),因此,k-means算法又稱為k-均值算法。
  • 聽說你了解深度學習最常用的學習算法:Adam優化算法?
    Adam優化算法是隨機梯度下降算法的擴展式,近來其廣泛用於深度學習應用中,尤其是計算機視覺和自然語言處理等任務。本文分為兩部分,前一部分簡要介紹了Adam優化算法的特性和其在深度學習中的應用,後一部分從Adam優化算法的原論文出發,詳細解釋和推導了它的算法過程和更新規則。
  • 德州撲克講堂:高級技巧 勝率之攤牌勝率的算法
    行動勝率的算法。行動獲勝是德州撲克中唯二的獲勝方式,掌握了對手的棄牌率的話,就算手裡完全沒牌也可以輕鬆獲勝。然而具體打出對手穩定的棄牌則是一種高級技巧。對於初學玩家,推薦掌握好攤牌勝率的算法,穩當地用攤牌來獲勝。
  • 數據科學家應該了解的5個圖算法
    該連通分支算法基於BFS / DFS的特殊情況。我不會討論很多算法原理,但是會使用 Networkx 庫來編寫運行代碼。應用比如在零售領域:假如有很多具有大量帳戶的客戶,我們就可以使用連通分支算法的找出不同的家庭。
  • SEO算法:巴郎深談石榴算法與算法對策
    聲明:本文來自於微信公眾號 巴郎刊(ID:balangk),作者:B巴郎L,授權站長之家轉載發布。前言每一套SEO算法的出臺都是在提升用戶體驗,石榴算法就是重點針對低質量廣告頁面而誕生的-SEO算法目錄( 4867 字)01.上線時間與宗旨02.石榴算法的意義03.石榴算法的誕生04.SEO從業人員如何應對石榴算法最後的話01
  • 谷歌發布Google Trips:用280年前的算法規劃完美行程路線
    昨天谷歌推出一款新 App,Google Trips,它可以幫你在某個陌生的城市度過「完美的一天」。令人驚奇的不是 Google Trips,而是這個 App 中的算法,該算法已經有 280 年的歷史了。所以算法工程很有趣,因為它不會真的過時。
  • 一圖盡展視頻遊戲AI技術,DQN無愧眾算法之鼻祖
    >遊戲中的人工智慧技術紛繁雜亂,近期來自來自哥本哈根大學和紐約大學的幾位研究人員發表的一篇論文對相關技術做了詳盡的綜述,並用一張圖描述出了遊戲 AI 技術的歷史沿革,DQN以其巨大影響成為眾算法之鼻祖。
  • 一文了解算法交易 如何構建資產配置模型?
    流行的「算法」包括交易量百分比、成交量加權平均價格(VWAP)、時間加權平均價格(TWAP)和執行落差交易。在 21 世紀,算法交易已經獲得了散戶和機構交易商的吸引力。投資銀行、養老基金、共同基金和對衝基金可能需要分散執行更大的買賣指令,或者執行交易的速度太快,以至於人類交易員無法做出反應,所以算法交易被廣泛使用。
  • 人工智慧之ICA算法
    人工智慧機器學習有關算法內容,請參見公眾號「科技優化生活」之前相關文章。人工智慧之機器學習主要有三大類:1)分類;2)回歸;3)聚類。今天我們重點探討一下ICA算法。  常見的方法:InfoMax方法(用神經網絡使信息最大化),FastICA方法(固定點算法,尋求X分量在W上投影(W^t)*X)的非高斯最大化。
  • 高維意識:算法之上天之道
    我們算著情感的去留、算著金錢的得失、算著健康的好壞,而在計算的過程,我們從不會考慮算法之上的算法。我們用過去的發生來印證算法的準確性,我們用算法對應著出現在面前的每個人,我們掉進了算法的遊戲裡,被困住了。算法讓我們順著算法的結果去顯化,算法亦對我們的內在產生潛在的影響。
  • 人工智慧之Q Learning算法
    人工智慧機器學習有關算法內容,請參見公眾號「科技優化生活」之前相關文章。人工智慧之機器學習主要有三大類:1)分類;2)回歸;3)聚類。今天我們重點探討一下Q Learning算法。今天重點介紹Q-Learning算法。  Q Learning算法是由Watkins於1989年在其博士論文中提出,是強化學習發展的裡程碑,也是目前應用最為廣泛的強化學習算法。
  • 視頻推薦、畫質修復、廣告植入,首屆「馬欄山杯」國際音視頻算法...
    報名參賽請點擊大賽官網:http://challenge.ai.mgtv.com/jqzx/為推進人工智慧算法在音視頻領域的應用,匯聚行業優質人才,搭建專業技術交流平臺,由湖南省網際網路信息辦公室、湖南省教育工作委員會、湖南省科學技術協會、長沙市人民政府主辦,中國(長沙)馬欄山視頻文創產業園和芒果 TV 承辦的首屆「馬欄山」杯國際音視頻算法大賽已正式開賽