Median of Two Sorted Arrays

本文介绍了一种在两个已排序数组中查找中位数的有效算法。该算法通过二分查找方式,在对数时间内确定中位数值,适用于不同长度的数组。文章详细解释了算法步骤,并提供了具体的代码实现。

There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).


MIT 的 two sorted array Median算法实现
1. 如果l > r,说明前一个array已经用完,需要在另一个array中寻找切点
2. i 为当前array指定区域(l ,r)的中点, j为另外一个array中的一个点,两个点的index加起来是(m+n)的一半 + 1(如果m+n为偶数,则 当前i和j共代表的节点数目是 (m+ n) / 2 + 1, 如果(m+ n)是奇数,则i,j共代表的节点数为(n+m)/2).   并且这里设定大小排列语义为 ....B[j]  , A[i], B[j + 1]....
3. 根据第二步计算的index和设定的语义(红色部分),如果A[i]小于B[j],或者大于B[j  + 1].则需要分别更新l或者r来继续二分查找A来找到一个A[k]使得上述红色语义满足;
4. 到了这里,说明红色语义已经满足,如果m + n是奇数,A[i]就是中间那个点,直接返回;
5.到了这里说明是偶数个数,median为A[i]和按照大小排列A[i]的前一个值(假设为X)得平均值, 这个X可能是A[i - 1],也可能是B[j],根据i,j的具体数值来判断走那条分支。




class Solution {
public:
    double findMedianSortedArrays(int A[], int m, int B[], int n) {
        if (m > n) return findMedian(B, n, A, m, 0, n - 1);
        return findMedian(A, m, B, n, 0, m - 1);
    }
    
private:
    double findMedian(int A[], int m, int B[], int n, int l, int r) {
        if (l > r) return findMedian(B, n, A, m, max(0, (n + m) / 2 - m), min(n, (n + m) / 2));
        int i = l + ((r - l) >> 1);
        int j = (n + m) / 2 - i - 1;
        if (j >= 0 && A[i] < B[j]) return findMedian(A, m, B, n, i + 1, r);
        if (j < n - 1 && A[i] > B[j + 1]) return findMedian(A, m, B, n, l, i - 1);
        if ((n + m) & 0x1) return A[i];
        if (i > 0) return (double)(A[i] + max(A[i - 1], j >= 0 ? B[j] : INT_MIN)) / 2.0;
        return (double)(A[i] + B[j]) / 2.0;
    }
};


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值