算法導論第三版,9.3-8
算法:
- 如果兩個數組長度爲1,選出較小的那個一個
- 否則,取出兩個數組的中位數。
- 取有較大中位數的數組的低區和較低中位數數組的高區,組合成新的長度爲n的數組。
- 找出新數組的中位數
思路:
既然用遞歸分治,一定有基本情況,基本情況就是數組長度爲1.
觀察會發現總的中位數介於兩個數組的中位數之間。詳細證明如下:
設總的中位數是
X+Y 中一共有n 個元素小於等於M ,其中X 貢獻了k 個,Y 貢獻了n−k 個。X 中有n/2 個元素小於等於MX ,Y 中有n/2 個元素小於MY
根據以上兩點,如果
如果
綜上所述,不管何種情況,總的中位數一定位於有較大中位數的數組的低區和較低中位數數組的高區組成的新數組。
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