代码之家  ›  专栏  ›  技术社区  ›  taurus05

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

  •  0
  • taurus05  · 技术社区  · 2 年前

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

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

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

    目的是降低堆积方法的时间复杂性。只有当比较次数减少时,这才有可能实现。

    0 回复  |  直到 2 年前
        1
  •  3
  •   greybeard    2 年前

    目标是降低 heapify 方法

    这很遗憾,因为与

    减少多次插入和删除的时间复杂性 :

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

    这样的思考导致了像Fibonacci这样的高级堆, pairing ,Brodal

        2
  •  2
  •   user3386109    2 年前

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

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

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