这道题貌似还是一道考研题,但是很久了 好像是2011年的。大概意思就是一个如果一个序列S1(11,13,15,17,19)则中位数是15, S2=(2,4,6,8,20) ,如果把S1和S2按照升序合在一起则11是中位数。
让你写算法:
当然最常见的无非就是把他俩放在一个数组里然后直接就找到中间那个了,但是这样的算法复杂度就会变成O(N),有没有更好的办法呢,当然首先就要利用中位数的性质。
假设一个数列 a1 a2 a3 a4 …ak,ak+1,ak+2 …an 其中ak为中位数,如果我左右排除掉同样多的个数,会不会影响中位数的值呢,答案是当然不会,举个栗子
{1,3,4,5,6,8,9,10,12} 中位数为6,那我左边把1,3去掉 右边把10,12去掉 数列变为 4,5,6,8,9 。 中位数依旧是6啊。所以我们的算法变了,从原来的把俩个排序数列组合到一起去找,变成减少数组的个数方便查找。换句话说舍弃肯定中位数不在的数组元素,但是必须舍弃一样的数量,不然中位数就不对了。
那问题又来了 怎么最有效舍弃一样的数量,答案是二分法。。。
比较俩个数列的中位数,为了方便 设一个为a数列一个为b数列。ak为a数列的中位数,bk为b数列的中位数。,如果ak>bk说明了什么,说明bk的前面的元素注定了不会有中位数的存在了同样ak后面的元素就更大了 也不会有中位数的存在了。。
这样他们就是可以被舍弃的对象,但是请注意。。他们数量是相等的吗? 你会发现有时候相等,有时候不等。。。