![](/img/trans.png)
[英]Why finding median of 2 sorted arrays of different sizes takes O(log(min(n,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;
}
我試圖證明算法的時間復雜性和核心性沒有運氣。
假設我們有兩個數組A
和B
,分別為m
和n
, m <= n
。
然后我們有以下內容:
引理:中位數A
和B
相同的中值A
和B'
其中B'
是中間m
或m + 1
元素B
,這取決於是否m
和n
具有相同奇偶性或沒有。
現在只剩下使用你的O(log(m + n))
算法來找到A
和B'
的中位數。
引理的證明:幾乎是顯而易見的......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.