我正在解決一個需要使用堆數據結構解決的問題。雖然操作將由insert和extract-min控制,但是會出現需要替換項目的鍵(增加或減少)或刪除項目,鍵的情況。由於heapq
模塊不提供這些操作,並且在堆中搜索物品將是O(n)
,因此只需使用字典進行簿記,然後僅用它來查找物品的位置,刪除或替換物品並調用heapify
來恢復堆屬性 - 總體上所有這些操作將在O(logn)
中運行。 問題是,我無法實現這樣的字典,但。替換和刪除堆中的操作
h, bkp = [], {}
heappush(h, (5, 'a'))
bkp['a'] = # index of 'a' in heap
heappush(h, (7, 'b'))
bkp['b'] = # index of 'b' in heap
heappush(h, (1, 'c'))
bkp['c'] = # index of 'c' in heap
# deleting 'a'
h[bkp['a']], h[-1] = h[-1], h[bkp['a']]
h.pop()
heapify(h)
#update indices in bkp
問題 - 如何找到在堆和刪除或推操作之後新插入的索引,我該如何重新計算指數堆中現有的項目?
如果是C/C++,我會在對象移動並計算索引時持有對該對象的引用。如果沒有自己進行堆計算,很難確切地說出一個對象最終會導致哪個索引。 – Michael
您是否在'heapq'文檔中看到刪除配方(並在此基礎上更改密鑰)? – delnan