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
根的两个子项”部分。它是将这些子级的指针插入heapT
还是仅插入它们的值?如果答案是第二个选项,那么我如何知道接下来的选项呢?T的元素必须让您获得原始堆中的元素和元素位置。如果你能做到这一点,那么你可以找到下一个元素,你可以找到值
各种各样的表述都会起作用。例如,对于最小堆数组表示法,您需要知道的只是数组中的偏移量,以及数组长度和数组开头的全局常量
关于这一工作原理的关键洞察是T
上的所有操作都是大小为O(k)
的堆上的堆操作。因此,它们各自采用O(log(k))
。需要执行O(k)
操作,因此结果是O(k log(k))