Java PriorityQueue(堆)插入n个元素的时间复杂度?

Jam*_*zba 6 java heap priority-queue time-complexity

我想知道是什么的Java的时间复杂度PriorityQueue.Add()为n元素.

我理解可能更糟糕的情况下插入单个元素O(log(n)),但我不清楚插入n元素集合的时间复杂度是多少?

我已经看到来自各种来源(没有证明)的声明,即构建优先级队列堆n元素的时间O(n),并且还看到声称它是O(nlog(n)),这在插入时是有意义的O(log(n)),乘法n倍数确实相等O(nlog(n))

注意:我只对更坏的情况感兴趣,而不是摊销.

这个问题假设有一种逻辑方式来描述用n元素填充数据结构(堆)的行为,这与单独考虑nx log(n)插入不同.

我没有对输入做任何假设(例如输入值集的边界或部分有序的输入).

gue*_*gue 8

看起来n个元素的插入应该是O(n log n)

Java PriorityQueue(Java Doc)

O(log n)时间用于enqueing和dequeing方法(offer,poll,remove()和add)

O(n)用于remove(Object)和contains(Object)方法

O(1)用于检索方法(查看,元素和大小)

这些时间复杂性似乎都是最糟糕的情况(维基),除了.add().您正确地质疑边界,因为Java Doc也声明了这个未绑定结构的扩展:

未指定增长政策的详细信息

正如他们在Doc中所述,PriorityQueue基于具有特定初始容量的阵列.我认为增长将花费O(n)时间,这也是最糟糕的时间复杂度.add().

要获得保证添加n个元素的O(n log n)时间,您可以声明n个元素的大小以省略容器的扩展:

PriorityQueue(int initialCapacity)
Run Code Online (Sandbox Code Playgroud)

编辑: O(n)施工时间的索赔是正确的(如评论中@pjs所述).此过程通常称为heapify,适用于预先存在的数组,该数组用于在O(n)时间内在其上构建二叉树.

  • 感谢您的反馈,我修改了我的部分答案.我不认为这是一个副本,因为问题与特定Java容器的.add()方法有关,而与一般堆的构造无关. (3认同)
  • 对不起,但是你的直觉(以及你的答案)对于构建堆是错误的.我将此标记为重复,您可以找到正确的答案以及那里的源和证明的多个链接. (2认同)

use*_*421 6

在一般情况下,它是O(N log N)。的O(N)算法存在其中输入已经订购的特殊情况下,但这不是在设置java.util.PriorityQueue。

  • 不需要预先排序的数据,有一种适用于任何数据集的 Theta(n) 算法。请参阅链接的答案。 (2认同)