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

两个有序数组求中位数的O(logn)算法_第1张图片

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

由于复杂度是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]
对称,一样的做法。


 

你可能感兴趣的:(两个有序数组求中位数的O(logn)算法)