有没有一种方法可以在O(n)时间中找到具有n个元素的数组中的对数n个最大元素?
我将创建一个基于数组的HeapPriorityQueue,因为如果所有元素都可用,则可以使用自下而上的堆构造在O(n)时间内创建堆。 然后,删除此优先级队列的第一个元素应该在O(1)时间是't?
答案 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)。两者都是次线性的。