【发布时间】:2021-05-04 09:10:25
【问题描述】:
我试图了解 C++ STL priority_queue 用于构建堆的时间复杂度。对于构建堆,时间复杂度应为 O(n)。假设我们有一个包含 n 个元素的向量,并且我们想从该向量构建一个最大堆。代码会是这样 -
vector<int> vec{3,4,5,1,2};
priority_queue<int> pq;
for (auto v : vec) {
pq.push(v);
}
推送操作需要 O(log n) 时间。在我看来,它是 O(nlogn) 时间复杂度。但是上面的代码 sn -p 只是第一次从向量中构建了一个堆。上述情况的复杂性是 O(n),即构建一个堆。
编辑:如果上面的代码 sn-p 是 O(nlogn),那么我想知道在 O(n) 中使用 priority_queue c++ stl 构建堆的代码。
【问题讨论】:
-
如果
vec包含n元素,那么时间复杂度将为O(nlogn) -
但是我们使用priority_queue来构建这样的堆,并且说构建堆的时间复杂度是O(n)。那为什么这么说呢?
-
请注意,
O(log(n))时间复杂度只是一个关于操作时间复杂度上限的声明。该操作实际上可能发生得更快,并且在极少数情况下只需要那么长时间。如果运行时如果O(log(n))用于O(n/log(n))的调用和O(1)用于其余的调用,那么您将得到O(n)的总复杂度。 (关键字摊销时间复杂度)(注意:我没有看过这个具体的例子并检查过,如果提到的复杂度实际上是正确的) -
顺便说一句:我认为插入的时间复杂度只提到一次将所有元素传递给构造函数,而不是使用循环逐个插入元素。检查堆排序的构建堆步骤;这应该是使用的逻辑:en.wikipedia.org/wiki/Heapsort
-
你写的实现是 O(n log n)。 O(n) 算法见stackoverflow.com/a/1793961/2166798。该帖子中给出了其工作原理的解释,但互联网上也有许多其他描述。
标签: c++ data-structures stl heap priority-queue