有人听说过这种堆修复技术吗:SloppyHeapSort吗?它使用了一种“松散的”下滑方式。基本上,它将要修复的元素移动到堆的底部(不与其子节点进行比较),通过用其较大的子节点替换它来实现,直到它达到底部。然后调用sift-up函数直到它到达正确的位置。 在大小为n的堆中,这只需要稍微超过lg n次比较。
然而,这不能用于堆构建,只能用于堆修复。为什么呢?我不明白如果你想建立一个堆为什么它不起作用。
然而,这不能用于堆构建,只能用于堆修复。为什么呢?我不明白如果你想建立一个堆为什么它不起作用。
heapify
的情况下,堆修复不是使用子堆中的最后一个元素,而是使用从原始向量中获取的以前未见过的元素。这实际上并没有改变平均性能分析,因为如果您从随机元素开始堆修复,而不是从可能很小的元素开始,那么需要进行的sift-down操作的预期数量仍接近最大值。 (一半堆位于最后一级,因此对于随机元素需要最大数量的筛选次数的概率为一半。)有一种线性时间的算法可以构建堆。我相信作者的意思是使用这种方法来构建堆不够高效,存在更好的算法。当然,您可以使用所描述的策略逐个添加元素来构建堆-只是您可以做得更好。