讓A成爲一個堆,它不是以常規方式存儲值,而只是定期存儲根,並且每個子存儲爲它與其父項之間的差異。 HEAP-INCREASE-KEY(A,i,key)操作的複雜性是什麼(操作更新節點上的節點的key到key)?HEAP-INCREASE-KEY複雜度
回答
它可以在O(log N)
時間像在一個正常的堆中完成。要找到存儲在節點i
中的新值,可以遍歷從堆根目錄到此節點的路徑,以便根據它與其父節點之間的差異表示新的key
值。之後,篩選程序可以以與在普通堆中完成的方式幾乎相同的方式執行。在進行篩選程序交換時,這些值只會改變這兩個交換節點及其子元素。因此,一次交換需要更新O(1)
。這就是爲什麼總時間複雜度爲O(log N)
。
這是實現它的一種簡單方法:
1.如果節點位於堆根和更新節點之間的路徑上,我們稱它爲「已觸及」節點。如果節點與最接近的「已觸摸」節點之間的距離至多爲2,我們稱節點爲「重建」。
2.對於每個「重建」節點,可以通過遍歷堆來計算其真值。請注意,對於任何查詢,都有O(log N)
「重建」節點。
3.重建所有「重建」節點的真值後,可以運行一個通常的篩選程序。
4.在此過程完成後,可以通過遍歷所有「重建」節點的堆來計算節點與其父節點之間的差異。所有其他節點都不會被觸摸。
你能解釋一下在這種情況下篩分過程是如何進行的嗎? – Guy 2014-11-08 17:54:39
@Guy節點值與其父值之間的差異是已知的。所以很明顯它們是否應該交換。 – kraskevich 2014-11-08 17:57:26
當你說「他只爲這兩個交換節點及其子節點改變值」時,有多少節點發生了改變?我不明白這一部分。 – Guy 2014-11-08 17:59:53
- 1. `append`複雜度
- 2. Kolmogorov複雜度
- 3. valarray複雜度
- 4. 時間複雜度和空間複雜度,如何計算空間複雜度
- 5. 時間複雜度
- 6. 堆棧複雜度
- 7. 時間複雜度
- 8. 時間複雜度
- 9. 時間複雜度
- 10. Android OnClickListener複雜度
- 11. 漸近複雜度
- 12. stl list - 複雜度
- 13. 計算函數的空間複雜度和時間複雜度
- 14. 'if'in'時間複雜度
- 15. map.find()的時間複雜度
- 16. Dijkstra的算法 - 複雜度
- 17. A *的時間複雜度
- 18. 時間複雜度(Java,Quicksort)
- 19. 降低時間複雜度
- 20. NSGA ii算法複雜度
- 21. 算法複雜度時間
- 22. Math.Sqrt()的時間複雜度?
- 23. 非大O複雜度
- 24. 2^n複雜度算法
- 25. 時間複雜度說明
- 26. 二叉樹複雜度
- 27. 字謎時間複雜度
- 28. 基本複雜度混淆
- 29. JQUERY時間複雜度
- 30. 運行時間複雜度
「key」是節點'i'的值與父值的差值,還是節點'i'的實際值?操作只能增加數值還是可以減少差值?這個問題在這裏是邊界線(無論是主題還是容忍)。我建議在此刪除它並將其張貼在[cs.se]上,然後放在主題上,更有可能被主題專家看到。 – Gilles 2014-11-08 17:30:26
這個問題似乎是題外話題,因爲它是關於計算機科學,而不是編程。 – Gilles 2014-11-08 17:31:12