【问题标题】:Optimal median of medians selection - 3 element blocks vs 5 element blocks?中位数选择的最佳中位数 - 3 个元素块与 5 个元素块?
【发布时间】:2011-04-23 21:53:00
【问题描述】:

我正在研究基于the Select algorithm 的快速排序变体实现,以选择一个好的枢轴元素。传统的智慧似乎是将数组分成 5 个元素的块,取每个块的中值,然后递归地对生成的中值应用相同的分块方法以获得“中值的中值”。

让我困惑的是选择 5 元素块而不是 3 元素块。在我看来,对于 5 元素块,您执行 n/4 = n/5 + n/25 + n/125 + n/625 + ... median-of-5 操作,而对于 3 元素块,您执行 n/2 = n/3 + n/9 + n/27 + n/81 + ... median-of-3 操作。由于每个 5 的中位数是 6 次比较,每个 3 的中位数是 2 次比较,这导致使用中位数为 5 的3*n/2 比较和使用中位数为 3 的n 比较。

谁能解释这种差异,以及使用 5 元素块的动机是什么?我不熟悉应用这些算法的通常做法,所以也许有一些方法可以减少一些步骤,并且仍然“足够接近”中位数以确保良好的枢轴,并且这种方法更适用于 5 元素块?

【问题讨论】:

  • 任何大于 3 的块都保证线性时间。偶数大小听起来可能是个糟糕的选择,但您选择了除中位数以外的其他排名(因此无论枢轴是否小于或大于您正在搜索的排名,最坏的情况下都会丢弃相同的大小)。跨度>
  • 我很想看看为什么大小为 2 和 3 的块不是线性的真实证据。如果a+b < 1,我们可以推断T(n) = T(an) + T(bn) + O(n)是线性的,但是我不知道如何证明相反的。

标签: algorithm language-agnostic sorting quicksort median


【解决方案1】:

原因是通过选择 3 个块,我们可能会失去 O(n) 时间算法的保证。

对于 5 个块,时间复杂度为

T(n) = T(n/5) + T(7n/10) + O(n)

对于 3 个块,结果是

T(n) = T(n/3) + T(2n/3) + O(n)

看看这个:http://www.cs.berkeley.edu/~luca/w4231/fall99/slides/l3.pdf

【讨论】:

  • 只是好奇,你能澄清一下 "T(n) ≤ T(n/5) + T(0.7n) + cn" 是如何跟随 "T (n) ≤ c*n*(1 + (9/10) + (9/10)^2 + ...)" ?这是我在维基百科文章和您的论文中没有得到的一部分。谢谢!
  • @Nikita:查看它的一种方法是将其写为 T(n)
  • @NikitaRybak :你必须解开递归。我建议使用alphabeta 而不是实际的常量。在 3 个(艰苦的)关卡之后,你会看到一个模式。 cn*[1 + (a+b) + (a+b)^2 + (a+b)^3 + ...]。现在:注意这是一个几何级数,如果r<1,总和会收敛到1/(1-r)!这在我们的例子中是正确的,但在 3 元素的例子中不是
  • @ihadanny,这不是我得到的。对于每个元素a^i * b^j,都有一个乘法常数(i+j)! / i! / j!。我对复杂性的总体结果是O(n * sum[i = 0 -> loga(n)] sum [j = 0 -> logb(n/a^i)] (i+j)! / i! / j! * a^i * b^j,这似乎并没有简化到你所拥有的。
【解决方案2】:

我相信这与确保“好的”拆分有关。划分为 5 个元素块可确保最坏情况下的拆分为 70-30。标准参数是这样的:在n/5 块中,至少一半的中位数 >= 中位数的中位数,因此至少一半的n/5 块至少有 3 个元素(1/2 5) >= median-of-medians,这给出了一个3n/10 拆分,这意味着在最坏的情况下另一个分区是7n/10

这给了T(n) = T(n/5) + T(7n/10) + O(n)

由于n/5 + 7n/10 < 1,最坏情况的运行时间是O(n)

选择 3 元素的块是这样的:至少一半的 n/3 块至少有 2 个元素 >= 中位数,因此这给出了 n/3 拆分,或者 2n/3 在最坏的情况下案例。

这给了T(n) = T(n/3) + T(2n/3) + O(n)

在这种情况下,n/3 + 2n/3 = 1,所以它在最坏的情况下减少到 O(n log n)

【讨论】:

    【解决方案3】:

    您可以使用大小为 3 的块!是的,我和你一样惊讶。 2014 年(你在 2010 年问过)有一篇论文展示了如何做到这一点。

    想法如下:而不是做median3partitionmedian3partition,...,你做median3median3partitionmedian3median3, partition, ... .在论文中,这被称为“重复步骤算法”。

    所以而不是:

    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)
    

    上述文章是 K. Chen 和 A. Dumitrescu 的Select with Groups of 3 or 4 Takes Linear Time(2014,arxiv),或Select with groups of 3 or 4(2015,作者主页)。

    PS:A. Alexandrescu(以 D 语言闻名!)的 Fast Deterministic Selection 展示了如何更有效地实现上述内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      • 2012-12-25
      • 1970-01-01
      • 2021-09-10
      • 2010-11-06
      相关资源
      最近更新 更多