【发布时间】:2015-10-06 00:14:22
【问题描述】:
我正在尝试解决以下问题:
给定一个表示为数组的最大堆,在不修改堆的情况下返回第 k 个最大的元素。我被要求在线性时间内完成,但被告知可以在对数时间内完成。
我想到了一个解决办法:
使用第二个最大堆并在其中填充 k 或 k+1 个值(广度优先遍历原始值),然后弹出 k 个元素并获得所需的元素。我想这应该是 O(N+logN) = O(N)
是否有更好的解决方案,可能在 O(logN) 时间内?
【问题讨论】:
-
知道了,谢谢,但在这种情况下,我仍然认为您的算法不正确,因为树的广度优先搜索无法正常工作?
-
我想它应该可以工作。我错误地使用了“搜索”一词,基本上我只是在搜索存储一个级别的节点然后继续下一个级别的遍历。我将编辑该术语以消除任何潜在的歧义
-
我认为斐波那契堆是一种摊销 O(log n) 解决方案的方法,但我喜欢这个问题。我会考虑的……
-
@Alstor 我认为您的解决方案不正确,因为第 k 个最大元素不必位于树的第 k 级。
-
@Alstor 如果您只是要遍历树并使用堆栈,那么为什么要使用第二个最大堆,因为遍历不会修改堆?
标签: algorithm data-structures heap pseudocode