在最小堆中查找k个最小元素

时间:2012-11-16 14:21:29

标签: algorithm

假设我有一个大小为n的最小堆。 我想找到最小的k元素而不改变原始的min-heap。 运行时应该是theta(k ^ 2)。 我可以使用记忆theta(k)。

我该怎么做?

1 个答案:

答案 0 :(得分:10)

这是一个pseducode示例:

candidates.add((heap[heap.root],heap.root))
while len(result)<k:
  (min_value,i)=candidates.remove_min()
  result.append(min_value)
  l=heap.left_child(i)
  r=help.right_child(i)
  candidates.add((heap[l],l))
  candidates.add((heap[r],r))

假设堆具有索引,您可以使用heap[index]在任何索引处检索值。包含最小值的根的索引是heap.rootcandidates是次要的最小堆,最初为空,包含值对和堆索引。最小值按顺序存储在result中。

循环执行k次。除了candidates.remove_min()candidates.add()之外,所有操作都是恒定时间,它们是O(log(k)),因此总时间为O(k * log(k))。