时间复杂度最小的堆插入和删除

Posted

技术标签:

【中文标题】时间复杂度最小的堆插入和删除【英文标题】:Heap insertion and deletion with mininum time complexity 【发布时间】:2022-01-22 05:43:09 【问题描述】:

当我们用时间复杂度O(1)的数组实现堆时,是否可以向堆中插入元素或从堆中删除元素?

【问题讨论】:

如果可以,那么您可以使用比 o(n log n) 更快的排序算法。因此,必须对键的值有额外的假设。比如限制他们的范围 【参考方案1】:

插入?不。如果你希望它是一个堆,你需要在插入时进行排序,所以我猜你最终还是有 log-n。

删除?可能是。如果将堆与一个映射关联,其中插入的值是映射键,映射值是插入值在堆中的位置,那么您可以在常数时间内找到元素的位置,并将其删除恒定时间

【讨论】:

***的 Heap 页面显示了许多 variants 插入时间为 O(1)。并且所有变体都有 O(log N) 删除。所以你在你的答案的两半中都与***相矛盾。 @ikegami - 问题是关于使用 array 实现的堆。仅当数组只有一个成员时,数组才具有 O(1) 插入。***页面有其他堆实现选项。 这仍然不能解释为什么你给出的删除时间比那里列出的基于数组的方法还要好。 不幸的是,我错过了要求数组实现的 OP;我无法确定一个具有恒定时间的数组的删除,我的错误 另外,如果你在堆顶推(希望内存是预先分配的),数组插入可能是 O(1)。【参考方案2】:

不,这是不可能的 - 至少,假设确定元素相对顺序的唯一方法是进行比较。

假设你可以这样做。然后我们可以在 O(n) 时间内对包含 n 个项目的列表进行排序,如下所示:

在 O(n) 时间内将所有 n 个元素插入堆中。 重复执行以下操作: 在 O(1) 时间内找到堆中的最小元素。 在 O(1) 时间内从堆中删除该元素。

总的来说,这将给出一个基于 O(n) 时间比较的排序算法,这是不可能的,因为不存在这样的算法。

【讨论】:

以上是关于时间复杂度最小的堆插入和删除的主要内容,如果未能解决你的问题,请参考以下文章

java数据结构----堆

转载:数据结构 二项队列

通过指针的堆数据结构

经典排序算法的应用

数据结构和算法-堆

手动实现最小堆和最大堆(优先队列)