题目:求解多个有序数组的中位数
题目的意思是如果多个有序数组能在一起排序,则取位置为中间的数字,如果有奇数个数字则中位数只有一个;若为偶数个则有两个,一般取第一个,也称下中位。但不能把数组合在一起做插入或快速排序,因为数据可能是海量的。
该题目可能有很多种实现方法,而我们给出一种仅依赖中位数性质的算法。如果存在一个已经排好序的大数组(有序数列),则会发现几个性质:
- 对称性:中位数前面的数字与后面的数字一样多(在偶数元素情况下或相差1)
- 确定性:若某个数字前后的数字数量相同(或相差1)则为该数列的中位数
- 不变性:删除前N个元素与后N个元素后,中位数不变
- 关联性:从大数组中按顺序任意取走n-1组元素,与剩下的元素共构成n个子列,每个子列存在中位数:m1,m1...mn,min,max分别为其中最小者与最大者,则原数列的中位数m满足:min<=m<=max
该性质可通过反证法获得
根据上述性质构造下面基于3分查找的算法:
- 输入多个有序数组查找其中位数m
- 计算个数组的中位数,并计算其最小者min与最大者max,则m必满足min<=m<=max
- 计算min之前所有的数字lTripCount(在所有数组)及max之后所有的数字rTripCount,如果二者相同,则min与max都为中位