潜在函数二进制堆提取最大值O(1)


10

我需要帮助来确定最大堆的潜在函数,以便在摊销时间内完成提取最大。我还要补充一点,就是我对潜在方法没有很好的了解。O(1)

我知道insert函数应该“付出更多”以减少提取的成本,这必须要考虑到堆的高度(如果给出了堆应该是或)log(n)2log(n)k=1n2log(k)

Answers:


13

请尝试以下操作:

堆元素的权重是其在相应二叉树中的深度。因此,根元素的权重为零,其两个子权重为1,依此类推。您定义为潜在功能wiiH

Φ(H)=iH2wi.

现在让我们分析堆操作。对于插入,您添加了一个新元素,最多增加了深度。这样可以将电势增加,并且可以在时间内完成。然后,您“冒泡”新的堆元素以确保堆属性。这需要时间,而不变。因此,插入成本为。dlog(n)2dO(1)O(logn)Φ(H)O(log(n)+Δ(Φ(H)))=O(logn)

现在考虑extractMin。您取出根并用堆中的最后一个元素替换它。这样可以将电势降低,因此您可以负担得起修复堆属性的费用,因此摊销成本现在为。2log(n)O(1)

如果您对潜在功能有一个一般性问题,则应将其视为另一个问题。


我确定您是正确的,但我不理解插入内容。为什么不变?抱歉,答案很明显,但是您可以扩大吗?我不明白为什么您在那里会有一个负数ΔΔ(Φ(H)))Δ
andrei 2013年

2 log n Δ(Φ(H))指电位差-插入前后。最多为。当交换堆中的两个元素(向上气泡或向下气泡)时,一个权重变为+1,而另一个权重变为-1,因此势(所有权重的总和)保持不变。2log(n)
A.Schulz 2013年

维修O(1)怎么样?潜在功能在修复堆中有什么用?能否请你澄清
Sohaib

@Sohaib:修复需要时间,但是使用上述潜在函数摊销了时间。除了分析摊销成本外,没有其他用途。O 1 O(logn)O(1)
A.Schulz,2015年

@ A.Schulz因此,从本质上讲,这意味着给定提取操作要进行n次,因为每次电位函数都会减少2logn(在修复时可能会或可能不会平均增加)。这种事情的总体复杂度将是恒定的时间,因为最终树中将没有节点。我对吗?
Sohaib 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.