当前位置: 首页 > 面试题库 >

从集合构造PriorityQueue的时间复杂度是多少?

鲁成天
2023-03-14
问题内容

Java的PriorityQueue构造函数与的复杂度是Collection多少?我使用了构造函数:

PriorityQueue(Collection<? extends E> c)

复杂度是O(n)还是O(n * log(n))?


问题答案:

PriorityQueue从集合(甚至是未排序的集合)初始化a的时间复杂度为O(n)。在内部,它使用一个过程siftDown()来就地“堆化”数组。(这在文献中也称为下推式)。

这是违反直觉的。似乎将元素插入到堆中是O(log n),所以插入n个元素会导致O(n log
n)复杂性。如果您一次插入一个元素,则为true。(在内部,使用插入单个元素可以完成此操作siftUp()。)

堆放单个元素肯定是O(log n),但是“窍门”
siftDown()在于,随着每个元素的处理,必须筛选通过的元素数量不断减少。因此,总复杂度不是n个元素乘以log(n);它是筛选剩余元素的成本降低的n项之和。

请参阅此答案,还请参阅本文,该文章适用于数学。



 类似资料:
  • 此处声明: TreeSet为add()/remove()/contains()提供了日志(n)时间复杂性保证。 但是使用二叉查找树,在最坏的情况下,二叉查找树可以有O(n)高度。log(n)复杂性如何“保证”?

  • 问题内容: 我当时在看这个pycon演讲,时间是34:30,发言人说,可以在中完成获取元素列表中最大的元素的操作。 那怎么可能?我的理解是,创建堆将是,但是其本身的复杂性是还是(以及(实际的算法是什么))? 问题答案: 扬声器在这种情况下是错误的。实际费用为。仅在可迭代的第一个元素上调用堆化。就是那个,但如果小于,则微不足道。然后,将所有剩余的元素一次通过添加到此“小堆”中。每次调用需要花费时间。

  • 问题内容: ES6规范为键集合(Set,Map,WeakSet和WeakMap)提供什么时间复杂度(大O表示)? 我的期望,我期望的大多数开发人员,是规范和实现将使用被广泛接受的高性能算法,在这种情况下,并在平均情况下都是O(1)。这同样适用于和等效物。 对我来说,实现的时间复杂性是否在例如ECMAScript 2015 Language Specification-6th Edition — 2

  • 问题内容: 我在Java类中有一个私有的LinkedList,并且经常需要检索列表中的最后一个元素。列表需要缩放,所以我试图确定在进行更改时是否需要保留对最后一个元素的引用(以实现O(1)),或者LinkedList类是否已经通过getLast()调用完成了此操作。 LinkedList.getLast()的big-O成本 是多少 , 有记载吗? (即,我是否可以依靠此答案,或者即使它是O(1),

  • 问题内容: 我写了以下课程: 然后,在我的方法中,我创建了一个,向其中添加了一些具有“ X”和“ angle”字段的对象。 然后,我使用: 这种排序方法的复杂性是什么? 问题答案: 您可能已经阅读了有关Collections排序的文档,但是这里适合您: 排序算法是一种修改的mergesort(如果低子列表中的最高元素小于高子列表中的最低元素,则忽略合并)。该算法提供了有保证的n log(n)性能。

  • 注:∈/ 意思是不在,我不能在代码中输入。 这个问题可能与一些帖子重复。 理解Dijkstra算法的时间复杂度计算 Dijkstra算法的复杂性 Dijkstras算法的复杂性 我读过它们,甚至读过Quora上的一些帖子,但仍然无法理解。我在伪代码中添加了一些注释,并试图解决它。我真搞不懂为什么它是O(E log V)