当前位置: 首页 > 知识库问答 >
问题:

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

邵逸明
2023-03-14

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

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

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

共有1个答案

邵胜涝
2023-03-14

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

如果您有一个空的优先级队列,要向其中添加<code>n</code>项,一次添加一个,则复杂性为O(n*log(n))。

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

从优先级队列中删除<code>n

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

 类似资料:
  • 我有一个优先级队列最大堆,其中每个元素都是一个名为Task的类,如下所示(在Java中实现,但问题与语言无关): 堆显然是按优先级排序的。我要执行的操作是查找优先级最高的项目,递减其 Time 值,并在时间分数更改为 0 时将其从堆中删除。但是,这里有一个问题:允许有多个具有相同优先级的任务。在这种情况下,我比较所有此类任务的ID分数,并对最低的任务进行操作。 此类操作的最坏运行时间是多少?如果每

  • 构建堆的时间复杂度为O(n)。问题是Java优先级队列是否可以实现它?让我们举一个例子: ... 现在我们可以看到,它将按照自然顺序进行排序,即递增顺序。Java没有一个构造函数既接受列表又接受比较器。如果我想创建Max Heap,则如下所示: ... ... 如果我想使用PriorityQueue对自定义类进行排序,那么它将永远无法实现构建堆O(n)。或者我们可以吗?

  • 我用的是邻接矩阵,优先队列是数据结构。 根据我的计算,复杂度为: 同时循环: 检查相邻顶点: 检查队列是否条目已经存在,并更新相同的: 但是,我到处都读到复杂性是 请解释。

  • 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 () 圆括号 (表达式)/函数名(形参表) . 成员选择(对象) 对象.成员名 -> 成员选择(指针) 对象指针->成员名 2 - 负号运算符 -表达式 右到左 单目运算符 (类型) 强制类型转换 (数据类型)表达式 ++ 自增运算符 ++变量名/变量名++ 单目运算符 -- 自减运算符 --变

  • 我需要一个优先级队列,它首先获得具有最高优先级值的项目。我当前正在使用队列库中的PriorityQueue类。但是,这个函数只先返回值最小的项。我尝试了一些很难看的解决方案,比如(sys.maxint-priority)作为优先级,但我只是想知道是否存在更优雅的解决方案。

  • 该程序属于优先级队列,其中我将字符串存储为数据,队列使用链表创建。编号最少的元素(作为优先级编号)具有更高的优先级,即它将插入头节点,因此在移除(pop或出列)时,该元素将首先移除。(例如,1的优先级高于2) 〈代码〉而(tem- 它没有显示所需的输出,但正在崩溃 我将akash作为优先级1,rahul作为优先级2,neymar再次作为优先级1,它应该为最后两个printf语句打印akash和ne