C ++中优先级队列的时间复杂度

时间:2017-06-20 10:43:43

标签: c++ algorithm big-o priority-queue

创建堆需要O(n)时间,而插入堆(或优先级队列)需要log(n)时间。取n个输入并将它们插入优先级队列,操作的时间复杂度是多少。 O(n)或O(n * log(n))。

此外,在清空整个堆的情况下也会保持相同的结果(即n个删除),对吗?

1 个答案:

答案 0 :(得分:7)

如果你有一个大小为n的数组,并且你想同时从所有项目构建一个堆,Floyd的算法可以用O(n)复杂度来做。见Building a heap。这对应于接受容器参数的std::priority_queue constructors

如果您有一个空的优先级队列,要一次添加n个项目,那么复杂性为O(n * log(n))。

因此,如果您在构建之前拥有将进入队列的所有项目,那么第一种方法将更有效。当您需要维护队列时,可以使用第二种方法 - 单独添加项目:在一段时间内添加和删除元素。

从优先级队列中删除n项也是O(n * log(n))。

std::priority_queue的文档包含所有操作的运行时复杂性。