日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

dijkstra算法_Python实现图的经典DFS、BFS、Dijkstra、Floyd、Prim、Kruskal算法

發布時間:2023/12/15 python 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dijkstra算法_Python实现图的经典DFS、BFS、Dijkstra、Floyd、Prim、Kruskal算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

講在前面的話,圖的算法太多,理論知識肯定一篇文章講不完,關于理論知識大家可以參考教材Sedgewick的《算法》或reference的鏈接,本文主要還是想在一篇文章中記錄六種算法的Python代碼。同樣想吐槽一下,雖然網上博客很多,但是并不代表他們的代碼都是正確的,還是要看經典教材啊,教材這么多人在用,所以出現錯的概率會低一些。在這講一下自己對這些算法的核心思想的一些個人理解,很多東西細節是記不住的,本科學了兩遍算法,現在不也一樣重頭再學么,但算法的核心思想這是可以記住的,希望我的理解對別人會有一點點用處。

1.個人的一點理解

對于DFS和BFS,如果遇到搜索和遍歷,肯定要想到堆棧和隊列,而遇到堆棧肯定就要想到是不是可以用遞歸來實現,因為遞歸程序其實就是函數在內存中的出棧入棧,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

graph

Dijkstra、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算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。