Java优先级队列(堆)插入n个元素的时间复杂性?

Java优先级队列(堆)插入n个元素的时间复杂性?,java,time-complexity,heap,priority-queue,Java,Time Complexity,Heap,Priority Queue,我想知道JavaPriorityQueue.Add()对于n元素的时间复杂度是多少 我知道单个元素的潜在最坏情况是插入O(log(n)),但我不清楚插入n元素集合的时间复杂度是多少 我已经看到来自不同来源的声明(没有证据)说构建n元素的优先级队列堆的时间是O(n),也看到过声明是O(nlog(n)),给定插入是O(log(n)),乘以n的时间实际上等于O(nlog(n)) 注:我只对更坏的情况感兴趣,而不是摊销 这个问题假设有一种逻辑方法来描述用n元素填充数据结构(堆)的行为,这与单独考虑nxl

我想知道Java
PriorityQueue.Add()
对于
n
元素的时间复杂度是多少

我知道单个元素的潜在最坏情况是插入
O(log(n))
,但我不清楚插入
n
元素集合的时间复杂度是多少

我已经看到来自不同来源的声明(没有证据)说构建
n
元素的优先级队列堆的时间是
O(n)
,也看到过声明是
O(nlog(n))
,给定插入是
O(log(n))
,乘以
n
的时间实际上等于
O(nlog(n))

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

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


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

似乎n个元素的插入应该是O(n logn)

Java优先队列()

O(对数n)入围和退围方法的时间(报价、投票、, 删除()并添加)

O(n)表示移除(对象)和包含(对象)方法

O(1)检索方法(peek、元素和大小)

这些时间复杂性似乎都是最糟糕的情况(),除了
.add()
。您对边界的质疑是正确的,因为Java文档还声明了此未绑定结构的扩展:

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

正如它们在文档中所述,PriorityQueue基于具有特定初始容量的数组。我假设增长将花费O(n)个时间,这也是
.add()
最糟糕的时间复杂度

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

PriorityQueue(int initialCapacity)

编辑:
对于O(n)的索赔,施工时间是正确的(如@pjs在评论中所述)。此过程经常被调用,并在一个预先存在的数组上工作,该数组用于在O(n)时间内在其上构建二叉树。

一般情况下是O(n log n)。对于输入已经排序的特殊情况,存在一个O(N)算法,但在
java.util.PriorityQueue

中没有提供这一算法。下面的家伙使用了错误的定义。插入数据结构的时间复杂度通常意味着,如果结构中有n个元素,那么插入1个元素的时间复杂度是多少。你说插入n个元素。如果要插入n,则不能插入小于n的元素。@MarianP是否没有标准的逻辑方法来描述用
n
元素“填充”数据结构的行为?这是一个相当常见的场景。@pjs是的,你是对的,这是重复的。我将把我的投票添加到结束语中,并指出现有的问题有趣的是,假设输入是特定类型的,有更多复杂的方法可以按线性时间排序,有些方法在这篇文章中提到:@gue-Oh-yeah。例如,如果输入已经处于正确的PQ顺序,则它只是
PQ.a[i++]=input.nextElement()
。不需要预排序数据,有一个θ(n)算法可以处理任何数据集。查看链接的答案。如何:日志1,日志2。。。日志N用于插入第1、第2、。。。。第n元素?日志1+日志2+…+log N=log N!很抱歉,但是您的直觉(以及您的答案)对于构建堆是错误的。我已将此标记为副本,您可以在那里找到正确答案以及指向来源和证据的多个链接。感谢您的反馈,我修改了我答案的这一部分。我不认为这是重复的,因为问题与特定Java容器的.add()方法有关,而与一般堆的构造无关。