Prim和Dijkstra居然寫起來一模一樣

2021-09-30 16:54:55 字數 2211 閱讀 2121

dijkstra:依次找距離起點從近到遠的點;

prim:從起點開始找距離最近的點,且不形成環。

這樣表述還看不出來什麼

def

dijkstra2

(graph,start)

: vnum =

len(graph)

pqueue =

(0.0

,none

,start)

) paths =

count =

0while count < vnum and pqueue:

distance = pair[0]

parent = pair[1]

vertex = pair[2]

if paths[vertex]

:continue

paths[vertex]

=(parent,distance)

edges = graph[vertex]

for v in edges:

if paths[v]

isnone

:(distance + graph[vertex]

[v],vertex,v)

) count +=

1return paths

#%%def

prim

(graph,start)

: vnum =

len(graph)

pqueue =

(0.0

,none

,start)

) mst =

count =

0while count < vnum and pqueue:

dist = pair[0]

parent = pair[1]

vertex = pair[2]

if mst[vertex]

:continue

mst[vertex]

=(parent,dist)

edges = graph[vertex]

for v in edges:

if mst[v]

isnone

:(graph[vertex]

[v],vertex,v)

) count +=

1return mst

amazing,看到了沒有,簡直一模一樣!!!!!

只不過壓堆時,乙個壓的是邊的距離,乙個壓的是到起點的距離。

從起點ver

texs

tart

vertex_

vertex

star

t​,到距離這個點最遠的點ver

texe

nd

vertex_

vertex

end​

, 之間的路徑我們暫且叫pat

hpath

path

。dijkstra實際上是在找這個pat

hpath

path

的最小值,不止最遠的點找了,其他點也都找了;

prim一直再找最近的點,也就是邊最短的點,直到找了n-1條邊,實際上是在約束條件下(不成環)找走過邊和最短的pat

hpath

path

實際上最短pat

hpath

path

也是不可能有環的,加入有環肯定是繞路了(從這裡可以看得出演算法的基礎是數學,好的演算法和數學關係很大);

dijkstra實際上是在找最遠點pat

hpath

path

的最小值,等價於,從起始點,約束條件下不斷加最短邊,直到加n-1條邊。

也就是他們在解決同乙個問題。

但是這個還是沒有反映出他們的**為何一模一樣,簡直是兄弟?

1、圖類問題的遍歷都是借助於鄰居輻射,一傳十,十傳百,根本就不怕擴算亂了,因為已經做了標記處理了,所以框架都差不多;

2、都是基於貪心的處理,用了堆資料結構,基於的標準不一樣(這個不一樣成了他們的唯一不一樣了);

3、為了記錄路徑,都用到(parent,node, weight),這也是路徑的一般處理方式;

4、他們演算法都太簡單了(懂了的情況下),沒幾行,所以就沒啥差異了啊。

Prim演算法和Dijkstra演算法的異同

之前一直覺得prim和dijkstra很相似,但是沒有仔細對比 今天看了下,主要有以下幾點 1 prim是計算最小生成樹的演算法,比如為n個村莊修路,怎麼修花銷最少。dijkstra是計算最短路徑的演算法,比如從a村莊走到其他任意村莊的距離。2 prim演算法中有乙個統計總len的變數,每次都要把到...

Prim演算法和Dijkstra演算法的異同

之前一直覺得prim和dijkstra很相似,但是沒有仔細對比 今天看了下,主要有以下幾點 1 prim是計算最小生成樹的演算法,比如為n個村莊修路,怎麼修花銷最少。dijkstra是計算最短路徑的演算法,比如從a村莊走到其他任意村莊的距離。2 prim演算法中有乙個統計總len的變數,每次都要把到...

Prim演算法和Dijkstra演算法的異同

今天看了下,主要有以下幾點 1 prim是計算最小生成樹的演算法,比如為n個村莊修路,怎麼修花銷最少。dijkstra是計算最短路徑的演算法,比如從a村莊走到其他任意村莊的距離。2 prim演算法中有乙個統計總len的變數,每次都要把到下一點的距離加到len中 dijkstra演算法中卻沒有,只需要...