寻找两个排序数组的中位数
中位数保持
从一组数字的中位数两边删除同样多的元素(不管被删除的数字的相对顺序是什么样的),中位数保持。— 尽可以把位于中位数左边和右边的这些数字打乱,只要中位数两边被删除的数目相等就能使中位数保持(是剩下的这些数的中位数)。
情景分析
- 假设两个已排序的数组,记为 A[m] , B[n] 。设想一下,当能确定这两个数组中比中位数小的数值的个数 x 以及比中位数大的数值的个数
y 时,求出 min=Min(x,y) ,那么同时去掉中位数两边(左边的数小于或等于中位数,右边的数大于或等于中位数)任意 min 个数,中位数保持。为了便于描述,假设数组的起始坐标是1而不是0。还假设 C[m+n] 是将A和B组合起来排序了的数组。他的中位数下标记为c。记A的中位数的下标为a,B的中位数的下标为b。记 A[a] 在C中的下标位置为 Ca , B[a] 在C中的下标位置为 Cb 。
首先,当 A[a]==B[b] 时,C的中位数就是 A[a] ,看图。
![]()
位于两边的数的个数一定是相等的。然后,若 A[a]≠B[b] ,我们总有办法交换集合,使得集合A和B满足 A[a]<B[b]
case1: m为奇数,n为奇数。
看图:
![]()
∵A[a]<B[b] ,那么一定有:
A[a] 在C中的下标位置 Ca 最大能排在b所在位置 Cb 的前面,所以有 Ca≤a+b−1=m+12+(n+12−1)=m+n2=c ,于是,所有位于a左边的数均小于或等于c-1,均位于C的中位数的左边,他们的个数是 m+12−1=m−12 。
B[b] 在C中的下标位置 Cb 最小能排在a所在位置