我發佈了一個相當混亂的問題,所以我重寫了它從零開始...批量更新二進制堆中的節點優先級?
這實際上是純理論問題。
說,我們有二進制堆。讓堆是一個MaxHeap,所以根節點的值最大,每個節點的值都比子節點的值大。我們可以在堆上做一些常見的低級操作:「交換兩個節點」,「比較兩個節點」。
使用這些低級操作,我們可以實現通常的高級遞歸操作:「篩選」,「篩選」。
使用這些篩選和篩選,我們可以實現「插入」,「修復」和「更新」。我對「更新」功能感興趣。假設我已經擁有要更改節點的位置。因此,更新功能很簡單:
function update (node_position, new_value){
heap[node_position] = new_value;
sift_up(node_position);
sift_down(node_position);
}
我的問題是:是否有(mathematicaly)可能的話,進行更高級的「更新」功能,即可以同時更新多個節點,在某種程度上,所有節點將它們的值更改爲new_values,然後,他們的位置被糾正?事情是這樣的:
function double_update (node1_pos, node2_pos, node1_newVal, node2_newVal){
heap[node1_pos] = node1_newVal;
heap[node2_pos] = node2_newVal;
sift_up(node1_position);
sift_down(node1_position);
sift_up(node2_position);
sift_down(node2_position);
}
我做了一些測試,這本「double_update」和它的工作,雖然它並不能證明什麼。
什麼「三重更新」,等等...
我做了一些其他測試與「多更新」,在那裏我改變了所有節點的值,然後叫{篩機();篩向下(); }按照隨機順序對其中的每一個進行一次。這並不奏效,但結果並不是很正確。
我知道這聽起來不太有用,但我對它背後的理論很感興趣。如果我讓它工作,我確實有一個使用它。
我正在用heapify算法構建堆。大多數時候,我會一次更新兩個節點。可以通過調用update()兩次= O(2 * log n)來完成。但是它是一個仿真腳本,在需要節點位置修正之前,節點的實際值將隨機更改很多次。我可以將位置修正與價值的實際更新分開,只要我總是一次只處理一個節點,而不是這種情況。實際上,我一直在尋找一種方法將位置修正與價值變化分開,同時處理2個節點(通常)。 – enrey
順便說一句,我知道它是可行的,我總是可以在節點值和堆之間添加分隔層,製作「假節點」並僅在需要時更新它們,以擺脫無用的堆更新開銷。但我更喜歡數學技巧和時髦的算法:) – enrey