【问题标题】:Why can't the median-of-medians algorithm use block size 3?为什么中位数算法不能使用块大小 3?
【发布时间】:2012-02-01 03:31:48
【问题描述】:

我正在分析确定性中位数发现,假设输入被分为 3 个部分而不是 5 个部分,问题是它在哪里分解?

确定性中值查找算法:

SELECT(i, n)

  1. 将 n 个元素分成 5 个一组。 死记硬背找到每个 5 元素组的中位数。

  2. 递归选择 ⎣n/5⎦ 的中位数 x 将中位数分组为枢轴。

  3. 围绕轴 x 进行分区。设 k = rank(x)

4.如果 i = k 则返回 x

否则我

然后递归地选择第 i 个 下部最小元素

否则递归选择第 (i-k) 个 上半部分的最小元素

我对算法进行了分析,我相信第 1 步和第 3 步将花费 O(n),其中只需恒定时间即可找到 5 个元素的中位数,而第 2 步需要 T(n/5).so至少 3/10 的元素≤ p,并且至少 3/10 的数组≥ p,因此,步骤 4 将 T(7n/10) 并且将得到递归。 T(n) ≤ cn + T(n/5) + T(7n/10), 但是当我将元素分成 3 组时,假设 9 个元素,我将它们分成组,这样:

{1,2,10} {4,11,14}, {15,20,22}

我得到了中位数 2,11,20 和 p=11。

一般来说,在五人组中,可以说 g = n/5 组,并且至少 ⌈g/2⌉ 其中(中位数≤p的组)五个元素中至少三个≤p。所以元素总数≤p至少为3⌈g/2⌉≥3n/10。但是在 3 组中,我们可以得到所有三个元素可能小于 p。在这里我认为算法会崩溃!

我的想法正确吗???

【问题讨论】:

  • 所以你有一些算法并参考“步骤1”等。你说的这个算法到底是什么?那些步骤是什么?如果您不显示您正在分析的内容,我们应该如何检查您的分析?您也可以进行拼写检查/...您的问题,使其阅读起来更愉快。
  • 抱歉我忘记写算法了!!
  • rank(x) 到底是什么?
  • 可以,但你必须使用两次“中位数的中位数”,见stackoverflow.com/a/39288513/1037407

标签: algorithm selection complexity-theory big-o


【解决方案1】:

在 3 人组中,对于 5 人组,大约一半的组的中位数元素小于中位数的中位数,因此在这些组中,您可以丢弃小于中位数的元素。在您的情况下,(1,2,10) 的中位数小于 11,因此您可以丢弃 1 和 2。

我认为 3 人一组的问题在于成本计算。 3(floor(floor(n/5)/2 - 2) 大约是 3n/10 变成 2(floor(floor(n/3)/2 -2) 左右,大约是 n/3。这意味着7n/10 变为 2n/3。 floor(n/5) 变为 floor(n/3),因此您将得到 2cn/3 + cn/3 = 而不是 7cn/10 + 2cn/10 = 9cn/10 cn,而不是 T(n)

看起来你实际上可以在递归的每个阶段扔掉更多的元素,但递归将剩余的工作量除以 3,而不是 5,这不足以实现收支平衡。

【讨论】:

  • 感谢您的回复。问题说,将 3 组中的元素分开不起作用,他要求我们找到分解算法的地方。我还尝试过 7 人一组的算法,我认为它很有效。但我认为正如你在 3 人组中所说的那样,最终会出现非线性时间,这是不被接受的!我只是没有得到你在第 3 层的主要内容(地板(地板(n/5)/2 - 2)?//对不起,我不是英语母语人士。你能解释一下你是按楼层的主要内容吗?谢谢跨度>
  • 楼层是指cplusplus.com/reference/clibrary/cmath/floor,但实际上我应该说cplusplus.com/reference/clibrary/cmath/ceil。在算法书中,他们通过使用看起来像旋转的大写“L”形状的括号来展示这一点。
  • 从前两天开始我一直在寻找这个答案。我终于有了一个想法。谢谢。 + 1 :)
猜你喜欢
  • 2013-08-08
  • 2016-10-05
  • 1970-01-01
  • 2019-06-02
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多