算法分析與設(shè)計(jì)_第1頁
算法分析與設(shè)計(jì)_第2頁
算法分析與設(shè)計(jì)_第3頁
算法分析與設(shè)計(jì)_第4頁
算法分析與設(shè)計(jì)_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第一章什么是算法算法是解決一個計(jì)算問題的一系列計(jì)算步驟有序、合理的排列。對一個具體問題(有確定的輸入數(shù)據(jù))依次執(zhí)行一個正確的算法中的各操作步驟,最終將得到該問題的解(正確的輸出數(shù)據(jù))。算法的三個要素 1).數(shù)據(jù): 運(yùn)算序列中作為運(yùn)算對象和結(jié)果的數(shù)據(jù). 2).運(yùn)算: 運(yùn)算序列中的各種運(yùn)算:賦值,算術(shù)和邏輯運(yùn)算 3).控制和轉(zhuǎn)移: 運(yùn)算序列中的控制和轉(zhuǎn)移.算法分類從解法上:數(shù)值型算法:算法中的基本運(yùn)算為算術(shù)運(yùn)算;非數(shù)值型算法:算法中的基本運(yùn)算為邏輯運(yùn)算.從處理方式上:串行算法:串行計(jì)算機(jī)上執(zhí)行的算法;并行算法:并行計(jì)算機(jī)上執(zhí)行的算法算法的五個重要的特性(1) 有窮性:在有窮步之后結(jié)束。(2) 確定

2、性:無二義性。(3) 可行性:可通過基本運(yùn)算有限次執(zhí)行來實(shí)現(xiàn)。(4) 有輸入 表示存在數(shù)據(jù)處理 (5) 有輸出 偽代碼程序設(shè)計(jì)語言(PDL),也稱為結(jié)構(gòu)化英語或者偽代碼,它是一種混合語言,它采用一種語言(例如英語)的詞匯同時采用類似另外一種語言(例如,結(jié)構(gòu)化程序語言)的語法。特點(diǎn):1)使用一些固定關(guān)鍵詞的語法結(jié)構(gòu)表達(dá)了結(jié)構(gòu)化構(gòu)造、數(shù)據(jù)描述、模塊的特征;2)以自然語言的自由語法描述了處理過程;3)數(shù)據(jù)聲明應(yīng)該既包括簡單的也包括復(fù)雜的數(shù)據(jù)結(jié)構(gòu);4)使用支持各種模式的接口描述的子程序定義或者調(diào)用技術(shù)。求兩個n階方陣的相加C=A+B的算法如下,分析其時間復(fù)雜度。 #define MAX 20 /定義最

3、大的方階 void matrixadd(int n,int AMAXMAX, int BMAXMAX,int CMAXMAX) int i,j; for (i=0;i<n;i+)for (j=0;j<n;j+) Cij=Aij+Bij; 該算法中的基本運(yùn)算是兩重循環(huán)中最深層的語句Cij=Aij+Bij,分析它的頻度,即: T(n)= =O(n2)分析以下算法的時間復(fù)雜度。 void func(int n) int i=0,s=0; while (s<n) i+; s=s+i; 對于while循環(huán)語句,設(shè)執(zhí)行的次數(shù)為m,i從0開始遞增1,直到m為止,有:s=0+1+2+(m-1

4、)=m(m-1)/2,并滿足s=m(m-1)/2<n,則有m 。T(n)=O()所以,該算法的時間復(fù)雜度為O()。有如下算法: void fun(int a,int n,int k) /數(shù)組a共有n個元素 int i;if (k=n-1) for (i=0;i<n;i+) /n次 printf("%dn",ai);else for (i=k;i<n;i+)/n-k次ai=ai+i*i; fun(a,n,k+1); 調(diào)用上述算法的語句為fun(a,n,0),求其時間復(fù)雜度。設(shè)fun(a,n,0)的時間復(fù)雜度為T(n),則fun(a,n,k)的執(zhí)行時間為T1(

5、n,k),由fun()算法可知: T1(n,k)=n 當(dāng)k=n-1時 T1(n,k)= (n-k)+T1(n,k+1) 其他情況 則: T(n)=T1(n,0)=n+T1(n,1)=n+(n-1)+T1(n,2)=n+(n-1)+2+T1(n,n-1)=n+(n-1)+ +2+n=O(n2) 所以調(diào)用fun(a,n,0)的時間復(fù)雜度為O(n2)。估計(jì)如下二重循環(huán)算法在最壞情況下時間復(fù)雜性T(n)的階。for i:= 1 to n do for j:=1 to i do s1,s2,s3,s4 ; s1,s2,s3,s4為單一賦值語句分析:內(nèi)循環(huán)體只需O(1)時間,故內(nèi)循環(huán)共需 外循環(huán)共需漸進(jìn)分

