在O(logn)中查找三个排序数组的中位数

时间:2013-09-08 15:00:33

标签: arrays algorithm sorting big-o median

通过谷歌搜索几分钟,我知道基本想法。

  1. 设A,B和C为包含n个元素的排序数组。
  2. 在每个数组中选择中位数并将其称为medA,medB和medC。
  3. 不失一般性,假设medA> medB> MEDC。
  4. 数组A中大于medA的元素不能成为三个数组的中位数。同样,数组C中小于medC的元素也不能,因此这些元素将被忽略。
  5. 递归地重复步骤2-4。
  6. 我的问题是,基本案例是什么? 假设有很多基本情况,我用手测试了算法数小时,但我找不到正确的基本情况。 此外,每个递归步骤三个数组的长度将变得不同。即使三个数组的长度不同,步骤4也能工作吗?

2 个答案:

答案 0 :(得分:1)

此算法适用于两个相同大小但不是三个的排序数组。在一次迭代之后,您消除了A和C中的一半元素但是B保持不变,因此这些数组中的元素数量不再相同,并且该方法不再适用。对于不同大小的数组,如果应用相同的方法,则将从下半部分和上半部分中删除不同数量的元素,因此剩余元素的中位数与原始数组的中位数不同。

话虽这么说,你可以修改算法,在每次迭代的两端消除相同数量的元素,当一些数组非常小而一些非常大时,这可能是有效的。您还可以将其转换为查找第k个元素的问题,跟踪被丢弃的元素数量以及在每次迭代时更改k的值。无论哪种方式,这比两个阵列情况要复杂得多。

还有另一篇文章谈到一般情况:Median of 5 sorted arrays

答案 1 :(得分:0)

我认为您可以使用选择算法,稍加修改以处理更多数组。

您正在寻找中位数,即 p = [n / 2] th 元素。

选择最大数组的中位数,在该值中找到其他两个数组中的分裂点(二进制搜索,log(n))。现在你知道所选的数字是 k th(k =位置的总和)。

如果k> p,丢弃它上面的3个数组中的元素,如果它更小,则低于它(丢弃可以通过分别维护每个数组的下部和上部索引来实现)。如果它更小,也更新p = p - k。

重复直到k = p。

糟糕,我认为这是log(n)^ 2,让我考虑一下......