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

2021-10-11 03:50:42 字數 2021 閱讀 6941

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

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

此題請勿採用將序列x和y合併找第k小的o(m+n)的一般方法,要充分利用x和y已經排好序的這一特性。

第一行有三個數,分別是長度m、長度n和k,中間空格相連(1<=m,n<=100000; 1<=k<=m+n)。

第二行m個數分別是非減序的序列x。第三行n個數分別是非減序的序列y。

序列x和y的第k小的數。

5 6 7

1 8 12 12 21

4 12 20 22 26 31

假設:x序列為x[xbeg…xend],而y序列為y[ybeg…yend]。

將序列x和y都均分2段,即取x序列中間位置為 xmid (xmid = xbeg+(xend-xbeg)/2),也同理取序列y中間位置為ymid。

比較x[xmid]和y[ymid]的大小,此時記錄x左段和y左段元素個數合計為halflen,即halflen = xmid-xbeg+ymid-ybeg+2。

當x[xmid] < y[ymid]時,在合併的陣列中,原x[xbeg…xmid]所有元素一定在y[ymid]的左側,

(1) 若k < halflen,則此時第k大的元素一定不會大於y[ymid]這個元素,

故以後沒有必要搜尋 y[ymid…yend]這些元素,可棄y後半段資料。

此時只需遞迴的對x序列+y序列的前半段,去搜尋第k小的數。

(2) 若k >= halflen,則此時第k大的元素一定不會小於x[xmid]這個元素,

故以後沒有必要搜尋 x[xbeg…xmid]這些元素,可棄x前半段資料。

此時只需遞迴的對x序列的後半段+y序列,去搜尋第 k-(xmid-xbeg+1)小的數。

當x[xmid] >= y[ymid]時,在合併的陣列中,原y[ybeg…ymid]的所有元素一定在x[xmid]的左側,

(1) 若k < halflen,則此時第k大的元素一定不會大於x[xmid]這個元素,

故以後沒有必要搜尋 x[xmid…xend]這些元素,可棄x後半段資料。

此時只需遞迴的對x序列的前半段+y序列,去搜尋第k小的數。

(2) 若k >= halflen,則此時第k大的元素一定不會小於y[ymid]這個元素,

故以後沒有必要搜尋 y[ybeg…ymid]這些元素,可棄y前半段資料。

此時只需遞迴的對x序列+y序列的後半段,去搜尋第 k-(ymid-ybeg+1)小的數。

遞迴的邊界,如何來寫?

if (xbeg > xend) return y[ybeg + k - 1]; //x序列為空時,直接返回y序列的第k小元素。

if (ybeg > yend) return x[xbeg + k - 1]; //y序列為空時,直接返回x序列的第k小元素。

效率分析:

t(m,n)表示對長度為m的有序的x序列和長度為n的有序的y序列,搜尋第k小元素的複雜度。

t(m,n)=1 m=0或n=0

t(m,n) <= max + o(1)

則t(m,n) = o(max)

基本上我寫這個題目的想法都寫在注釋裡面的,讀者可以好好看看。

#include

#include

#include

using

namespace std;

intfun

(int x,

int y,

int xbeg,

int xend,

int ybeg,

int yend,

int k)

else

}else

else}}

intmain()

for(

int i=

0;i)printf

("%d"

,fun

(x,y,

0,m-1,

0,n-

1,k));

return0;

}

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

description 已知兩個已經排好序 非減序 的序列x和y,其中x的長度為m,y長度為n,現在請你用分治演算法,找出x和y的第k小的數,演算法時間複雜度為o max 分析 既然說明了分治,那肯定是劃分為子問題。又已經排好序,模擬於二分查詢,每次丟棄一半,我們可以將x的一半元素與y的一半元素合併...

兩個有序陣列的第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...

合併兩個有序序列

將兩個有序的數列,合併成乙個有序的序列 package toyprogram this class is used for author dlf 460795365 qq.com version 1.0,2016年9月13日 下午3 39 42 public class aboutarrayl in...