题目:设X[1..n]和Y[1..n]为两个数组,每个都包含n个已排好序的数。给出一个求数组X和Y中所有2n个元素的中位数的、O(logn)时间的算法。
这题是老师布置的作业,一开始我想出的解法如下:
分治法:
1、先分别求出X和Y的中位数
2、比较两个数的大小,如果相等就返回。如果不等的话,去掉较大中位数所在的那个数组的较大的一半,去掉较小的中位数所在的数组的较小的一半
3、在规模减半的两个数组上递归调用。
4、如果一直没有遇到正好相等的情况,那么递归到最后会剩下四个数,则返回第二个数。因为这两个数组都是有n个元素,所以最终返回的必然是2n个数中的下中位数。
写了一个程序如下:
01
int
search(
int
[]
X
,
int p
,
int
q
,
02 int [] Y , int r , int s) {
03 int midx , midy;
04 if ((p + 1 == q) && ( r + 1 == s)) {
05 if ( X [p ] < Y [ r ])
06 return ( X [ q ] < Y [ r ]) ? X [ q ] : Y [ r ];
07 else
08 return ( Y [s ] < X [p ]) ? Y [s ] : X [p ];
09 }
10 else {
11 midx = (p + q) / 2;
12 midy = ( r + s) / 2;
13 if ( X [ midx ] < Y [ midy ])
14 return search( X , midx , q , Y , r , midy);
15 else if ( X [ midx ] > Y [ midy ])
16 return search( X , p , midx , Y , midy , s);
02 int [] Y , int r , int s) {
03 int midx , midy;
04 if ((p + 1 == q) && ( r + 1 == s)) {
05 if ( X [p ] < Y [ r ])
06 return ( X [ q ] < Y [ r ]) ? X [ q ] : Y [ r ];
07 else
08 return ( Y [s ] < X [p ]) ? Y [s ] : X [p ];
09 }
10 else {
11 midx = (p + q) / 2;
12 midy = ( r + s) / 2;
13 if ( X [ midx ] < Y [ midy ])
14 return search( X , midx , q , Y , r , midy);
15 else if ( X [ midx ] > Y [ midy ])
16 return search( X , p , midx , Y , midy , s);
算法导论:求解有序数组合并中位数的分治法

博客讨论了如何在O(logn)时间内找到两个已排序数组X和Y(各含n个元素)的中位数。初始解法使用分治策略,先分别找出两个数组的中位数,然后根据它们的相对大小逐步缩小规模。然而,该方法在数组元素为偶数时存在问题,可能导致错误的中位数。修正的算法确保在偶数元素情况下,始终在一个数组中取上中位数,另一个取下中位数,最终通过快速排序验证了正确性。
最低0.47元/天 解锁文章
7535

被折叠的 条评论
为什么被折叠?



