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演算法中卻沒有,只需要...