![《算法設(shè)計(jì)與分析》第05章_第1頁](http://file4.renrendoc.com/view/5feb0fcfba3573bd4f19f7487b350750/5feb0fcfba3573bd4f19f7487b3507501.gif)
![《算法設(shè)計(jì)與分析》第05章_第2頁](http://file4.renrendoc.com/view/5feb0fcfba3573bd4f19f7487b350750/5feb0fcfba3573bd4f19f7487b3507502.gif)
![《算法設(shè)計(jì)與分析》第05章_第3頁](http://file4.renrendoc.com/view/5feb0fcfba3573bd4f19f7487b350750/5feb0fcfba3573bd4f19f7487b3507503.gif)
![《算法設(shè)計(jì)與分析》第05章_第4頁](http://file4.renrendoc.com/view/5feb0fcfba3573bd4f19f7487b350750/5feb0fcfba3573bd4f19f7487b3507504.gif)
![《算法設(shè)計(jì)與分析》第05章_第5頁](http://file4.renrendoc.com/view/5feb0fcfba3573bd4f19f7487b350750/5feb0fcfba3573bd4f19f7487b3507505.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1第5章分治法
25.1
分治法的基本思想5.2
求最大最小元 5.3
二分搜索5.4
排序問題5.5選擇問題5.6斯特拉森矩陣乘法
35.1.1分治法的基本思想
分治法顧名思義就是分而治之。一個(gè)問題能夠用分治法求解的要素是:第一,問題能夠按照某種方式分解成若干個(gè)規(guī)模較小、相互獨(dú)立且與原問題類型相同的子問題;第二,子問題足夠小時(shí)可以直接求解;第三,能夠?qū)⒆訂栴}的解組合成原問題的解。由于分治法要求分解成同類子問題,并允許不斷分解,使問題規(guī)模逐步減小,最終可用已知的方法求解足夠小的問題,因此,分治法求解很自然導(dǎo)致一個(gè)遞歸算法。
4【程序5-1】
分治法SolutionTypeDandC(ProblemTypeP){ ProblemTypeP1,P2,,Pk; if(Small(P))returnS(P); else{ Divide(P,P1,P2,,Pk); ReturnCombine(DandC(P1),
DandC(P2),…,DandC(Pk)); }}5【程序5-2】
一分為二的分治法SolutionTypeDandC(intleft,intright){ if(Small(left,right))returnS(left,right); else{ intm=Divide(left,right); ReturnCombine(DandC(left,m),
DandC(m+1,right)); }}65.1.2算法分析
采用分治法求解問題通常得到一個(gè)遞歸算法。如果較大的問題被分解成同樣大小的幾部分,那么分析相應(yīng)算法的執(zhí)行時(shí)間,往往可得到如下的遞推關(guān)系式:T(n)=aT(n/b)+cnk,T(1)=c
a個(gè)規(guī)模為n/b的子問題問題分解與解的合并7定理5-1設(shè)a,b,c和k為常數(shù),T(n)=aT(n/b)+cnk,T(1)=c,則,
89設(shè)r=bk/a,下面分三種情況計(jì)算。(1)若r<1,則
所以(2)若r=1,則
所以(3)若r>1,則
所以105.1.3
數(shù)據(jù)結(jié)構(gòu)【程序5-3】可排序表類template<classK,classD>structE{//可排序表中元素的類型
operatorK()const{returnkey;}Kkey;Ddata;};11template<classT>classSortableList{//可排序表類public:SortableList(intmSize);~SortableList();
private:
T*l;intmaxSize;intn;};125.2求最大最小元
13
問題在一個(gè)元素集合中尋找最大元素和最小元素的問題。145.2.1
分治法求解【程序5-4】求最大最小元template<classT>voidSortableList<T>::MaxMin(T&max,T&min)const{ if(n==0)return; max=min=l[0]; for(inti=1;i<n;i++){ if(l[i]>max)max=l[i]; if(l[i]<min)min=l[i]; }}15【程序5-5】分治法求最大最小元template<classT>voidSortableList<T>::MaxMin(inti,intj,T&max,T&min)const{ Tmin1,max1; if(i==j)max=min=l[i];elseif(i==j-1) if(l[i]<l[j]){ max=l[j];min=l[i]; } else{ max=l[i];min=l[j]; } 16 else{ intm=(i+j)/2; MaxMin(i,m,max,min); MaxMin(m+1,j,max1,min1); if(max<max1)max=max1; if(min>min1)min=min1; }}
175.2.2時(shí)間分析定理5-2
設(shè)有n個(gè)元素的表,假定n是2的冪,即n=2k,k是正整數(shù),程序5-5在最好、平均和最壞情況下的比較次數(shù)都為3n/2–2。185.3二分搜索19問題在有序表(已按關(guān)鍵字值非減排序)中搜索給定元素的問題。205.3.1
分治法求解intSortableList<T>::BSearch(constT&x,intleft,intright)const后置條件:
在范圍為[left,right]的表中搜索與x有相同關(guān)鍵字值的元素;如果存在該元素,則函數(shù)返回該元素在表中的位置,否則函數(shù)返回-1,表示搜索失敗。21【程序5-6】二分搜索算法框架template<classT>intSortableList<T>::BSearch(constT&x,intleft,intright)const{ if(left<=right){intm=Divide(left+right);if(x<l[m])returnBSearch(x,left,m-1); elseif(x>l[m])returnBSearch(x,m+1,right); elsereturnm;}return-1;}225.3.2
對半搜索
對半搜索對半搜索是一種二分搜索。設(shè)當(dāng)前搜索的子表為(aleft,aleft+1,…,aright),令
m=(left+right)/2
23【程序5-7】對半搜索遞歸算法template<classT>intSortableList<T>::BSearch(constT&x,intleft,intright)const{if(left<=right){intm=(left+right)/2;if(x<l[m])returnBSearch(x,left,m-1); elseif(x>l[m])returnBSearch(x,m+1,right);elsereturnm;}return-1;}24定理5-3對于n0,程序5-7的對半搜索遞歸函數(shù)BSearch是正確的。255.3.3
二叉判定樹
二分搜索過程的算法行為可以用一棵二叉樹來描述。通常稱這棵描述搜索算法執(zhí)行過程的二叉樹為二叉判定樹(binarydecisiontree)。2627性質(zhì)5-1
具有n個(gè)內(nèi)結(jié)點(diǎn)的對半搜索二叉判定樹的左子樹上有(n-1)/2個(gè)內(nèi)結(jié)點(diǎn),右子樹上有n/2個(gè)內(nèi)結(jié)點(diǎn)。
性質(zhì)5-2
具有n(n>0)個(gè)內(nèi)結(jié)點(diǎn)的二叉判定樹的高度為logn+1
(不計(jì)外結(jié)點(diǎn))。
28性質(zhì)5-3
若n=2h-1,則對半搜索二叉判定樹是滿二叉樹。
性質(zhì)5-4
若n=2h-1,則對半搜索二叉判定樹的外結(jié)點(diǎn)均在h+1層上,否則,在第h或h+1層上,h=logn+1。
29定理5-4
對半搜索算法在成功搜索的情況下,關(guān)鍵字值之間的比較次數(shù)不超過logn+1。對于不成功的搜索,算法需要作logn或logn+1次比較。定理5-5
對半搜索算法在搜索成功時(shí)的平均時(shí)間復(fù)雜度為(logn)。
305.3.4搜索算法的時(shí)間下界
定理5-6
在一個(gè)有n個(gè)元素的集合中,通過關(guān)鍵字值之間的比較,搜索指定關(guān)鍵字值的元素,任意這樣的算法在最壞情況下至少需要作log
n+1次比較。315.4排序問題
32
問題排序是將一個(gè)元素序列調(diào)整為按指定關(guān)鍵字值的遞增(或遞減)次序排列的有序序列。335.4.1
合并排序
合并兩個(gè)有序序列
兩路合并排序的基本運(yùn)算是把兩個(gè)有序序列合并成一個(gè)有序序列。
34【程序5-9】Merge函數(shù)template<classT>voidSortableList<T>::Merge(intleft,intmid,intright){ T*temp=newT[right-left+1];inti=left,j=mid+1,k=0;while((i<=mid)&&(j<=right)) if(l[i]<=l[j])temp[k++]=l[i++];elsetemp[k++]=l[j++];while(i<=mid)temp[k++]=l[i++];while(j<=right)temp[k++]=l[j++]; for(i=0,k=left;k<=right;)l[k++]=temp[i++];}3536
分治法求解將待排序的元素序列一分為二分,得到兩個(gè)長度基本相等的子序列,如同對半搜索的做法;然后對兩個(gè)子序列分別排序,如果子序列較長,還可繼續(xù)細(xì)分,直到子序列的長度不超過1為止;當(dāng)分解所得的子序列已排列有序,可以采用上面介紹的將兩個(gè)有序子序列,合并成一個(gè)有序子序列的方法,實(shí)現(xiàn)將子問題的解組合成原問題解,這是分治法不可缺少的一步。37【程序5-10】兩路合并排序template<classT>voidSortableList<T>::MergeSort(intleft,intright){if(left<right){intmid=(left+right)/2;MergeSort(left,mid);MergeSort(mid+1,right);Merge(left,mid,right);}}3839
性能分析合并排序遞歸算法的時(shí)間復(fù)雜度為O(nlog
n)。405.4.2
快速排序快速排序采用一種特殊的分劃操作對排序問題進(jìn)行分解,其分解方法是:在待排序的序列(K0,K1,…,Kn-1)中選擇一個(gè)元素作為分劃元素,也稱為主元(pivot)。不妨假定選擇K為主元。經(jīng)過一趟特殊的分劃處理將原序列中的元素重新排列,使得以主元為軸心,將序列分成左右兩個(gè)子序列。主元左測子序列中所有元素都不大于主元,主元右測子序列中所有元素都不小于主元。41
分劃操作42【程序5-11】
分劃函數(shù)template<classT>intSortableList<T>::Partition(intleft,intright){//前置條件:leftright inti=left,j=right+1;do{doi++;while(l[i]<l[left]);doj--;while(l[j]>l[left]);if(i<j)Swap(i,j);}while(i<j); Swap(left,j); returnj;}43快速排序算法44【程序5-12】快速排序template<classT>voidSortableList<T>::QuickSort(){QuickSort(0,n-1);}template<classT>voidSortableList<T>::QuickSort(intleft,intright){ if(left<right){intj=Partition(left,right);QuickSort(left,j-1); QuickSort(j+1,right); }}45
時(shí)間分析最壞情況時(shí)間
W(n)W(n-1)+n+1
W(n-2)+(n+1)+n
W(1)+(n+1)++3=O(n2)
46平均情況時(shí)間
47485.4.3排序算法的時(shí)間下界定理5-7
任何一個(gè)通過關(guān)鍵字值比較對n個(gè)元素進(jìn)行排序的算法,在最壞情況下,至少需作(n/4)log
n次比較。49505.5選擇問題
51問題選擇問題(selectproblem)是指在n個(gè)元素的集合中,選出某個(gè)元素值大小在集合中處于第k位的元素,即所謂的求第k小元素問題(kth-smallest)。
525.5.1
分治法求解
設(shè)原表長度為n,假定經(jīng)過一趟分劃,分成兩個(gè)左右子表,其中左子表是主元及其左邊元素的子表,設(shè)其長度為p,右子表是主元右邊元素的子表。那么,若k=p,則主元就是第k小元素;否則若k<p,第k小元素必定在左子表中,需求解的子問題成為在左子表中求第k小元素;若k>p,則第k小元素必定在右子表中,需求解的子問題成為在右子表中求第k-p小元素。535.5.2
隨機(jī)選擇主元
隨機(jī)選主元算法
假定表中元素各不相同,并且隨機(jī)選擇主元,即在下標(biāo)區(qū)間[left,right]中隨機(jī)選擇一個(gè)下標(biāo)r,以該下標(biāo)處的元素為主元。54
【程序5-13】Select函數(shù)template<classT>ResultCodeSortableList<T>::Select1(T&x,intk){if(n<=0||k>n||k<=0)returnOutOfBounds;intleft=0,right=n;l[n]=INFTY;do{ intj=rand()%(right-left+1)+left; Swap(left,j); j=Partition(left,right); if(k==j+1){x=l[j];returnSuccess;} elseif(k<j+1)right=j; elseleft=j+1; }while(true);}55定理5-8
程序5-13的Select算法的平均時(shí)間A(n)=O(n)。算法的最壞情況時(shí)間復(fù)雜度O(n2)。565.5.3
線性時(shí)間選擇算法改進(jìn)的選擇算法采用二次取中法(medianofmediansrule)確定主元
5758
【程序5-14】線性時(shí)間選擇算法ResultCodeSortableList<T>::Select(T&x,intk){ if(n<=0||k>n||k<=0)returnOutOfBounds; intj=Select(k,0,n-1,5); x=l[j];returnSuccess;}
59template<classT>intSortableList<T>::Select(intk,intleft,intright,intr){intn=right-left+1;if(n<=r){InsertSort(left,right);returnleft+k-1;
}60for(inti=1;i<=n/r;i++){InsertSort(left+(i-1)*r,left+i*r-1);Swap(left+i-1,left+(i-1)*r+Ceil(r,2)-1);}intj=Select(Ceil(n/r,2),left,left+(n/r)-1,r);Swap(left,j);j=Partition(left,right);if(k==j-left+1)returnj;elseif(k<j-left+1)returnSelect(k,left,j-1,r);elsereturnSelect(k-(j-left+1),j+1,right,r);}615.5.4時(shí)間分析
以二次取中的中間值mm為主元,經(jīng)過一趟分劃,左、右兩個(gè)子表的大小均至多為:
nn/r/2
r/2
設(shè)T(n)為當(dāng)表長為n時(shí)執(zhí)行程序5-14所需的時(shí)間。T(n)由三部分時(shí)間組成:
T(n)T(n/5)+T(3n/4)+cn
用歸納法容易證明,T(n)20cn,n1是線性時(shí)間的。
625.5.5允許重復(fù)元素的選擇算法由于允許包含相同元素,左子表中除了小于mm的元素外,還包含與mm相同值的元素。因此,左子表的大小至多可達(dá)
nn/r/2
r/2+1/2n/r/2
r/2
=n-1/2n/r/2
r/2
容易用歸納法證明對于所有n90,
T(n)T(n/9)+T(7n/8)+cn72cn,n90635.6斯特拉森(Strassen)矩陣乘法
64問題矩陣相乘
65n×n矩陣A和B的乘積矩陣C中的元素C[i,j]定義為:若依此定義來計(jì)算A和B的乘積矩陣C,則每計(jì)算C的一個(gè)元素C[i][j],需要做n次乘法和n-1次加法。因此,算出矩陣C的n2個(gè)元素所需的計(jì)算時(shí)間為O(n3)66簡單分治法求矩陣乘首先假定n是2的冪。使用與上例類似的技術(shù),將矩陣A,B和C中每一矩陣都分塊成4個(gè)大小相等的子矩陣。由此可將方程C=AB重寫為:由此可得:復(fù)雜度分析T(n)=O(n3)
沒有改進(jìn)675.6.2
斯特拉森分治法P=(A11+A22)(B11+B22)Q=(A21+A22)B11R=A11(B12-B22)S=A21(B21-B11)T=(A11+A12)B22U=(A21-A11)(B11+B12)V=(A12-A22)(B21+B22)為了降低時(shí)間復(fù)雜度,必須減少乘法的次數(shù)。而其關(guān)鍵在于計(jì)算2個(gè)2階方陣的乘積時(shí)所用乘法次數(shù)能否少于8次。為此,Strassen提出了一種只用7次乘法運(yùn)算計(jì)算2階方陣乘積的方法(但增加了加/減法次數(shù)):68C11=P+S-T+VC12=R+TC21=Q+SC22=P+R-Q+UT(n)=(nlog7)(n2.81)
做了這7次乘法后,在做若干次加/減法就可以得到:較大的改進(jìn)69更快的方法Hopcroft和Kerr已經(jīng)證明(1971),計(jì)算2個(gè)2×2矩陣的乘積,7次乘法是必要的。因此,要想進(jìn)一步改進(jìn)矩陣乘法的時(shí)間復(fù)雜性,就不能再基于計(jì)算2×2矩陣的7次乘法這樣的方法了?;蛟S應(yīng)當(dāng)研究3×3或5×5矩陣的更好算法。在Strassen之后又有許多算法改進(jìn)了矩陣乘法的計(jì)算時(shí)間復(fù)雜性。目前最好的計(jì)算時(shí)間上界是O(n2.376),最好下界是(n2)。是否能找到O(n2)的算法?目前為止還沒有結(jié)果。70補(bǔ)充:大整數(shù)的乘法設(shè)計(jì)一個(gè)有效的算法,可以進(jìn)行兩個(gè)n位大整數(shù)的乘法運(yùn)算小學(xué)的方法:O(n2)效率太低分治法:X=a2n/2+bY=c2n/2+dXY=ac2n+(ad+bc)2n/2+bd復(fù)雜度分析
T(n)=O(n2)沒有改進(jìn)
n/2位n/2位n/2位n/2位X=
Y=ABCD71算法改進(jìn)為了降低時(shí)間復(fù)雜度,必須減少乘法的次數(shù)。為此,我們把XY寫成另外的形式:XY=ac2n+((a-c)(b-d)+ac+bd)2n/2+bd或XY=ac2n+((a+c)(b+d)-ac-bd)2n/2+bd復(fù)雜性:這兩個(gè)算式看起來更復(fù)雜一些,但它們僅需要3次n/2位乘法[ac、bd和(a±c)(b±d)],于是
T(n)=O(nlog3)=O(n1.59)較大的改進(jìn)細(xì)節(jié)問題:兩個(gè)XY的復(fù)雜度都是O(nlog3),但考慮到a+c,b+d可能得到m+1位的結(jié)果,使問題的規(guī)模變大,故不選擇第2種方案。72更快的方法小學(xué)的方法:O(n2)——效率太低分治法:O(n1.59)——較大的改進(jìn)更快的方法?如果將大整數(shù)分成更多段,用更復(fù)雜的方式把它們組合起來,將有可能得到更優(yōu)的算法。最終的,這個(gè)思想導(dǎo)致了快速傅利葉變換(FastFourierTransform)的產(chǎn)生。該方法也可以看作是一個(gè)復(fù)雜的分治算法,對于大整數(shù)乘法,它能在O(nlogn)時(shí)間內(nèi)解決。是否能找到線性時(shí)間的算法?目前為止還沒有結(jié)果。73棋盤覆蓋問題在一個(gè)2k×2k個(gè)方格組成的棋盤中,恰有一個(gè)方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。在棋盤覆蓋問題中,要用圖示的4種不同形態(tài)的L型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個(gè)L型骨牌不得重疊覆蓋。易知,覆蓋任意一個(gè)2k×2k的特殊棋盤,用到的骨牌數(shù)恰好為(4k-1)/3。74分治策略求解當(dāng)k>0時(shí),將2k×2k棋盤分割為4個(gè)2k-1×2k-1
子棋盤(a)所示。特殊方格必位于4個(gè)較小子棋盤之一中,其余3個(gè)子棋盤中無特殊方格。為了將這3個(gè)無特殊方格的子棋盤轉(zhuǎn)化為特殊棋盤,可以用一個(gè)L型骨牌覆蓋這3個(gè)較小棋盤的會(huì)合處,如(b)所示,從而將原問題轉(zhuǎn)化為4個(gè)較小規(guī)模的棋盤覆蓋問題。遞歸地使用這種分割,直至棋盤簡化為棋盤1×1。75說明:整形二維數(shù)組Board表示棋盤,Borad[0][0]是棋盤的左上角方格。tile是一個(gè)全局整形變量,用來表示L形骨牌的編號(hào),初始值為0。tr:棋盤左上角方格的行號(hào);tc:棋盤左上角方格的列號(hào);dr:特殊方格所在的行號(hào);dc:特殊方格所在的列號(hào);size:size=2k,棋盤規(guī)格為2k×2k。76算法描述voidCB(inttr,tc,dr,dc,size){ if(size==1)return;intt=tile++;//L型骨牌號(hào)s=size/2;//分割棋盤//覆蓋左上角子棋盤if(dr<tr+s&&dc<tc+s)//特殊方格在此棋盤中CB(tr,tc,dr,dc,s);else{//此棋盤中無特殊方格//用t號(hào)L型骨牌覆蓋右下角board[tr+s-1][tc+s-1]=t;//覆蓋其余方格CB(tr,tc,tr+s-1,tc+s-1,s);}//覆蓋右上角子棋盤if(dr<tr+s&&dc>=tc+s)//特殊方格在此棋盤中CB(tr,tc+s,dr,dc,s);else{//此棋盤中無特殊方格//用t號(hào)L型骨牌覆蓋左下角board[tr+s-1][tc+s]=t;//覆蓋其余方格CB(tr,tc+s,tr+s-1,tc+s,s);}//覆蓋左下角子棋盤if(dr>=tr+s&&dc<tc+s)//特殊方格在此棋盤中CB(tr+s,tc,dr,dc,s);else{//用t號(hào)L型骨牌覆蓋右上角board[tr+s][tc+s-1]=t;//覆蓋其余方格CB(tr+s,tc,tr+s,tc+s-1,s);}//覆蓋右下角子棋盤if(dr>=tr+s&&dc>=tc+s)//特殊方格在此棋盤中CB(tr+s,tc+s,dr,dc,s);else{//用t號(hào)L型骨牌覆蓋左上角board[tr+s][tc+s]=t;//覆蓋其余方格CB(tr+s,tc+s,tr+s,tc+s,s);}}77復(fù)雜度分析復(fù)雜度分析:
T(k)=4k-1=O(4k)漸進(jìn)意義下的最優(yōu)算法78最接近點(diǎn)對問題問題描述:給定平面上n個(gè)點(diǎn),找其中的一對點(diǎn),使得在n個(gè)點(diǎn)所組成的所有點(diǎn)對中,該點(diǎn)對間的距離最小。說明:嚴(yán)格來講,最接近點(diǎn)對可能多于一對,為簡便起見,我們只找其中的一對作為問題的解。一個(gè)簡單的做法是將每一個(gè)點(diǎn)與其他n-1個(gè)點(diǎn)的距離算出,找出最小距離的點(diǎn)對即可。該方法的時(shí)間復(fù)雜性是T(n)=n(n-1)/2+n=O(n2),效率較低。已經(jīng)證明,該算法的計(jì)算時(shí)間下界是Ω(nlogn)。79一維空間中的情形先來考慮一維的情形。此時(shí),S中的n個(gè)點(diǎn)退化為x軸上的n個(gè)實(shí)數(shù)x1,x2,…,xn。最接近點(diǎn)對即為這n個(gè)實(shí)數(shù)中相差最小的2個(gè)實(shí)數(shù)。一個(gè)簡單的辦法是先把x1,x2,…,xn排好序,再進(jìn)行一次線性掃描就可以找出最接近點(diǎn)對,T(n)=O(nlogn)。然而這種方法無法推廣到二維情形。假設(shè)我們用x軸上某個(gè)點(diǎn)m將S劃分為2個(gè)子集S1和S2,基于平衡子問題的思想,用S中各點(diǎn)坐標(biāo)的中位數(shù)來作分割點(diǎn)。遞歸地在S1和S2上找出其最接近點(diǎn)對{p1,p2}和{q1,q2},并設(shè)d=min{|p1-p2|,|q1-q2|},S中的最接近點(diǎn)對或者是{p1,p2},或者是{q1,q2},或者是某個(gè){p3,q3},其中p3∈S1且q3∈S2。能否在線性時(shí)間內(nèi)找到p3,q3?80如果S的最接近點(diǎn)對是{p3,q3},即|p3-q3|<d,則p3和q3兩者與m的距離不超過d,即p3∈(m-d,m],q3∈[m,m+d)。由于在S1中,每個(gè)長度為d的半閉區(qū)間至多包含一個(gè)點(diǎn)(否則必有兩點(diǎn)距離小于d),并且m是S1和S2的分割點(diǎn),因此(m-d,m]中至多包含S中的一個(gè)點(diǎn)。由圖可以看出,如果(m-d,m]中有S中的點(diǎn),則此點(diǎn)就是S1中最大點(diǎn)。因此,我們用線性時(shí)間就能找到區(qū)間(m-d,m]和[m,m+d)中所有點(diǎn),即p3和q3。從而我們用線性時(shí)間就可以將S1的解和S2的解合并成為S的解。分割點(diǎn)m的選取不當(dāng),會(huì)造成|Si|=1,|Sj|=n-1的情形,使得T(n)=T(n-1)+O(n)=O(n2)。這種情形可以通過“平衡子問題”方法加以解決:選取各點(diǎn)坐標(biāo)的中位數(shù)作分割點(diǎn)。一維空間中的情形81算法描述及復(fù)雜性算法描述:boolCPair1(S,d){n=|S|;if(n<2){d=∞;returnfalse;}m=Blum(S);//S各點(diǎn)坐標(biāo)中位數(shù)S=>S1+S2;//S1={x|x<=m}S2={x|x>m}CPair1(S1,d1);CPair1(S2,d2);p=max(S1);q=min(S2);d=min(d1,d2,q-p);returnture;}復(fù)雜性分析:
T(n)=O(nlogn)該算法可推廣到二維的情形中去。82二維空間的最接近點(diǎn)對問題下面來考慮二維的情形。選取一垂直線l:x=m來作為分割直線。其中m為S中各點(diǎn)x坐標(biāo)的中位數(shù)。由此將S分割為S1和S2。遞歸地在S1和S2上找出其最小距離d1和d2,并設(shè)d=min{d1,d2},S中的最接近點(diǎn)對或者是d,或者是某個(gè){p,q},其中p∈P1且q∈P2,如圖所示。能否在線性時(shí)間內(nèi)找到p,q?考慮P1中任意一點(diǎn)p,它若與P2中的點(diǎn)q構(gòu)成最接近點(diǎn)對的候選者,則必有distance(p,q)<d。滿足這個(gè)條件的P2中的點(diǎn)一定落在一個(gè)d×2d的矩形R中,如圖所示。由d的意義可知,P2中任何2
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代學(xué)生餐廳的照明與色彩搭配藝術(shù)
- 深度解讀網(wǎng)絡(luò)輿情的來源與影響研究報(bào)告解讀分享
- 現(xiàn)代金融行業(yè)中的移動(dòng)支付技術(shù)與教育普及
- 快手國慶節(jié)的活動(dòng)方案
- 國慶假期活動(dòng)方案
- 國慶節(jié)酒店漲價(jià)活動(dòng)方案
- 2、3、4的乘法口訣(說課稿)-2024-2025學(xué)年二年級(jí)上冊數(shù)學(xué)人教版
- Unit1 There is a horse in this photo(說課稿)-2024-2025學(xué)年外研版(三起)四年級(jí)上冊001
- 17《他們那時(shí)候多有趣啊》(說課稿)-2023-2024學(xué)年統(tǒng)編版語文六年級(jí)下冊
- 13 我能行(說課稿)-統(tǒng)編版(五四制)道德與法治二年級(jí)下冊
- 春節(jié)后復(fù)工安全教育培訓(xùn)考試試題及答案
- 寄宿制學(xué)校工作總結(jié)
- 小學(xué)數(shù)學(xué)6年級(jí)應(yīng)用題100道附答案(完整版)
- 2024年江蘇農(nóng)牧科技職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫含答案
- JT-T 1495-2024 公路水運(yùn)危險(xiǎn)性較大工程專項(xiàng)施工方案編制審查規(guī)程
- JT-T-390-1999突起路標(biāo)行業(yè)標(biāo)準(zhǔn)
- 人教版二年級(jí)上冊加減混合計(jì)算300題及答案
- 2023年四川省成都市武侯區(qū)中考物理二診試卷(含答案)
- 《也是冬天-也是春天》
- 鮮切水果行業(yè)分析
- 第7章-無人機(jī)法律法規(guī)
評(píng)論
0/150
提交評(píng)論