算法作业!!求两个不等长有序数组的中位数!

来源:百度知道 编辑:UC知道 时间:2024/09/24 00:28:30
已知两个有序数组A和B分别有n1和n2个数字,
求一个用O(logn1+logn2)的算法去找A和B组合后的中位数!!

这个比较不好讲清楚,先假设 A 和 B 都是升序的。

这个问题的关键在于给定 k,怎样找到 A 和 B 合并后的第 k 大元素。我们可以这样做:

1. 把 A 平均分为前后两个部分,前部分有 x 个元素,后部分有 n1-x 个元素(由于 A 是有序的,所以后一部分的所有元素大于前一部分)。A[x] = A的后一部分的第一个元素。
2. 同理把 B 也平均分成前后两个部分,前部分有 y 个元素,后部分有 n2-y 个元素。B[y] = B的后一部分的第一个元素。
3. 由于两个数组都是被平均分割的,所以可以近似地认为 x = n1/2, y = n2/2。

这里不妨设 A[x] <= B[y](如果 A[x] > B[y] 处理过程和下面类似):

=============================== 情况1 ============================

由于在 A 中,A[x] 前面有 x 个元素,在 B 中,B[y] 前面有 y 个元素,并且又有 A[x] <= B[y],那么,合并以后,A[x]前面原来那些元素必然也在B[y]前面,也就是说,B[y]前面至少会有 x + y 个元素,我们再规定如果 A, B 中有相同元素,则合并后 A 中的元素排在 B 前面,那么归并以后 A[x] 也会排在 B[y] 前面,于是乎合并之后 B[y] 至少有 x+y+1 个元素。

如果 k <= x+y+1,也就是说,合并后第 k 大的元素必然落在 B[y] 前面。所以,原来在 B 数组中,第二部分(B[y]以及 B[y] 之后)那些元素都不可能包含我们要找到内容(第 k 大元素),所以我们可以把他们排除掉。这样就排除了 B 中一半的内容。

=============================== 情况2 ============================

在 A 中,A[x] 及其后面有 n1-x 个元素,除去 A[x] 之后有 n1-x-1 个元素,B[y] 及其后面有 n2-y 个元素。那么,由于 A[x] <=