二分查找-两已排序数组中找中位数二题

本文探讨了《算法导论》中的一道问题,如何在两个已排序数组X和Y中,以O(lgn)的时间复杂度找到所有2n个元素的中位数。通过二分查找策略,寻找满足条件的两个数a和b,确保它们的上下方各有n-1个数。在数组X中找到a,然后确定b可能来自X的前一个元素或Y的相应位置。代码实现时需注意数组边界条件。
摘要由CSDN通过智能技术生成

第一题来自于《算法导论》第九章习题 9.3-8. 已知两个已排序数组X[n], Y[n](假设升序),问在时间O(lgn)内找到全部2n个数中的中位数。

给了提示时间O(lgn),那么必定使用二分查找。这道题的“梗”在于如何处理两个已排序数组。我们有总共2n个数,偶数,那么全局的中位数来自于两个数a,b,在排好序的2n个数中,它们以上(比它们大)和以下(比它们小)应该各有n-1个数。令a > b,假设a==X[i], 即数组X 中,a以下有i个数小于a。对于b,有两个可能来源,X[i-1] 或者Y[n-1-i],这里Y[n-1-i]是数组Y中比a小的数中最大的一个。

综上所述,我们的二分查找逻辑如下:首先在数组X中对于区间[v,u), 由i=(v+u)/2寻找X[i] ,对于j=n-1-i, 检查 if Y[j+1] > X[i] && Y[j] < X[i],否则通过增大或者缩小i来反向改变j。如果这样的a不在X[]中,则对于数组Y重复以上处理。

实现代码如下,注意数组边界情况,比如i==0 或者i==n-1

bool findmediansingle(int* A, int* B, int n, double& res){ // find total median in array A
    int u=n, v=0;
    while(v<u){ //[v,u)
        int i = (v+u)/2;
        int j = n-1-i; //index in B[]
        if(A[i] <= B[j]){ //we need to find the middle two elements among the total merged array
            if(j==0 || A[i] >= B[j-1]){ //all elements less than A[i] and B[j] adds up to mid
                int low = A[i]; //since we focus binary cursor on i, A[i] is fixed as floor of the two middle
                int high = B[j];
                if(i<n-1 && A[i+1]<B[j]){ //A[i+1] is closer to A[i] then B[j]
                    high = A[i+1];
                }
                res = (double)(low + high)/2;
                return true;
            }else{
                v=i+1; //enlarge i to reduce j
     
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值