如果我们假设min heap包含重复项,我有兴趣在min heap中找到第7个最小的元素吗?
我不知道如何接近。任何人都可以提供一个想法吗?
答案 0 :(得分:4)
由于第七个最小元素位于最小堆的前7个级别,因此它是前7个级别中127个元素中的第7个最小元素。由于此数字是固定的(与原始堆的大小无关),因此复杂度为O(1)。
答案 1 :(得分:1)
有一个简单的O(k * log k)算法来从堆中选择第k个最小元素:
# h = input heap
q = new min-heap()
q.insert(h.root)
for i := 1 to k - 1
top = q.delete-min()
q.insert(top.left)
q.insert(top.right)
report q.top
当然,对于k = 7的情况,这是恒定的时间。如果你想要第k个最小的不同的元素,而不是总体上第k个最小的元素,那么你将需要线性时间,因为除了叶子之外,堆中的所有元素都可以相等,然后你需要找到(k-1)st最小的叶子,如果所有内部节点都具有相同的值,这在o(n)中是不可能的。