dijkstra算法_Python实现图的经典DFS、BFS、Dijkstra、Floyd、Prim、Kruskal算法
講在前面的話,圖的算法太多,理論知識肯定一篇文章講不完,關于理論知識大家可以參考教材Sedgewick的《算法》或reference的鏈接,本文主要還是想在一篇文章中記錄六種算法的Python代碼。同樣想吐槽一下,雖然網上博客很多,但是并不代表他們的代碼都是正確的,還是要看經典教材啊,教材這么多人在用,所以出現錯的概率會低一些。在這講一下自己對這些算法的核心思想的一些個人理解,很多東西細節是記不住的,本科學了兩遍算法,現在不也一樣重頭再學么,但算法的核心思想這是可以記住的,希望我的理解對別人會有一點點用處。
1.個人的一點理解
對于DFS和BFS,如果遇到搜索和遍歷,肯定要想到堆棧和隊列,而遇到堆??隙ň鸵氲绞遣皇强梢杂眠f歸來實現,因為遞歸程序其實就是函數在內存中的出棧入棧,DFS就是使用堆棧或者遞歸來實現,而類似層次遍歷的BFS自然就可以使用隊列來實現,這跟樹的前序,中序,后序遍歷(具體參考我之前的一篇博客)和層次遍歷的思想是一樣的。
對于最短路徑算法的Dijkstra、Floyd算法,Dijkstra算法是求從某個源點到其余各個頂點的最短路徑(單源最短路徑),時間復雜度為
,主要思想為每次在未確定的頂點中選取最短的路徑,并把最短路徑的頂點設為確定值,然后再由源點經該點出發來松弛其他頂點的路徑的值,重復以上步驟最后得到就是最短路徑了。而Floyd算法針對的問題是求每對頂點之間的最短路徑,相當于把Dijkstra算法執行了n遍(實際上并不是這樣做),所以Floyd算法的時間復雜度為 。但實際上Floyd算法核心代碼就有五行,主要用公式 來不斷優化帶權鄰接矩陣,最后得到矩陣就是每對頂點之間的最短距離了。對于最小代價生成樹的Prim、Kruskal算法,兩種算法的主要核心思想是貪心算法。Prim算法是從任意一個頂點開始,每次選擇一個與當前頂點集最近的一個頂點,并將兩頂點之間的邊加入到樹中,其實就是說在當前頂點集所可以輻射到的邊中選擇最小的一條邊(需要判斷該邊是否已經在最小生成樹中),其實就是一個排序問題,然后貪心選取最小值。Kruskal算法則是另外一種思維,選擇從邊開始,把所有的邊按照權值先從小到大排列,接著按照順序選取每條邊(貪心思想),如果這條邊的兩個端點不屬于同一集合,那么就將它們合并,直到所有的點都屬于同一個集合為止,其實就是基于并查集的貪心算法。兩種算法各有不同,Prim算法的時間復雜度為
,n表示頂點數目,這跟它的初心還是蠻符合的,畢竟它是從頂點出發,可以從公式中看出Prim算法的時間復雜度與網絡中的邊無關,所以適合來求解邊稠密的網的最小代價生成樹。而Kruskal算法恰恰相反,它適合來求邊稀疏的網的最小代價生成樹,時間復雜度為 ,e表示網絡中的邊數。2.show me the code
DFS、BFS
graphDijkstra、Floyd算法
?Prim、Kruskal算法
"""reference
1.算法(第4版) [美] Robert Sedgewick,[美] Kevin Wayne 著,謝路云 譯
2.圖解Dijkstra算法和Floyd算法 (看圖就好)
3.Dijkstra 最短路算法
4.圖解 Prim、Kruskal算法
5.最小生成樹之Kruskal算法
6.并查集
總結
以上是生活随笔為你收集整理的dijkstra算法_Python实现图的经典DFS、BFS、Dijkstra、Floyd、Prim、Kruskal算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 惊了!支付宝“集五福”超4万人集齐 快扫
- 下一篇: 深度学习试题_高中生物:今年高考试题3点