【发布时间】:2013-11-10 23:43:28
【问题描述】:
我正在研究 c++ stl 算法并试图理解堆算法(make_heap、sort_heap、push_heap 等)。我了解它创建的二叉树,以及这对于在任何给定时间有效地查找最高优先级项目有何用处。我不清楚这比维护一个排序容器更好,在这个容器中,价值最高的项目可以简单地从顶部弹出。
这是我所看到的比较:
对于堆:
- 创建堆:make_heap: O(nlogn) ...错误! O(n)
- 插入:push_heap:O(logn)
- 移除最高:pop_heap: O(logn)
- 获取排序列表:sort_heap: O(nlogn)
对于已排序的容器:
- 初始排序:sort() O(nlogn)
- 插入:? O(logn)
- 移除最高:pop constant
- 获取排序列表:已排序常量
插入需要找到具有相同值的元素或值两侧的两个元素。在排序列表中,这应该是 O(logn)。我还不知道有什么特定的算法可以做到这一点。
无论如何,我错过了什么?从我上面的分析看来,仅仅维护一个排序的容器在所有情况下都不会更糟,在某些情况下会更好。
谢谢!
编辑:
我想指出这一点,因此没有人会阅读此内容并对我的问题感到困惑。正如 rici 指出的那样,我误解了 make_heap 的复杂性。我最初以为是 O(n log n),但实际上是 O(n)。对我来说,这种差异解释了为什么 make_heap 比简单地维护一个排序列表更好。
【问题讨论】:
-
“排序容器”是指已排序的
std::vector之类的东西吗?因为然后插入是O(n)。或者你的意思是像std::set这样的容器,它通过在后台使用树结构在内部维护秩序?