簡體   English   中英

在O(min(log(n),log(m))復雜度中找出兩個不同大小的排序數組的中位數

[英]Find the median of two sorted arrays of different size in O(min(log(n),log(m)) complexity

在回復之前,請注意兩個陣列的大小不同,請求的復雜度為O(min(log(n),log(m)),此問題從未在stackoverflow上詢問。

我一直在嘗試修改O(log(n + m))解決方案,但不能,以下解決方案搜索kth(合並數組的中位數)元素,但復雜性為log(n + m) 。

為了在O(min(log(n),log(m)))中求解它,我們還需要在每次遞歸調用時剪切第二個數組成員的k / 2。

更新的代碼:

int select(int *a, int *b, int sa, int sb, int k) {
    int ma = sa < k/2 ? sa - 1 : k/2 - 1;
    int mb = k - ma - 2;
    if (sa + sb < k)
        return -1;
    if (sa == 0)
        return b[k - 1];
    if (sb == 0)
        return a[k - 1];
    if (k == 1)
        return a[0] < b[0] ? a[0] : b[0];
    if (a[ma] == b[mb])
        return a[ma];
    if (a[ma] < b[mb])
        return select(a + ma + 1, b, sa - ma - 1, mb + 1, k - ma - 1);
    return select(a, b + mb + 1, ma + 1, sb - mb - 1, k - mb - 1);
}

/*
median:
uses select to find the median of the union of a and b (where a and b are sorted
positive integer arrays of sizes sa and sb respectively).
*/
int median(int *a, int *b, int sa, int sb) {
    int m1, m2;
    if ((sa + sb) % 2 == 1)
        return select(a, b, sa, sb, (sa + sb)/2 + 1);
    return select(a, b, sa, sb, (sa + sb)/2);

}

int main() {
    int a[3] = {2, 4, 6};
    int b[11] = {1, 3, 5, 7, 13, 17, 22, 23, 24, 25, 31};
    printf("\n median is %d\n", median(a, b, 3, 11));
    return 0;
} 

我試圖證明算法的時間復雜性和核心性沒有運氣。

假設我們有兩個數組AB ,分別為mnm <= n

然后我們有以下內容:


引理:中位數AB相同的中值AB'其中B'是中間mm + 1元素B ,這取決於是否mn具有相同奇偶性或沒有。


現在只剩下使用你的O(log(m + n))算法來找到AB'的中位數。

引理的證明:幾乎是顯而易見的......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM