【问题标题】:What is the time complexity of constructing a PriorityQueue from a collection?从集合构造 PriorityQueue 的时间复杂度是多少?
【发布时间】:2016-04-14 02:26:59
【问题描述】:

带有Collection 的Java 的PriorityQueue 构造函数的复杂度是多少? 我使用了构造函数:

PriorityQueue(Collection<? extends E> c)

复杂度是O(n)还是O(n*log(n))?

【问题讨论】:

  • 简答,创建或构造堆[heapify]时间复杂度为:O( N )

标签: java collections heap priority-queue binary-heap


【解决方案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,通过数学运算。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 2021-03-13
    • 2018-11-24
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多