找出数组X和Y中所有2n个元素的中位数

算法导论第三版,9.3-8

算法:

  1. 如果两个数组长度为1,选出较小的那个一个
  2. 否则,取出两个数组的中位数。
  3. 取有较大中位数的数组的低区和较低中位数数组的高区,组合成新的长度为n的数组。
  4. 找出新数组的中位数

思路:
既然用递归分治,一定有基本情况,基本情况就是数组长度为1.
观察会发现总的中位数介于两个数组的中位数之间。详细证明如下:
设总的中位数是 M X 的中位数是 MX Y 的中位数是 MY ,假设 M 位于 X (位于Y类似), M X 中的坐标是 k

  1. X+Y 中一共有 n 个元素小于等于 M ,其中 X 贡献了 k 个, Y 贡献了 nk 个。
  2. X 中有 n/2 个元素小于等于 MX Y 中有 n/2 个元素小于 MY

根据以上两点,如果 k<n/2 ,那么 MY<M<MX M 位于 Y 的高区+ X 的低区。
如果 kn/2 ,那么 MX<M<MY M 位于 Y 的低区+ X 的高区。
综上所述,不管何种情况,总的中位数一定位于有较大中位数的数组的低区和较低中位数数组的高区组成的新数组。

Python 代码如下:

def two_array_median(a, b):
    if len(a) == 1:
        return min(a[0], b[0])

    m = median_index(len(a))
    i = m + 1
    if a[m] < b[m]:
        return two_array_median(a[-i:], b[:i])
    else:
        return two_array_median(a[:i], b[-i:])

def median_index(n):
    if n % 2:
        return n // 2
    else:
        return n // 2 - 1

英文引用连接http://clrs.skanev.com/09/03/08.html

你可能感兴趣的:(算法导论)