【问题标题】:selection algorithm for median中位数选择算法
【发布时间】:2013-10-25 05:23:38
【问题描述】:

我试图了解寻找中位数的选择算法。我已经粘贴了下面的伪代码。

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

【问题讨论】:

  • 这可能意味着他只会排序并选择中间值。也许发布你得到这个的网站
  • 是的。蛮力将使用类似于选择排序的算法来找到中间值。

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


【解决方案1】:

普遍的看法是,对于小输入,快速排序比插入排序慢。因此,许多实现在某个阈值处切换到插入排序。

the Wikipedia page on Quicksort 中有对这种做法的参考。 Here's an example 的商业合并排序代码,可切换到小输入的插入排序。这里的阈值为 7。

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

但是,我在实践中发现,常识并非普遍正确。当我运行基准测试时,切换的积极影响或消极影响很小。那是为了快速排序。在分区算法中,它更有可能不是负数,因为分区的一侧在每一步都被丢弃,因此花费在小输入上的时间更少。这在@Dennis 对this SO question 的回复中得到了验证。

【讨论】:

    【解决方案2】:

    代码必须来自here

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

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

    【讨论】:

      猜你喜欢
      • 2020-05-04
      • 2018-05-20
      • 1970-01-01
      • 2021-07-30
      • 2015-07-15
      • 2020-06-21
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      相关资源
      最近更新 更多