6、析 時間復(fù)雜性漸進(jìn)階分析的規(guī)則:(最壞情況) 1). 賦值,比較,算術(shù)運(yùn)算,邏輯運(yùn)算,讀寫單個變量(常量)只需1單位時間 2). 執(zhí)行條件語句 if c then S1 else S2 的時間為TC +max(TS1,TS2). 3). 選擇語句 case A of a1: s1;a2: s2;.; am: sm 需要的時間為 max(TS1,TS2 ,., TSm). 4). 訪問數(shù)組的單個分量或紀(jì)錄的單個域需要一個單位時間. 5). 執(zhí)行for循環(huán)語句的時間=執(zhí)行循環(huán)體時間*循環(huán)次數(shù). 6). while c do s (repeat s until c)語句時間=(Tc+Ts)*循環(huán)次數(shù)

7、. 7). 用goto從循環(huán)體內(nèi)跳到循環(huán)體末或循環(huán)后面的語句時,不需額外時間 8). 過程或函數(shù)調(diào)用語句:對非遞歸調(diào)用,根據(jù)調(diào)用層次由里向外用規(guī)則1-7進(jìn)行分析; 對遞歸調(diào)用,可建立關(guān)于T(n)的遞歸方程,求解該方程得到T(n). 插入排序算法的實(shí)現(xiàn)要點(diǎn):(1)【參數(shù)和返回值】確定輸入數(shù)據(jù)個數(shù)和數(shù)據(jù)類型,輸出個數(shù)和數(shù)據(jù)類型,數(shù)據(jù)的組織形式(即邏輯結(jié)構(gòu):線性表、樹、圖,線性表還包括棧、隊(duì)列),數(shù)據(jù)的存儲格式(數(shù)組還是鏈表),函數(shù)返回值。(2)【數(shù)據(jù)設(shè)置】變量定義與初值設(shè)定。要考慮訪問的所有數(shù)據(jù),包括變量和常量。每個變量都要考慮它的數(shù)據(jù)類型、存儲結(jié)構(gòu)、訪問控制(局部變量、全局變量、靜態(tài)變量、公共屬

8、性、保護(hù)屬性、私有屬性等)和初始值。(3)【關(guān)鍵代碼】要考慮直接轉(zhuǎn)換還是需要建立相應(yīng)的獨(dú)立函數(shù)。對于賦值和下標(biāo)通??梢灾苯愚D(zhuǎn)換。一些操作,比如數(shù)據(jù)輸入、創(chuàng)建、求長度、查找、排序、插入、刪除、顯示、修改等操作,通常需要通過建立專門的獨(dú)立函數(shù)來實(shí)現(xiàn),也可以通過系統(tǒng)提供的命令或函數(shù)來實(shí)現(xiàn)。歸并排序算法的實(shí)現(xiàn)要點(diǎn):(1)【參數(shù)和返回值】確定輸入數(shù)據(jù)個數(shù)和數(shù)據(jù)類型,輸出個數(shù)和數(shù)據(jù)類型,數(shù)據(jù)的組織形式(即邏輯結(jié)構(gòu):線性表、樹、圖,線性表還包括棧、隊(duì)列),數(shù)據(jù)的存儲格式(數(shù)組還是鏈表),函數(shù)返回值。參數(shù):序列Apr的子序列Apq和Aq+1r,可以表示為區(qū)間p,q,q,r指針(或迭代器)p,q,r:p指向第一

9、個子序列的首元素,q指向第二個子序列首元素,r指向第二個子序列末尾元素之后,單個元素?cái)?shù)據(jù)長度及比較函數(shù)指針。返回值:無(2)【數(shù)據(jù)設(shè)置】變量定義與初值設(shè)定。要考慮訪問的所有數(shù)據(jù),包括變量和常量。每個變量都要考慮它的數(shù)據(jù)類型、存儲結(jié)構(gòu)、訪問控制(局部變量、全局變量、靜態(tài)變量、公共屬性、保護(hù)屬性、私有屬性等)和初始值。(3)【關(guān)鍵代碼】要考慮直接轉(zhuǎn)換還是需要建立相應(yīng)的獨(dú)立函數(shù)。對于賦值和下標(biāo)通??梢灾苯愚D(zhuǎn)換。一些操作,比如數(shù)據(jù)輸入、創(chuàng)建、求長度、查找、排序、插入、刪除、顯示、修改等操作,通常需要通過建立專門的獨(dú)立函數(shù)來實(shí)現(xiàn),也可以通過系統(tǒng)提供的命令或函數(shù)來實(shí)現(xiàn)。序列的劃分算法的實(shí)現(xiàn)要點(diǎn):(1)【參

