【发布时间】:2019-02-03 09:05:58
【问题描述】:
我必须从一个数组中构造一个最大堆(在下面的代码中称为nums),所以我使用的是java.util.PriorityQueue。
我的代码如下所示:
PriorityQueue<Integer> pq = new PriorityQueue<>(nums.length, (a, b) -> b - a);
for (int i = 0; i < nums.length; i++) {
pq.offer(nums[i]);
}
我正在尝试找出上述for 循环的时间复杂度(以 Big-O 表示法表示)。
我了解PriorityQueue 没有具体说明底层数据结构的增长细节。 (在最坏的情况下,当扩展内部数组并将所有元素复制到新分配的空间时,它可能是O(n))。
但我假设当我指定initialCapacity 并且不添加超过此initialCapacity 的元素时,上述循环的最坏情况时间复杂度应该是O(n) 而不是O(nlog(n))。我从here 了解到,堆的构建时间是O(n),而nlog(n) 是一个宽松的上限。
我是对的,还是我遗漏了什么?
我只是想了解,如果我用n 的initialCapacity 配置我的PriorityQueue 并在该优先级队列中添加n 元素,那么这个构建堆过程的时间复杂度是多少?
PS:我已经看过 this,但是这个问题的答案只是声称没有解释,可能它们不是 Java 特定的。
我还看到java.util.PriorityQueue 有一个接受Collection 的构造函数。这个构造函数的时间复杂度是多少?不应该是O(n)吗?
【问题讨论】:
-
prioriyQueue 在 O(logn) 中工作,总数为 O(log(n) * num.length)
-
@JahongirSabirov 我想知道(有解释),在我的具体实现中,我应该假设它在
O(nlog(n))或PriorityQueue的JDK 实现中工作,我得到O(n)当我指定initialCapacity -
您提出的问题取决于
PriorityQueue的实现细节。如果您真的想了解您的代码将如何执行,您需要自己进行复杂性分析……针对特定的实现。幸运的是,源代码是免费提供的。
标签: java algorithm time-complexity priority-queue