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

Ksh*_*hli 6 c++ algorithm big-o priority-queue

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

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

Jim*_*hel 10

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

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

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

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

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

  • 感谢你的回答。/sf/ask/208212931/对此有更多解释。第一个答案说弹出/删除是 O(2*log(N))。在您的情况下,这是否意味着“从优先级队列中删除 n 个项目也是 O(n * log(n))”。应该修改为“从优先级队列中删除n个项目也是O(n * 2* log(n))。”?或者没关系? (2认同)
  • @RaghavNavada 在渐近分析中,我们通常会忽略常数因素。所以 O(n*log(n)) 被认为与 O(n*2*log(n)) 相同。 (2认同)