【问题标题】:Time complexity of a Priority Queue in C++C++中优先级队列的时间复杂度
【发布时间】:2017-06-20 10:43:42
【问题描述】:

创建堆需要 O(n) 时间,而插入堆(或优先级队列)需要 O(log(n)) 时间。

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

此外,如果清空整个堆(即 n 次删除),同样的结果也会成立,对吧?

【问题讨论】:

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您的回答。 stackoverflow.com/questions/2974470/… 对此有更多解释。那里的第一个答案说弹出/删除是O(2 * log(N))。这是否意味着在您的情况下,“从优先级队列中删除 n 个项目也是 O(n * log(n))。”应该修改为“从优先级队列中删除 n 个项目也是 O(n * 2* log(n))。”?还是没关系?
  • @RaghavNavada 在渐近分析中,我们通常会忽略常数因子。所以 O(n*log(n)) 被认为与 O(n*2*log(n)) 相同。
  • 如果我们从vector构建stl优先级队列的时间复杂度是多少?它会一次又一次地调用insert方法并取nlogn还是会像0(n)中的正常构建堆一样。
猜你喜欢
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
相关资源
最近更新 更多