已知兩個已經排好序(非減序)的序列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...