10、數(shù)和返回值】確定輸入數(shù)據(jù)個數(shù)和數(shù)據(jù)類型,輸出個數(shù)和數(shù)據(jù)類型,數(shù)據(jù)的組織形式(即邏輯結(jié)構(gòu):線性表、樹、圖,線性表還包括棧、隊(duì)列),數(shù)據(jù)的存儲格式(數(shù)組還是鏈表),函數(shù)返回值。參數(shù):A 是數(shù)組或序列p, r分別是整數(shù)或者迭代器返回值:分界點(diǎn)位置的整數(shù)或者迭代器(2)【數(shù)據(jù)設(shè)置】變量定義與初值設(shè)定。要考慮訪問的所有數(shù)據(jù),包括變量和常量。每個變量都要考慮它的數(shù)據(jù)類型、存儲結(jié)構(gòu)、訪問控制(局部變量、全局變量、靜態(tài)變量、公共屬性、保護(hù)屬性、私有屬性等)和初始值。(3)【關(guān)鍵代碼】要考慮直接轉(zhuǎn)換還是需要建立相應(yīng)的獨(dú)立函數(shù)。對于賦值和下標(biāo)通??梢灾苯愚D(zhuǎn)換。一些操作,比如數(shù)據(jù)輸入、創(chuàng)建、求長度、查找、排序、插入

11、、刪除、顯示、修改等操作,通常需要通過建立專門的獨(dú)立函數(shù)來實(shí)現(xiàn),也可以通過系統(tǒng)提供的命令或函數(shù)來實(shí)現(xiàn)。第二章直接或間接地調(diào)用自身的算法稱為遞歸算法。用函數(shù)自身給出定義的函數(shù)稱為遞歸函數(shù)。分治法的設(shè)計(jì)思想:將一個難以直接解決的大問題,分割成一些規(guī)模較小的相同問題,以便各個擊破,分而治之。分治策略在每一層遞歸包括3個步驟:分解 將問題分解成若干個子問題。治理 遞歸地解決各子問題。不過若子問題的規(guī)模足夠小,就以直接的方式(不再遞歸)解決子問題。合并 將子問題的解合并成原問題的一個解。divide-and-conquer(P) if ( | P | <= n0) adhoc(P); /解決小規(guī)模

12、的問題 divide P into smaller subinstances P1,P2,.,Pk;/分解問題 for (i=1,i<=k,i+) yi=divide-and-conquer(Pi); /遞歸的解各子問題 return merge(y1,.,yk); /將各子問題的解合并為原問題的解 分治法的復(fù)雜性分析:一個分治法將規(guī)模為n的問題分成k個規(guī)模為nm的子問題去解。設(shè)分解閥值n0=1,且adhoc解規(guī)模為1的問題耗費(fèi)1個單位時間。再設(shè)將原問題分解為k個子問題以及用merge將k個子問題的解合并為原問題的解需用f(n)個單位時間。用T(n)表示該分治法解規(guī)模為|P|=n的問題所

13、需的計(jì)算時間,則有: 通過迭代法求得方程的解:遞歸小結(jié):優(yōu)點(diǎn):結(jié)構(gòu)清晰,可讀性強(qiáng),而且容易用數(shù)學(xué)歸納法來證明算法的正確性,因此它為設(shè)計(jì)算法、調(diào)試程序帶來很大方便。缺點(diǎn):遞歸算法的運(yùn)行效率較低,無論是耗費(fèi)的計(jì)算時間還是占用的存儲空間都比非遞歸算法要多。解決方法:在遞歸算法中消除遞歸調(diào)用,使其轉(zhuǎn)化為非遞歸算法。1、采用一個用戶定義的棧來模擬系統(tǒng)的遞歸調(diào)用工作棧。該方法通用性強(qiáng),但本質(zhì)上還是遞歸,只不過人工做了本來由編譯器做的事情,優(yōu)化效果不明顯。2、用遞推來實(shí)現(xiàn)遞歸函數(shù)。3、通過變換能將一些遞歸轉(zhuǎn)化為非遞歸,從而迭代求出結(jié)果。二分搜索算法:template<class Type> in

