




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
全國軟件設(shè)計大賽培訓(xùn)
第三講:分治法分治法nT(n/2)T(n/2)T(n/2)T(n/2)T(n)=算法總體思想:對這k個子問題分別求解。如果子問題的規(guī)模仍然不夠小,則再劃分為k個子問題,如此遞歸的進行下去,直到問題規(guī)模足夠小,很容易求出其解為止。分治法由分治法產(chǎn)生的子問題往往是原問題的較小模式,這就為使用遞歸技術(shù)提供了方便。在這種情況下,反復(fù)應(yīng)用分治手段,可以使子問題與原問題類型一致而其規(guī)模卻不斷縮小,最終使子問題縮小到很容易直接求出其解。這自然導(dǎo)致遞歸過程的產(chǎn)生。分治與遞歸像一對孿生兄弟,經(jīng)常同時應(yīng)用在算法設(shè)計之中,并由此產(chǎn)生許多高效算法分治法的適用條件該問題的規(guī)??s小到一定的程度就可以容易地解決;該問題可以分解為若干個規(guī)模較小的相同問題,即該問題具有最優(yōu)子結(jié)構(gòu)性質(zhì)利用該問題分解出的子問題的解可以合并為該問題的解;該問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子問題。因為問題的計算復(fù)雜性一般是隨著問題規(guī)模的增加而增加,因此大部分問題滿足這個特征。這條特征是應(yīng)用分治法的前提,它也是大多數(shù)問題可以滿足的,此特征反映了遞歸思想的應(yīng)用能否利用分治法完全取決于問題是否具有這條特征,如果具備了前兩條特征,而不具備第三條特征,則可以考慮貪心算法或動態(tài)規(guī)劃。這條特征涉及到分治法的效率,如果各子問題是不獨立的,則分治法要做許多不必要的工作,重復(fù)地解公共的子問題,此時雖然也可用分治法,但一般用動態(tài)規(guī)劃較好。divide-and-conquer(P){
if(|P|<=n0)adhoc(P);//解決小規(guī)模的問題
dividePintosmallersubinstancesP1,P2,...,Pk;//分解問題
for(i=1,i<=k,i++)yi=divide-and-conquer(Pi);//遞歸的解各子問題
returnmerge(y1,...,yk);//將各子問題的解合并為原問題的解
}分治法的基本步驟人們從大量實踐中發(fā)現(xiàn),在用分治法設(shè)計算法時,最好使子問題的規(guī)模大致相同。即將一個問題分成大小相等的k個子問題的處理方法是行之有效的。這種使子問題規(guī)模大致相等的做法是出自一種平衡(balancing)子問題的思想,它幾乎總是比子問題規(guī)模不等的做法要好。分治法的復(fù)雜性分析一個分治法將規(guī)模為n的問題分成k個規(guī)模為n/m的子問題去解。設(shè)分解閥值n0=1,且adhoc解規(guī)模為1的問題耗費1個單位時間。再設(shè)將原問題分解為k個子問題以及用merge將k個子問題的解合并為原問題的解需用f(n)個單位時間。用T(n)表示該分治法解規(guī)模為|P|=n的問題所需的計算時間,則有:通過迭代法求得方程的解:注意:遞歸方程及其解只給出n等于m的方冪時T(n)的值,但是如果認為T(n)足夠平滑,那么由n等于m的方冪時T(n)的值可以估計T(n)的增長速度。通常假定T(n)是單調(diào)上升的,從而當(dāng)mi≤n<mi+1時,T(mi)≤T(n)<T(mi+1)。
分析:如果n=1即只有一個元素,則只要比較這個元素和x就可以確定x是否在表中。因此這個問題滿足分治法的第一個適用條件分析:比較x和a的中間元素a[mid],若x=a[mid],則x在L中的位置就是mid;如果x<a[mid],由于a是遞增排序的,因此假如x在a中的話,x必然排在a[mid]的前面,所以我們只要在a[mid]的前面查找x即可;如果x>a[i],同理我們只要在a[mid]的后面查找x即可。無論是在前面還是后面查找x,其方法都和在a中查找x一樣,只不過是查找的規(guī)??s小了。這就說明了此問題滿足分治法的第二個和第三個適用條件。
分析:很顯然此問題分解出的子問題相互獨立,即在a[i]的前面或后面查找x是獨立的子問題,因此滿足分治法的第四個適用條件。分治法:二分查找給定已按升序排好序的n個元素a[0:n-1],現(xiàn)要在這n個元素中找出一特定元素x。分析:該問題的規(guī)??s小到一定的程度就可以容易地解決;該問題可以分解為若干個規(guī)模較小的相同問題;分解出的子問題的解可以合并為原問題的解;分解出的各個子問題是相互獨立的。分治法:二分查找給定已按升序排好序的n個元素a[0:n-1],現(xiàn)要在這n個元素中找出一特定元素x。據(jù)此容易設(shè)計出二分搜索算法:intBinarySearch(Typea[],Typex,intl,intr){while(r>=l){intm=(l+r)/2;if(x==a[m])returnm;if(x<a[m])r=m-1;elsel=m+1;}return-1;}算法復(fù)雜度分析:每執(zhí)行一次算法的while循環(huán),待搜索數(shù)組的大小減少一半。因此,在最壞情況下,while循環(huán)被執(zhí)行了O(logn)次。循環(huán)體內(nèi)運算需要O(1)時間,因此整個算法在最壞情況下的計算時間復(fù)雜性為O(logn)。分治法:合并排序基本思想:將待排序元素分成大小大致相同的2個子集合,分別對2個子集合進行排序,最終將排好序的子集合合并成為所要求的排好序的集合。voidMergeSort(Typea[],intleft,intright){
if(left<right){//至少有2個元素
inti=(left+right)/2;//取中點
mergeSort(a,left,i);
mergeSort(a,i+1,right);
merge(a,b,left,i,right);//合并到數(shù)組b
copy(a,b,left,right);//復(fù)制回數(shù)組a}}復(fù)雜度分析T(n)=O(nlogn)漸進意義下的最優(yōu)算法分治法:合并排序最壞時間復(fù)雜度:O(nlogn)平均時間復(fù)雜度:O(nlogn)輔助空間:O(n)分治法:快速排序在快速排序中,記錄的比較和交換是從兩端向中間進行的,關(guān)鍵字較大的記錄一次就能交換到后面單元,關(guān)鍵字較小的記錄一次就能交換到前面單元,記錄每次移動的距離較大,因而總的比較和移動次數(shù)較少。template<classType>voidQuickSort(Typea[],intp,intr){if(p<r){intq=Partition(a,p,r);QuickSort(a,p,q-1);//對左半段排序
QuickSort(a,q+1,r);//對右半段排序
}}分治法:快速排序intPartition(Typea[],intp,intr){inti=p,j=r+1;Typex=a[p];//將<x的元素交換到左邊區(qū)域
//將>x的元素交換到右邊區(qū)域
while(true){while(a[++i]<x);while(a[--j]>x);if(i>=j)break;Swap(a[i],a[j]);}a[p]=a[j];a[j]=x;returnj;}初始序列{6,7,5,2,5,8}j--;{5,7,5,2,6,8}i++;{5,6,5,2,7,8}j--;{5,2,5,6,7,8}i++;完成{6,7,5,2,5,8}{5,2,5}6{7,8}intRandomizedPartition(Typea[],intp,intr){inti=Random(p,r);Swap(a[i],a[p]);returnPartition(a,p,r);}分治法:快速排序
快速排序算法的性能取決于劃分的對稱性。通過修改算法partition,可以設(shè)計出采用隨機選擇策略的快速排序算法。在快速排序算法的每一步中,當(dāng)數(shù)組還沒有被劃分時,可以在a[p:r]中隨機選出一個元素作為劃分基準(zhǔn),這樣可以使劃分基準(zhǔn)的選
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 環(huán)保設(shè)施運維合同樣本
- 專項信托外匯固定資產(chǎn)貸款合作合同
- 玫瑰貸記卡動產(chǎn)質(zhì)押合同協(xié)議
- 員工合同解除合同書
- 贍養(yǎng)義務(wù)履行合同范文
- 聯(lián)合購房按揭貸款合同
- 精簡版商業(yè)租賃合同范本
- 租賃合同季度范本:機械設(shè)備篇
- 南湖區(qū):合同科技創(chuàng)新與合作新機遇
- 出租車股份合作合同條款
- 暑假假期安全教育(課件)-小學(xué)生主題班會
- 《脂肪肝de健康教育》課件
- 2025年外研版小學(xué)英語單詞表全集(一年級起1-12全冊)
- Python爬蟲技術(shù)基礎(chǔ)介紹
- 中華民族共同體概論教案第四講-天下秩序與華夏共同體演進
- 《傳媒法律法規(guī)》課件
- 數(shù)據(jù)中心供配電系統(tǒng)概述演示
- TSG11-2020鍋爐安全技術(shù)規(guī)程(現(xiàn)行)
- 人力資源行業(yè)人力資源管理信息系統(tǒng)實施方案
- 歌曲《wake》中英文歌詞對照
- 義務(wù)教育(音樂)課程標(biāo)準(zhǔn)(2022年版)解讀
評論
0/150
提交評論