Algorithm 按从小到大的顺序打印最小堆中的k个最小值(klog k)

Algorithm 按从小到大的顺序打印最小堆中的k个最小值(klog k),algorithm,data-structures,time-complexity,heap,Algorithm,Data Structures,Time Complexity,Heap,我有一个包含n元素的最小堆H。函数min(H,k)按从小到大的顺序打印k最小值。在方法的末尾,H仍然包含n值。我被要求在O(klogk)和O(k)额外空间中给出min(H,k)的算法。在解决方案中,他们的做法如下: 我们将在没有任何数据的情况下使用额外的min堆T。它将包含原始最小堆H元素的副本(在H和T的值之间将有一个双向指针)。算法: 在O(1)中打印H的最小元素 在T中插入H根的两个子项 只要我们没有打印k值,就可以: 打印T的最小元素(称之为x) 从T中删除x 将堆H(如果存在)的x

我有一个包含
n
元素的最小堆
H
。函数
min(H,k)
按从小到大的顺序打印
k
最小值。在方法的末尾,
H
仍然包含
n
值。我被要求在
O(klogk)
O(k)
额外空间中给出
min(H,k)
的算法。在解决方案中,他们的做法如下:

我们将在没有任何数据的情况下使用额外的min堆
T
。它将包含原始最小堆
H
元素的副本(在
H
T
的值之间将有一个双向指针)。算法:

  • O(1)
    中打印
    H
    的最小元素
  • T
    中插入
    H
    根的两个子项
  • 只要我们没有打印k值,就可以:
    • 打印
      T
      的最小元素(称之为
      x
    • T
      中删除
      x
    • 将堆
      H
      (如果存在)的
      x
      的两个子项插入堆
      T

我不明白为什么这个算法是有效的,最糟糕的是什么,我根本不懂这个算法。我知道我们创建了一个新堆
T
。我也理解为什么打印
H
的最小元素是
O(1)
。我不理解“插入
t
H
根的两个子项”部分。它是将这些子级的指针插入heap
T
还是仅插入它们的值?如果答案是第二个选项,那么我如何知道接下来的选项呢?

T的元素必须让您获得原始堆中的元素和元素位置。如果你能做到这一点,那么你可以找到下一个元素,你可以找到值

各种各样的表述都会起作用。例如,对于最小堆数组表示法,您需要知道的只是数组中的偏移量,以及数组长度和数组开头的全局常量

关于这一工作原理的关键洞察是
T
上的所有操作都是大小为
O(k)
的堆上的堆操作。因此,它们各自采用
O(log(k))
。需要执行
O(k)
操作,因此结果是
O(k log(k))