考慮下面的算法從Cormen書:Dijkstra算法複雜度anaylsis誤解
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S <-- {0}
3. Q <-- V[G]
4. while (Q != {0})
5. do u <-- extract-min(Q)
6. s <-- s U {u}
7. for each vertex v at Adj(u)
8. do RELAX(u,v,w)
RELAX (u,v,w)
if d[v] > d[u] + w(u,v)
then d[v] <-- d[u] + w(u,v)
pie(v) <--- u
我們的教授告訴我們,如果我們使用二叉堆,在放鬆操作需要O(登錄| V |),因此 的第7-8行的循環取O(| E | * log | V |)..(如果我們使用線性隊列,則鬆弛需要O(1))。 我一直在谷歌搜索一段時間,只是無法找到一個很好的解釋。 當我們使用二進制堆時,爲什麼放鬆操作需要O(log | V |)? 想得到一些幫助。謝謝。
似乎缺少一些東西。在Q中插入內容的唯一地方是第3行,並且在那裏只插入圖的一個節點?什麼是餡餅? – Sebastian
Pie是父母 – Rouki