我正在研究 c++ stl 算法并试图理解堆算法(make_heap、sort_heap、push_heap 等)。我了解它创建的二叉树,以及这对于在任何给定时间有效地找到最高优先级的项目有何用处。我不清楚这比维护一个排序的容器更好,在这个容器中,价值最高的项目可以简单地从顶部弹出。
这是我所看到的比较:
对于堆:
- 创建堆: make_heap: O(nlogn) ...错误!上)
- 插入:push_heap:O(logn)
- 删除最高:pop_heap: O(logn)
- 获取排序列表:sort_heap: O(nlogn)
对于已排序的容器:
- 初始排序:sort() O(nlogn)
- 插入: ? O(登录)
- 移除最高:pop常量
- 获取排序列表:已经排序的常量
插入需要找到具有相同值的元素或值两侧的两个元素。在排序列表中,这应该是 O(logn)。我还不知道可以做到这一点的特定算法。
无论如何,我错过了什么?从我上面的分析看来,仅仅维护一个排序的容器在所有情况下都不会更糟,在某些情况下会更好。
谢谢!
编辑:
我想指出这一点,所以没有人会读到这篇文章并对我的问题感到困惑。正如 rici 指出的那样,我误解了 make_heap 的复杂性。我最初以为是 O(n log n),但实际上是 O(n)。对我来说,这种差异解释了为什么 make_heap 比简单地维护一个排序列表更好。