簡體   English   中英

具有斐波那契堆的Prim算法:為什么使用O(E + V * log(V))?

[英]Prim's algorithm with Fibonacci heap: why O(E + V*log(V))?

我知道Prim的算法以及如何實現它。 我也知道為什么其時間復雜度為O(E + V log(V))。

我們將邊E次相加(即O(E)),並選擇最小V次(即O(V * log(V))。但是我不明白其中的一部分:為什么要V次?一棵樹有V-1條邊,但是如果最重的邊必須在MST中,我們必須選擇最小的E次,而不是V次。

例如:一個完整​​的圖形,每個邊的權重為1,除了一個頂點,所有與之相連的邊的權重為10 ^ 18。

您想使用初始圖形中的邊連接V頂點,從而形成一棵樹。 您可以從任何節點開始,比方說v。然后,將連接v的邊的成本從v可以到達的所有頂點添加到隊列中。 您去了最便宜的一個。 現在您做同樣的事情。 如果要放入隊列中已經存在的頂點u,則必須檢查邊緣的工資。 如果新的較小,則取出較舊的,然后插入較新的,否則跳過。 另外,如果您已經將節點u連接到樹上,則也將其跳過。 因此,您的隊列中最多會有V個頂點,從而使時間復雜度為O(E + V log V)(E-因為您必須檢查每個頂點的所有邊)

編輯:更具體地說,當您將頂點u再次添加到隊列中時,您可以擦除上一個,或僅更改其成本。 如果使用斐波那契堆,另一件事應該更快。 刪除將使您花費O(E log V)而不是O(E + VlogV)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM