俩个相同大小升序序列合并在一起的中位数解法

这道题貌似还是一道考研题,但是很久了 好像是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后面的元素就更大了 也不会有中位数的存在了。。
这样他们就是可以被舍弃的对象,但是请注意。。他们数量是相等的吗? 你会发现有时候相等,有时候不等。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值