0

讓A成爲一個堆,它不是以常規方式存儲值,而只是定期存儲根,並且每個子存儲爲它與其父項之間的差異。 HEAP-INCREASE-KEY(A,i,key)操作的複雜性是什麼(操作更新節點上的節點的key到key)?HEAP-INCREASE-KEY複雜度

+0

「key」是節點'i'的值與父值的差值,還是節點'i'的實際值?操作只能增加數值還是可以減少差值?這個問題在這裏是邊界線(無論是主題還是容忍)。我建議在此刪除它並將其張貼在[cs.se]上,然後放在主題上,更有可能被主題專家看到。 – Gilles 2014-11-08 17:30:26

+0

這個問題似乎是題外話題,因爲它是關於計算機科學,而不是編程。 – Gilles 2014-11-08 17:31:12

回答

1

它可以在O(log N)時間像在一個正常的堆中完成。要找到存儲在節點i中的新值,可以遍歷從堆根目錄到此節點的路徑,以便根據它與其父節點之間的差異表示新的key值。之後,篩選程序可以以與在普通堆中完成的方式幾乎相同的方式執行。在進行篩選程序交換時,這些值只會改變這兩個交換節點及其子元素。因此,一次交換需要更新O(1)。這就是爲什麼總時間複雜度爲O(log N)

這是實現它的一種簡單方法:
1.如果節點位於堆根和更新節點之間的路徑上,我們稱它爲「已觸及」節點。如果節點與最接近的「已觸摸」節點之間的距離至多爲2,我們稱節點爲「重建」。
2.對於每個「重建」節點,可以通過遍歷堆來計算其真值。請注意,對於任何查詢,都有O(log N)「重建」節點。
3.重建所有「重建」節點的真值後,可以運行一個通常的篩選程序。
4.在此過程完成後,可以通過遍歷所有「重建」節點的堆來計算節點與其父節點之間的差異。所有其他節點都不會被觸摸。

+0

你能解釋一下在這種情況下篩分過程是如何進行的嗎? – Guy 2014-11-08 17:54:39

+0

@Guy節點值與其父值之間的差異是已知的。所以很明顯它們是否應該交換。 – kraskevich 2014-11-08 17:57:26

+0

當你說「他只爲這兩個交換節點及其子節點改變值」時,有多少節點發生了改變?我不明白這一部分。 – Guy 2014-11-08 17:59:53