中位数算法中位数:为什么将数组划分为大小为5的块

时间:2013-08-07 06:02:29

标签: algorithm time-complexity array-algorithms

在中位数算法算法中,我们需要将数组划分为大小为5的块。我想知道算法的发明者是如何得出神奇的数字' 5'而不是,可能是,7,或9或其他什么?

4 个答案:

答案 0 :(得分:5)

算法的数量必须大于3(显然是奇数)。 5是大于3的最小奇数。因此选择了5。

答案 1 :(得分:2)

我认为,如果您检查" O(n)运行时间的证明" medians-of-medians algorithm的维基页面部分:

  

计算中值的递归调用不会超过最坏情况的线性行为,因为中位数列表是列表大小的20%,而另一个递归调用最多会在列表的70%上进行递归,从而使得运行时间

     

Image

     

O(n)项c n用于分区工作(我们对每个元素进行了固定次数的访问,以便将它们形成为n / 5组并在O(1)时间内取每个中值)。   由此,使用归纳法,可以很容易地表明

     

Image

这应该有助于你理解,为什么。

答案 2 :(得分:0)

您还可以使用大小为3或4的块,如K. Chen和A. Dumitrescu(2015)的论文Select with groups of 3 or 4所示。这个想法是两次使用“中位数中位数”算法并在此之后进行分区。这降低了枢轴的质量,但速度更快。

所以而不是:

T(n) <= T(n/3) + T(2n/3) + O(n)
T(n) = O(nlogn)
一个人得到:

T(n) <= T(n/9) + T(7n/9) + O(n)
T(n) = Theta(n)

答案 3 :(得分:0)

请参阅Brilliant.org上的说明。基本上,五个是我们可以用来维持线性时间的最小数组。用n = 5大小的数组实现线性排序也很容易。 laTex的歉意:

为什么5?

中位数中位数将列表分为长度为5到5的子列表 获得最佳的运行时间。记住,求小 通过蛮力(排序)列出的列表会花费少量时间,因此 子列表的长度必须相当小。但是,调整 子列表的大小为3,例如,确实更改了 更糟。

如果算法将列表分为长度为pp的三个子列表 将大于大约\ frac {n} {3} 3 n个元素,并且 它会小于大约\ frac {n} {3} 3 n个元素。 这会导致最坏的情况\ frac {2n} {3} 3 2n递归, 产生递归T(n)= T \ big(\ frac {n} {3} \ big)+ T \ big(\ frac {2n} {3} \ big)+ O(n),T(n)= T(3 n)+ T(3 2n)+ O(n), 根据主定理,它是O(n \ log n),O(nlogn),这要慢一些 而不是线性时间。

实际上,对于形式T(n)\ leq T(an)+ T(bn)+ cnT(n)≤T(an)+ T(bn)+ cn,如果a + b <1a + b <1,则递归将满足 O(n)O(n),如果a + b> 1a + b> 1,则重复率通常等于 \ Omega(n \ log n)Ω(nlogn)。 [3]

中位数算法可以使用大于 5(例如7)并保持线性运行时间。但是,我们需要 保持子列表的大小尽可能小,以便对 子列表可以在实际上恒定的时间内完成。