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

Arrays 在O(logn)中的三个排序数组中查找中值,arrays,algorithm,sorting,big-o,median,Arrays,Algorithm,Sorting,Big O,Median,通过谷歌搜索几分钟,我知道了基本的想法 设A、B和C为包含n个元素的排序数组 在每个数组中选择中间值,并将其称为medA、medB和medC 在不丧失一般性的情况下,假设medA>medB>medC 数组A中大于medA的元素不能成为三个数组的中值。同样,数组C中小于medC的元素也不能,因此这些元素将被忽略 递归地重复步骤2-4 我的问题是,基本情况是什么? 假设有很多基本情况,我用手测试了数小时的算法,但我无法找到正确的基本情况。 而且,每递归一步,三个数组的长度都会不同。即使三个数组的长度

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

  • 设A、B和C为包含n个元素的排序数组
  • 在每个数组中选择中间值,并将其称为medA、medB和medC
  • 在不丧失一般性的情况下,假设medA>medB>medC
  • 数组A中大于medA的元素不能成为三个数组的中值。同样,数组C中小于medC的元素也不能,因此这些元素将被忽略
  • 递归地重复步骤2-4
  • 我的问题是,基本情况是什么? 假设有很多基本情况,我用手测试了数小时的算法,但我无法找到正确的基本情况。
    而且,每递归一步,三个数组的长度都会不同。即使三个数组的长度不同,步骤4是否也有效?

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

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


    还有一篇文章谈到了一个一般情况:

    我认为你可以使用选择算法,稍微修改一下以处理更多的数组

    你要找的是中位数,它是第p=[n/2]个元素

    选取最大数组的中位数,为该值找到其他两个数组中的拆分点(二进制搜索,log(n))。现在您知道所选的数字是第k个(k=位置之和)

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

    重复,直到k=p


    哎呀,我想这是log(n)^2,让我想想……

    当所有三个数组的长度都小于一个常数时,你可以用蛮力找到中间值。也有可能两个数组的长度为一,但不能忽略第三个数组中的元素。在这种情况下,可以修改二进制搜索以查找中值。