在 O(n) 时间内找到 log n 个最大条目
Find log n greatest entries in O(n) time
有没有办法在 O(n) 时间内找到 n 个元素的数组中的 log n 个最大元素?
我会创建一个基于数组的 HeapPriorityQueue,因为如果所有元素都可用,则可以使用自下而上的堆构造在 O(n) 时间内创建堆。
那么移除这个优先级队列的第一个元素应该在 O(1) 时间内不是吗?
Then removing the first element of this priority queue should be in O(1) time isn`t?
那将是 O(logn)
,因为您还删除了第一个元素。只看不删是O(1)。重复这个删除logn
次,就是O(log^2(n))
,还在O(n)
,所以这个方案确实可以满足要求。
另一种选择是使用 selection algorithm 直接找到第 log(n)
个最大的元素,这也是 O(n)
。
基本上是的。堆的创建需要 O(n),这在算法中占主导地位。
如果堆在删除后不更新它的键,则删除第一个元素可能需要 O(1),如果这样做,则可能需要 O(log n)。无论哪种方式,从堆中删除 log(n) 元素并更新和不更新的复杂度分别为 O(log n * log n) 和 O(log n)。两者都是次线性的。
有没有办法在 O(n) 时间内找到 n 个元素的数组中的 log n 个最大元素?
我会创建一个基于数组的 HeapPriorityQueue,因为如果所有元素都可用,则可以使用自下而上的堆构造在 O(n) 时间内创建堆。 那么移除这个优先级队列的第一个元素应该在 O(1) 时间内不是吗?
Then removing the first element of this priority queue should be in O(1) time isn`t?
那将是 O(logn)
,因为您还删除了第一个元素。只看不删是O(1)。重复这个删除logn
次,就是O(log^2(n))
,还在O(n)
,所以这个方案确实可以满足要求。
另一种选择是使用 selection algorithm 直接找到第 log(n)
个最大的元素,这也是 O(n)
。
基本上是的。堆的创建需要 O(n),这在算法中占主导地位。
如果堆在删除后不更新它的键,则删除第一个元素可能需要 O(1),如果这样做,则可能需要 O(log n)。无论哪种方式,从堆中删除 log(n) 元素并更新和不更新的复杂度分别为 O(log n * log n) 和 O(log n)。两者都是次线性的。