从集合构造 PriorityQueue 的时间复杂度是多少?
Posted
技术标签:
【中文标题】从集合构造 PriorityQueue 的时间复杂度是多少?【英文标题】:What is the time complexity of constructing a PriorityQueue from a collection? 【发布时间】:2016-04-14 02:26:59 【问题描述】:带有Collection
的Java 的PriorityQueue 构造函数的复杂度是多少?
我使用了构造函数:
PriorityQueue(Collection<? extends E> c)
复杂度是O(n)还是O(n*log(n))?
【问题讨论】:
简答,创建或构造堆[heapify]时间复杂度为:O( N )
【参考方案1】:
从一个集合中初始化一个 PriorityQueue
的时间复杂度是 O(n),即使是一个未排序的集合。在内部,这使用了一个名为siftDown()
的过程来就地“堆”一个数组。 (这在文献中也称为下推。)
这是违反直觉的。似乎将一个元素插入堆是 O(log n),因此插入 n 个元素会导致 O(n log n) 复杂度。如果您一次插入一个元素,这是正确的。 (在内部,使用siftUp()
插入单个元素。)
堆积单个元素肯定是 O(log n),但siftDown()
的“技巧”是随着每个元素的处理,它必须被筛选过去的元素数量不断减少。所以总复杂度不是 n 个元素乘以 log(n);它是筛选剩余元素的成本递减的 n 项之和。
请参阅this answer,另请参阅this article,通过数学运算。
【讨论】:
以上是关于从集合构造 PriorityQueue 的时间复杂度是多少?的主要内容,如果未能解决你的问题,请参考以下文章
Java的PriorityQueue构造函数调用和addAll方法的区别
Java集合数据结构——优先级队列 (堆PriorityQueue)
java - 如何使用PriorityQueue集合从Java中的给定数组在O(n)时间内构建最大堆?
Java 集合深入理解 :优先队列(PriorityQueue)之源码解读,及最小顶堆实现研究