繁体   English   中英

高效的HEAPIFY方法减少比较次数

[英]Efficient HEAPIFY method to reduce number of comparisons

考虑一个有n元素的二元最大堆。 它的高度为O(log n) 当新元素插入堆中时,它们将在堆中传播,以便始终满足 max-heap 属性。

新元素将作为子元素添加到最后一层。 但是插入后,可能会违反最大堆属性。 因此,将使用 heapify 方法。 这将具有O(log n)的时间复杂度,即堆的高度。

但是我们可以让它更有效率吗?
当执行多个插入和删除时,此过程会使事情变慢。 此外,严格要求堆应该是每次插入后的最大堆。

目的是降低heapify方法的时间复杂度。 这只有在减少比较次数时才有可能。

目的是降低heapify方法的时间复杂度。

很可惜,因为那是不可能的,相比之下

降低多次插入和删除的时间复杂度

想象一下不立即插入到第n 个项目堆中,
建立一个辅助的(甚至是一个列表)。
在删除(提取?)时,将辅助项(现在大小为k )中的一项放在“清空的地方”,如果 k << n 则根据需要进行向下或向上筛选。
如果辅助数据结构没有明显小于主数据结构,则合并它们。

这样的思考导致高级堆,如斐波那契、配对、布罗达尔……

堆中插入操作的时间复杂度取决于进行比较的次数。 可以想象使用一些开销来实现沿叶到根路径的智能二进制搜索。

但是,时间复杂度不仅仅由比较的次数决定。 时间复杂度由必须执行的任何工作决定,在这种情况下,写入次数也是 O(log),并且无法减少写入次数。

插入操作需要更改其值的节点数为 O(log)。 减少比较次数不足以降低复杂性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM