【发布时间】:2020-02-02 18:28:12
【问题描述】:
我有一个最小堆 H 和 n 元素。函数min(H,k) 按从小到大的顺序打印k 最小值。在方法结束时,H 仍然包含 n 值。我被要求在O(klogk) 和O(k) 额外空间中给出min(H,k) 的算法。在解决方案中,他们做了如下:
我们将使用一个额外的最小堆T 没有任何数据。它将包含原始最小堆H 的元素的副本(H 和T 的值之间将有一个双向指针)。算法:
- 在
O(1)中打印H的最小元素。 - 将
H的根的两个孩子插入T。 - 只要我们不打印 k 值就可以:
- 打印
T的最小元素(我们称之为x)。 - 从
T中删除x。 - 将堆
H的x的两个子代插入堆T(如果存在)。
- 打印
我不明白为什么这个算法是有效的,什么是最糟糕的,我根本不明白这个算法。我知道我们创建了一个新堆T。我也明白为什么打印H 的最小元素是O(1)。我不明白“插入TH 的根的两个孩子”部分。它是将这些孩子的指针插入堆T 还是只是它们的值?如果答案是第二个选项,那么我怎么知道要遵循下一个选项?
【问题讨论】:
标签: algorithm data-structures time-complexity heap