兩個有序數序列中找第k小

2021-07-24 04:47:11 字數 1055 閱讀 6733

description:

已知兩個已經排好序(非減序)的序列x和y,其中x的長度為m,y長度為n,

現在請你用分治演算法,找出x和y的第k小的數,演算法時間複雜度為o(max)

分析:既然說明了分治,那肯定是劃分為子問題。又已經排好序,模擬於二分查詢,每次丟棄一半,我們可以將x的一半元素與y的一半元素合併在一起,

再判斷丟棄哪部分。取x[xbeg...xmid], y[ybeg...ymid],合在一起的長度為halflen

若 x[xmid] < y[ymid],x[xbeg...xmid]一定小於y[ymid]。若 k < halflen,說明y[ymid...yend]必定不可能出現第k小,丟棄。若 k >= halflen,

說明x[xbeg...xmid]不可能出現第k小,因為x[xmid] < y[ymid],極端情況下也只能是k-1小。所以丟棄x的左半段,此時k值發生改變,不再是找第k小,

而是 k-(xmid-xbeg+1)小。

同理x[xmid] >= y[ymid]

遞迴邊界的確定:

一半一半地丟棄下去,總會導致x或y某一段不存在。所以遞迴邊界為:

if(xbeg > xend) return y[ybeg-k+1];

if(ybeg > yend) return x[xbeg-k+1];

#include using namespace std;

int find(int *x, int *y, int xbeg, int xend, int ybeg, int yend, int k)

if(ybeg > yend)

int xmid = (xbeg + xend)/2;

int ymid = (ybeg + yend)/2;

int halflen = xmid - xbeg + ymid - ybeg + 2;

if(x[xmid] < y[ymid])else

for(int j=0; j> y[j];

}cout << find(x, y, 0, m-1, 0, n-1, k) << endl;

}

17082 兩個有序數序列中找第k小(優先做)

已知兩個已經排好序 非減序 的序列x和y,其中x的長度為m,y長度為n,現在請你用分治演算法,找出x和y的第k小的數,演算法時間複雜度為o max 此題請勿採用將序列x和y合併找第k小的o m n 的一般方法,要充分利用x和y已經排好序的這一特性。第一行有三個數,分別是長度m 長度n和k,中間空格相...

4 兩個有序陣列中第k小的數

參考 求兩個有序陣列中第k個元素。要求時間複雜度o log m n 空間複雜度o 1 def median num1,num2,k len1,len2 len num1 len num2 if len1 len2 k 首先得檢查合法行啊 return 1 index1,index2 0,0 whil...

兩個有序陣列的第k大數

coding utf 8 兩有序陣列的第k大 一種思路是用o m n 的空間複雜度,然後時間複雜度的話只需要o k 吧,就是從後往前掃k個就ok了 另一就是不需要額外的空復,然後時復o log m n 遞迴 a 19,11,8,7,4,2,0 b 13,8,6,3,1 k 4 m,n len a l...