有人能解释排序和未排序的优先级队列的渐近复杂性吗?

时间:2013-02-13 11:16:24

标签: c++ algorithm heap complexity-theory priority-queue

对于已排序的基础容器,为什么要创建优先级队列O(nlogn)时间,但对于未排序的基础容器,只需要花费O(n)时间来创建?另外,为什么需要(在排序的情况下)O(nlogn)对优先级队列进行排序?

在任何一种情况下,是否有任何有用的图表可以帮助我了解运行时间?在这些情况下使用堆会更快吗?

2 个答案:

答案 0 :(得分:0)

可以使用max-heap实现优先级队列。实际上,最大堆为我们提供了优先级队列的渐近最优实现。因此,在未排序的底层容器的情况下,为了创建优先级队列,我们​​只需要从n个元素中创建一个堆,这可以在O(n)时间内使用Heapify algorithm来完成。在排序的情况下,我们需要对已知为Theta(n)绑定的元素进行完全排序。

答案 1 :(得分:0)

我认为你的问题一般无法回答,因为没有唯一的方法来实现优先级队列。

它由它能够执行的操作定义,并且有很多方法可以实现它,堆或AVL树只是为了一些可能性。

您必须查找用于回答此问题的STL实现所选择的实现。

在SGI实施的文档中,它写着:

  

[2]这个限制是priority_queue存在的唯一原因   所有。如果迭代元素很重要,您可以使用   以排序顺序或集合或向量维护的向量   使用make_heap,push_heap和pop_heap作为堆维护。   事实上,Priority_queue是作为随机访问容器实现的   它被保存为堆。使用容器的唯一原因   适配器priority_queue,而不是执行堆操作   手动,是要明确表示你永远不会执行任何操作   可能违反堆不变量的操作。

所以它似乎只是按照你的建议使用堆。