擅长:python、mysql、java
<p>从堆中移除任意项是一个O(logn)操作,前提是您知道该项在堆中的位置。算法是:</p>
<pre><code>Move the last item in the heap to the position that contains the item to remove.
Decrement heap count.
If the item is smaller than its parent
bubble it up the heap
else
sift it down the heap
</code></pre>
<p>主要问题是<em>查找</em>该项在堆中的位置。正如您所指出的,除非您维护更多信息,否则这样做是一个O(n)操作。在</p>
<p>一个有效的解决方案是创建一个包含项键的字典,其值是堆中该项的索引。但是,您必须维护字典:</p>
<ol>
<li>将项插入堆时,请添加字典项</li>
<li>从堆中移除项时,请移除字典项</li>
<li>每当更改堆中某个项的位置时,都要更新该项在字典中的值。在</li>
</ol>
<p>有了这个字典,就有了O(1)访问项在堆中的位置,并且可以在O(logn)中删除它。在</p>