14、t BinarySearch(Type a, const Type& x, int l, int r) while (r >= l) int m = (l+r)/2; if (x = am) return m; if (x < am) r = m-1; else l = m+1; return -1; 算法復(fù)雜度分析:每執(zhí)行一次算法的while循環(huán), 待搜索數(shù)組的大小減少一半。因此,在最壞情況下,while循環(huán)被執(zhí)行了O(logn) 次。循環(huán)體內(nèi)運(yùn)算需要O(1) 時間,因此整個算法在最壞情況下的計(jì)算時間復(fù)雜性為O(logn) 。第三章動態(tài)規(guī)劃算法總體思想:動態(tài)規(guī)劃算法與分治

15、法類似,其基本思想也是將待求解問題分解成若干個子問題,但是經(jīng)分解得到的子問題往往不是互相獨(dú)立的。不同子問題的數(shù)目常常只有多項(xiàng)式量級。在用分治法求解時,有些子問題被重復(fù)計(jì)算了許多次。如果能夠保存已解決的子問題的答案,而在需要時再找出已求得的答案,就可以避免大量重復(fù)計(jì)算,從而得到多項(xiàng)式時間算法。分治法與動態(tài)規(guī)劃的相同點(diǎn):分治法與動態(tài)規(guī)劃,二者要求原問題具有最優(yōu)子結(jié)構(gòu),都是將問題分而治之分解成若干個規(guī)模較小的子問題 。不同點(diǎn):分治法是將原問題分解為多個子問題,利用遞歸對各個子問題獨(dú)立求解,最后利用各子問題的解進(jìn)行合并形成原問題的解。分治法將分解后的子問題看成是相互獨(dú)立的。動態(tài)規(guī)劃是將原問題分解為多個

16、子問題,通過計(jì)算出子問題的結(jié)果構(gòu)造一個最優(yōu)解。動態(tài)規(guī)劃通過迭代法自底向上求解,動態(tài)規(guī)劃將分解后的子問題理解為相互間有聯(lián)系,有重疊的部分。knapsack算法實(shí)現(xiàn)要點(diǎn):(1)【參數(shù)和返回值】參數(shù):物件個數(shù)n,重量數(shù)組W(一維整型),價值數(shù)組C(一維整型),背包容量C(整型)。 返回值:返回整型二維數(shù)組m(2)【數(shù)據(jù)設(shè)置】設(shè)置一個(n+1 )×(c+1 )二維數(shù)表m;循環(huán)控制變量i,j(整數(shù))(3)【關(guān)鍵代碼】偽代碼結(jié)構(gòu)清晰,容易實(shí)現(xiàn)。Floyd算法實(shí)現(xiàn)要點(diǎn):(1)【參數(shù)和返回值】參數(shù):圖的頂點(diǎn)個數(shù)n;圖的鄰接矩陣:浮點(diǎn)型矩陣w;返回值:返回矩陣D和構(gòu)成的數(shù)據(jù)結(jié)構(gòu)(2)【數(shù)據(jù)設(shè)置】兩個二

17、維數(shù)表d和pi(對應(yīng)矩陣D和 );循環(huán)控制變量i, j,k(整數(shù))(3)【關(guān)鍵代碼】頂點(diǎn)從0n-1編號。鄰接矩陣D中用浮點(diǎn)型最大值代替;父結(jié)點(diǎn)矩陣中空指針NIL用-1表示;要輸出路徑還需要實(shí)現(xiàn)PRINT-ALL-PAIRS-SHORTEST-PATHS算法第四章:貪心算法:依賴于當(dāng)前已經(jīng)做出的所有選擇,采用自頂向下(每一步根據(jù)策略得到當(dāng)前一個最優(yōu)解,保證每一步都是選擇當(dāng)前最優(yōu)的)的解決方法。貪婪算法設(shè)計(jì)的3個步驟:(1)分析問題的最優(yōu)子結(jié)構(gòu)(2)分析問題的貪婪選擇性質(zhì)(3)根據(jù)最優(yōu)子結(jié)構(gòu)和貪婪性質(zhì)自頂向下計(jì)算最優(yōu)解。Huffman算法實(shí)現(xiàn)要點(diǎn):(1)【參數(shù)和返回值】參數(shù):字符集C及頻數(shù)數(shù)組及個

