如何在O(n)中长度为n的未排序数组中找到第k个最大元素?
我相信有一种方法可以找到O(n)中长度为n的未排序数组中的第k个最大元素。或者也许是“预期的” O(n)之类的东西。我们应该怎么做?
回答:
这称为查找第 。有一个非常简单的随机算法(称为 quickselect
),它占用了O(n)
平均时间,O(n^2)
最坏情况下的时间,还有一个相当复杂的非随机算法(称为 introselect
),它占用了O(n)
最坏情况的时间。在Wikipedia上有一些信息,但这不是很好。
您需要的所有内容都在
这些PowerPoint幻灯片中。仅提取O(n)
最坏情况算法的基本算法(introselect):
Select(A,n,i): Divide input into ⌈n/5⌉ groups of size 5.
/* Partition on median-of-medians */
medians = array of each group’s median.
pivot = Select(medians, ⌈n/5⌉, ⌈n/10⌉)
Left Array L and Right Array G = partition(A, pivot)
/* Find ith element in L, pivot, or G */
k = |L| + 1
If i = k, return pivot
If i < k, return Select(L, k-1, i)
If i > k, return Select(G, n-k, i-k)
在Cormen等人的《算法介绍》一书中,它也做了非常详细的介绍。
以上是 如何在O(n)中长度为n的未排序数组中找到第k个最大元素? 的全部内容, 来源链接: utcz.com/qa/408239.html