从集合构造 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)之源码解读,及最小顶堆实现研究

Java Review - PriorityQueue源码解读

Java Review - PriorityQueue源码解读