找出數組X和Y中所有2n個元素的中位數

算法導論第三版,9.3-8

算法:

  1. 如果兩個數組長度爲1,選出較小的那個一個
  2. 否則,取出兩個數組的中位數。
  3. 取有較大中位數的數組的低區和較低中位數數組的高區,組合成新的長度爲n的數組。
  4. 找出新數組的中位數

思路:
既然用遞歸分治,一定有基本情況,基本情況就是數組長度爲1.
觀察會發現總的中位數介於兩個數組的中位數之間。詳細證明如下:
設總的中位數是MX 的中位數是MXY 的中位數是MY ,假設M 位於X (位於Y類似),MX 中的座標是k

  1. X+Y 中一共有n 個元素小於等於M ,其中X 貢獻了k 個,Y 貢獻了nk 個。
  2. X 中有n/2 個元素小於等於MXY 中有n/2 個元素小於MY

根據以上兩點,如果k<n/2 ,那麼MY<M<MXM 位於Y 的高區+X 的低區。
如果 kn/2 ,那麼MX<M<MYM 位於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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章