两个有序数组求中位数的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]
对称,同样的作法。


数组

相关文章
相关标签/搜索