标题说明了一切; 在具有n 个元素的最大堆中找到第n个最大数的最有效方法是什么?ps:我正在阅读的教科书含糊地解释了一个具有时间复杂度的解决方案,即使用另一个我无法理解的堆,我们能做得更好吗?
O(lognloglogn)
问问题
664 次
1 回答
1
让我们H
成为原始的最大堆。让H'
另一个最大堆,最初是空的,它对(index, value)
来自第一个堆的元素对进行操作,并根据第二个组件对这些元素对进行排序。
H'.push(0, H[0])
count = ceil(log n)
while count > 0 do
(i, v) := H'.extract-max()
// 需要O(log log n)
时间H'.push(2i+1, H[2i+1])
如果H[2i+1]
存在 //O(log log n)
时间H'.push(2i+1, H[2i+2])
如果H[2i+2]
存在 //O(log log n)
时间count := count - 1
- 返回
v
我们O(log log n)
对 的 操作的运行时间有限制的原因H'
是它H'
最多包含log n
元素,并且每个操作在时间上与堆的元素数量成对数,即O(log log n)
.
总运行时间明显O(log n log log n)
。我假设原始的最大堆H
用数组表示。
于 2017-03-20T08:45:37.597 回答