中位数的选择算法

时间:2013-10-16 21:49:03

标签: algorithm brute-force median-of-medians

我试图理解用于找到中位数的选择算法。我已粘贴下面的伪代码。

SELECT(A[1 .. n], k):
if n<=25
use brute force
else
m = ceiling(n/5)
for i=1 to m
B[i]=SELECT(A[5i-4 .. 5i], 3)
mom=SELECT(B[1 ..m], floor(m/2))
r = PARTITION(A[1 .. n],mom)
if k < r
return SELECT(A[1 .. r-1], k)
else if k > r
return SELECT(A[r +1 .. n], k-r)
else
return mom

我有一个非常微不足道的怀疑。我想知道作者的意思是上面写的蛮力对于i <= 25。是因为他会将元素逐一与其他元素进行比较,看看它是第k个还是其他元素。

2 个答案:

答案 0 :(得分:0)

代码必须来自here

强力算法可以是任何简单而愚蠢的算法。在您的示例中,您可以对25个元素进行排序并找到中间元素。与选择算法相比,这是简单而愚蠢的,因为排序需要O(nlgn),而选择只需要线性时间。

n很小时,强力算法通常就足够了。此外,它更容易实现。阅读有关蛮力here的更多信息。

答案 1 :(得分:0)

常识是Quicksort比小输入的插入排序慢。因此,许多实现在某个阈值处切换到插入排序。

the Wikipedia page on Quicksort中提到了这种做法。 Here's an example商业合并代码,切换到小输入的插入排序。这里的门槛是7。

“蛮力”几乎肯定是指这里的代码使用相同的做法:插入排序,然后选中中间元素。

然而,我在实践中发现,普遍的智慧通常不正确。当我运行基准测试时,开关具有非常小的正面效果或负面效果。那是Quicksort。在Parition算法中,它更可能是负面的,因为分区的一侧在每一步都被抛弃,因此花在小输入上的时间更少。这在@ Dennis对this SO question的回复中得到了验证。