查找O(n)时间中的日志n个最大条目

时间:2020-06-17 18:06:08

标签: algorithm data-structures time-complexity heap

有没有一种方法可以在O(n)时间中找到具有n个元素的数组中的对数n个最大元素?

我将创建一个基于数组的HeapPriorityQueue,因为如果所有元素都可用,则可以使用自下而上的堆构造在O(n)时间内创建堆。 然后,删除此优先级队列的第一个元素应该在O(1)时间是't?

2 个答案:

答案 0 :(得分:4)

然后删除此优先级队列的第一个元素应该在O(1)时间是't?

这将是O(logn),因为您还将删除第一个元素。看着它而不删除是O(1)。重复此删除操作logn将是O(log^2(n)),它仍然在O(n)中,因此此解决方案确实可以满足要求。

另一种选择是使用selection algorithm直接查找第log(n)个元素,也就是O(n)

答案 1 :(得分:1)

基本上,是的。堆的创建需要O(n),这在算法中占主导地位。

如果删除后堆没有更新其键,则删除第一个元素可能会占用O(1),否则会占用O(log n)。无论哪种方式,通过和不通过更新从堆中删除log(n)元素的复杂度分别为O(log n * log n)和O(log n)。两者都是次线性的。