两个有序数组求中位数的O(logn)算法

好好地写写这个题目的解法吧。

由于复杂度是logn的,所以考虑要用到二分。

首先,假设两个数组的长度都是奇数,而且大于1。令mid 为 (1 + n) / 2,也就是中间的那个元素的下标。考虑一下X[mid]和Y[mid]的大小关系:

(1) X[mid] > Y[mid]
这种情况下,我们可以想,当我们把两个数组合并排序后,X[mid]的排名(排名从1开始)肯定是大于n的,因为我们可以确定这些元素一定小于等于X[mid]:X[1...mid - 1],Y[1...mid - 1] ,Y[mid]。
同理,可以分析出来,Y[mid]的排名肯定是小于n + 1的。引入一个定理,如果我们同时杀掉X[mid]后面的任意k个元素和Y[mid]前面的任意k个元素(k > 0),那么,得到的新的两个数组的中位数,与原数组,仍然是一样的。这个定理画个图不难证明。所以,原问题就被转化为一个更小的子问题了。

(2)X[mid] == Y[mid]
倒是这种情况,我想了很久,到底应该怎么处理。后来发现,自己犯傻了。如果X[mid]等于Y[mid]的话,考虑一下我们排序的过程。首先,我们可以将X[1...mid-1]和Y[1...mid-1]合并排序得到一个长度为2*(mid-1)的新数组P,然后我们把X[mid + 1...n]和Y[mid + 1...n]合并排序,得到一个长度也是2*(mid-1)的新数组R,最后,我们把X[mid] 和 Y[mid]插在中间,就得到最后的有序数组了:P,X[mid],Y[mid],R
也就是说,当X[mid] == Y[mid]时,你可以马上确定X[mid]和Y[mid]就是你要找的两个中位数!

(3)X[mid] < Y[mid]
这种情况和情况(1)对称,不累赘了。


然后,假设两个数组的长度都是偶数,而且大于1。令mid为(1+n)/ 2,也就是中间的两个元素里左边的那个元素的下标。考虑一下X[mid] 和 Y[mid + 1]的大小关系
(1)X[mid] > Y[mid]
使用与上面奇数长度的情况的类似的思路,我们可以知道,X[mid]的排名在一半以后,而Y[mid]的排名在一半以后,所以,我们也可以用同样的思路来缩小问题的规模。
(2) X[mid] == Y[mid]
同样的思路,所以同样的结论。当它们相等的时候,你是可以马上确定它们就是你要找的两个中位数。
(3)X[mid] < Y[mid]
对称,一样的做法。


 

转载于:https://my.oschina.net/mustang/blog/58047

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值