4

假设我有一个大小为 n 的最小堆。我想在不改变原始最小堆的情况下找到最小的 k 个元素。运行时间应该是 theta(k^2)。我可以使用内存 theta(k)。

我该怎么做?

4

1 回答 1

10

这是一个伪代码示例:

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))。

于 2012-11-16T14:35:31.687 回答