18、數(shù);返回值:返回二叉樹(2)【數(shù)據(jù)設(shè)置】需要最小優(yōu)先隊(duì)列Q;循環(huán)控制變量i(整數(shù))(3)【關(guān)鍵代碼】需要先實(shí)現(xiàn)二叉樹的數(shù)據(jù)結(jié)構(gòu)單源最短路徑算法實(shí)現(xiàn)要點(diǎn)(與prim算法類似):(1)【參數(shù)和返回值】參數(shù):圖形矩陣W(浮點(diǎn)型)及頂點(diǎn)數(shù)n (整型)及源點(diǎn)s(整型)返回值:返回key和pi的數(shù)據(jù)結(jié)構(gòu)(2)【數(shù)據(jù)設(shè)置】需要浮點(diǎn)型數(shù)組d和整型數(shù)組pi,需要最小優(yōu)先隊(duì)列Q;需要頂點(diǎn)變量u和v(整數(shù))(3)【關(guān)鍵代碼】需要先實(shí)現(xiàn)動態(tài)優(yōu)先隊(duì)列第六章廣度優(yōu)先搜索BFS算法實(shí)現(xiàn)要點(diǎn):(1)【參數(shù)和返回值】數(shù)據(jù)類型:圖的鄰接表數(shù)組adj和圖的頂點(diǎn)個數(shù)n,隊(duì)列操作過程:隊(duì)列的創(chuàng)建、判空、入隊(duì)、出隊(duì),隊(duì)列需要指向隊(duì)首和隊(duì)

19、尾的指針head和trail參數(shù):鄰接表表示的圖g和源點(diǎn)s;返回值:返回?cái)?shù)組p和d構(gòu)成的數(shù)據(jù)結(jié)構(gòu)(2)【數(shù)據(jù)設(shè)置】為了提高可讀性,定義枚舉類型Color,包含顏色WHITE、GRAY和BLACK。聲明隊(duì)列Q,表示計(jì)算結(jié)果數(shù)組color(枚舉類型)、d(整型)和pi(整型 );臨時變量u和v(整型)(3)【關(guān)鍵代碼】頂點(diǎn)從0n-1編號。最短路徑距離d中用整型最大值INT_MAX代替;父結(jié)點(diǎn)數(shù)組;中空指針NIL用-1表示;要輸出路徑還需要實(shí)現(xiàn)PRINT-PATHS算法深度優(yōu)先搜索DFS算法實(shí)現(xiàn)要點(diǎn):(1)【參數(shù)和返回值】 數(shù)據(jù)類型:圖的鄰接表數(shù)組adj和圖的頂點(diǎn)個數(shù)n,棧操作過程:棧的創(chuàng)建、判空、

20、入棧、出棧,棧需要指向棧頂和棧底的指針top和bottom參數(shù):鄰接表表示的圖g和源點(diǎn)s;返回值:返回?cái)?shù)組,d和f構(gòu)成的數(shù)據(jù)結(jié)構(gòu)(2)【數(shù)據(jù)設(shè)置】為了提高可讀性,定義枚舉類型Color,包含顏色WHITE、GRAY和BLACK。聲明棧S,表示計(jì)算結(jié)果數(shù)組color(枚舉類型)、d(整型)、f (整型)和pi(整型 )臨時變量u,v和s(整型)(3)【關(guān)鍵代碼】頂點(diǎn)從0n-1編號。父結(jié)點(diǎn)數(shù)組;中空指針NIL用-1表示;需要考慮如何實(shí)現(xiàn)第13行:if $vÎ Adju and colorv = WHITE第十章泛型程序設(shè)計(jì)的主要思想將算法從特定的數(shù)據(jù)結(jié)構(gòu)中抽象出來,成為通用的、可以作用于各種不同的數(shù)據(jù)結(jié)構(gòu)。概念(concept):用來界定具備一定功能的數(shù)據(jù)類型,如“支持<運(yùn)算符”的數(shù)據(jù)類型構(gòu)成Comparable這一概念;模型(model):符合一個概念的數(shù)據(jù)類型稱為該概念的模型,如int型是Comparable概念的模型。STL就是建立在模板函數(shù)和模板類基礎(chǔ)之上的功能強(qiáng)大的庫模板函數(shù)可以實(shí)現(xiàn)一般化的常用算法(如統(tǒng)計(jì)、排序、查找等)模板類可以實(shí)現(xiàn)支持幾乎所有類型的容器,用來實(shí)現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)(如鏈表、棧、隊(duì)列、平衡二叉樹等)容器(Container)容器是存放其

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論