从集合构造PriorityQueue的时间复杂度是多少?
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项之和。
请参阅此答案,还请参阅本文,该文章适用于数学。
以上是 从集合构造PriorityQueue的时间复杂度是多少? 的全部内容, 来源链接: utcz.com/qa/411397.html