




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
計算機算法基礎第一章第一頁,共103頁。有兩種思想,像珠寶商放在天鵝絨上的寶石一樣熠熠生輝.一個是微積分,另一個就是算法.微積分以及在微積分基礎上建立起來的數學分析體系造就了現代科學,而算法造就了現代世界.——DavidBerlinski第二頁,共103頁。算法的研究內容問題是否可解1930’s研究集中于判斷特定問題在計算機上是否可解,基本方法為:選定一個計算模型,觀察是否能在該模型上創(chuàng)建能解決問題的算法。這些計算模型包括:Postmachines、Turingmachines等。這一階段的成果是:大部分問題為不可解。高效率的解決方法隨著計算機的發(fā)展和數據資源的增加,算法研究轉向針對可解的問題,找到高效率的解決方法。第三頁,共103頁。算法的應用數據庫中的檢索搜索引擎中的檢索公共密鑰加密和數字簽名技術優(yōu)化問題最短路徑資源分配…第四頁,共103頁。章節(jié)安排《計算機算法基礎》,余祥宣、崔國華、鄒海明著,華中科技大學出版社第一章導引與基本數據結構 √第二章分治法 √第三章貪心方法 √第四章動態(tài)規(guī)劃 √第五章檢索與周游 √第六章回溯法 √第七章分枝-限界 √第八章NP-問題 ⊙
第五頁,共103頁。預備知識數學:集合、證明方法(直接、間接、反證、反例、歸納假設)、對數基礎、FLOOR&CEILING函數、階乘、遞歸關系數據結構:鏈接表、圖、樹、二元樹第六頁,共103頁。第一章導引與基本數據結構1.1算法的定義及特性什么是算法?一系列將問題的輸入轉換為輸出的計算或操作步驟。
第七頁,共103頁。2.算法的五個重要特性確定性、能行性、輸入、輸出、有窮性1)確定性:算法的每種運算必須要有確切的定義,不能有二義性。例:不符合確定性的運算5/0將6或7與x相加未賦值變量參與運算第八頁,共103頁。2)能行性算法中有待實現的運算都是基本的運算,原理上每種運算都能由人用紙和筆在有限的時間內完成。例:整數的算術運算是“能行”的實數的算術運算是“不能行”的第九頁,共103頁。3)輸入每個算法有0個或多個輸入。這些輸入是在算法開始之前給出的量,取自于特定的對象集合——定義域(或值域)4)輸出一個算法產生一個或多個輸出,這些輸出是同輸入有某種特定關系的量。第十頁,共103頁。5)有窮性一個算法總是在執(zhí)行了有窮步的運算之后終止。
計算過程:只滿足確定性、能行性、輸入、輸出四個特性但不一定能終止的一組規(guī)則。
準確理解算法和計算過程的區(qū)別:不能終止的計算過程:操作系統(tǒng)算法是“可以終止的計算過程”算法的時效性:只能把在相當有窮步內終止的算法投入到計算機上運行第十一頁,共103頁。3.我們的主要任務算法學習將涉及5個方面的內容:1)設計算法:創(chuàng)造性的活動2)表示算法:思想的表示形式3)確認算法:證明算法的正確性程序的證明4)分析算法:算法時空特性分析5)測試程序:調試和作出時空分布圖本課程集中于學習算法的設計與分析。通過學習,掌握計算機算法設計和分析基本策略與方法,為設計更復雜、更有效的算法奠定基礎第十二頁,共103頁。自然語言,數學語言,流程圖,程序設計語言等等.2)建立數學模型1)問題的陳述3)算法設計用科學規(guī)范的語言,對所求解的問題做準確的描述.通過對問題的分析,找出其中的所有操作對象及操作對象之間的關系并用數學語言加以描述.根據數學模型設計問題的計算機求解算法.第十三頁,共103頁。4)算法的正確性證明5)算法的程序實現6)算法分析證明算法對一切合法輸入均能在有限次計算后產生正確輸出.對執(zhí)行該算法所消耗的計算機資源進行估算.將算法正確地編寫成機器語言程序.第十四頁,共103頁。1.2分析算法1.分析算法的目的在于:通過對算法的分析,在把算法變成程序實際運行前,就知道為完成一項任務所設計的算法的好壞,從而運行好的算法,改進差的算法,避免無益的人力和物力浪費。算法分析是計算機領域的古老而前沿的課題。進行算法分析的基本技術:抽象第十五頁,共103頁。2.重要的假設和約定1)計算機模型的假設Turing機模型:計算機形式理論模型通用計算機模型:單處理器有足夠的“內存”能在固定的時間內存取數據單元第十六頁,共103頁。2)計算的約定確定使用什么樣的運算及其執(zhí)行時間。從計算時間上,運算的分類:
時間囿界于常數的運算:盡管每種運算的執(zhí)行時間不同,但一般只花一個固定量的時間(單位時間)就可完成。
·基本算術運算,如整數、浮點數的加、減、乘、除
·字符運算
·賦值運算
·過程調用等第十七頁,共103頁。2)計算的約定(續(xù))其他運算:
·字符串操作:與字符串中字符的數量成正比
·記錄操作:與記錄的屬性數、屬性類型等有關
·特點:運算時間無定量如何分析非時間囿界于常數的運算:分解成若干時間囿界于常數的運算。
如:Tstring=Length(String)*tchar算法的執(zhí)行時間=∑Fi*ti其中,Fi是算法中用到的某種運算i的次數,ti是該運算執(zhí)行一次所用的時間。第十八頁,共103頁。3)工作數據集的選擇編制能夠反映算法在最好、平均、最壞情況下工作的數據配置。然后使用這些數據配置運行算法,以了解算法的性能。測試數據集的生成作為算法分析的數據集:典型特征作為程序性能測試的數據集:對執(zhí)行指標產生影響的性質第十九頁,共103頁。3.如何進行算法分析?對算法進行全面分析,可分兩個階段進行:事前分析:就算法本身,通過對其執(zhí)行性能的理論分析,得出關于算法特性——時間和空間的一個特征函數(Ο、Ω)——與計算機物理軟硬件沒有直接關系。事后測試:將算法編制成程序后實際放到計算機上運行,收集其執(zhí)行時間和空間占用等統(tǒng)計資料,進行分析判斷——直接與物理實現有關。第二十頁,共103頁。1)事前分析目的:試圖得出關于算法執(zhí)行特性的一種形式描述,以“理論上”衡量算法的“好壞”。如何給出反映算法執(zhí)行特性的描述?最直接方法:統(tǒng)計算法中各種運算的執(zhí)行情況,包括:運用了哪些運算每種運算被執(zhí)行的次數該種運算執(zhí)行一次所花費的時間等。
算法的執(zhí)行時間=∑Fi*ti第二十一頁,共103頁。頻率計數例:x←x+yfori←1tondofori←1tondox←x+yforj←1tondorepeatx←x+yrepeatrepeat(a)(b)(c)分析:(a):x←x+y執(zhí)行了1次(b):x←x+y執(zhí)行了n次(c):x←x+y執(zhí)行了n2次定義:
頻率計數:一條語句或一種運算在算法(或程序)體中的執(zhí)行次數。第二十二頁,共103頁。
算法2.7插入分類procedureINSERTIONSORT(A,n)//將A(1:n)中的元素按非降次序分類,n≥1//1A(0)←-∞//設置初始邊界值2forj←2tondo//A(1:j-1)已分類//3item←A(j);i←j-14whileitem<A(i)do//0≤i<j//5A(i+1)←A(i);i←i-16repeat7A(i+1)←item;8repeatendINSERTIONSORT
(8,5,4,9)(8,5,4,9)
(5,8,4,9)(5,8,
4,9)(4,5,8,9)(4,5,8,9)第二十三頁,共103頁。一條語句在整個程序運行時實際執(zhí)行時間=
頻率計數*每執(zhí)行一次該語句所需的時間如何刻畫算法執(zhí)行特性的形式描述實際執(zhí)行時間受約于諸多實際因素,如機器類型、編程與語言、操作系統(tǒng)等,沒有統(tǒng)一的描述模型。在事前分析中,只限于確定與所使用的機器及其他環(huán)境因素無關的頻率計數,依此建立理論分析模型。第二十四頁,共103頁。數量級
語句的數量級:語句的執(zhí)行頻率例:1,n,n2
算法的數量級:算法所包含的所有語句的執(zhí)行頻率之和。算法的數量級從本質上反映了一個算法的執(zhí)行特性。例:假如求解同一個問題的三個算法分別具有n,n2,n3數量級。若n=10,則可能的執(zhí)行時間將分別是10,100,1000個單位時間——與環(huán)境因素無關。第二十五頁,共103頁。計算時間/頻率計數的表示函數通過事前分析給出算法計算時間(頻率計數)的一個函數表示形式,一般記為與輸入規(guī)模n有關的函數形式:f(n)注:最高次項與函數整體的關系空間特性分析(略)第二十六頁,共103頁。2)事后測試目的:運行程序,確定程序實際耗費的時間與空間,驗證先前的分析結論——包括正確性、執(zhí)行性能等,比較、優(yōu)化所設計的算法。分析手段:作時、空性能分布圖第二十七頁,共103頁。4.計算時間的漸近表示記:算法的計算時間為f(n)數量級限界函數為g(n)其中,n是輸入或輸出規(guī)模的某種測度。f(n)表示算法的“實際”執(zhí)行時間—與機器及語言有關。g(n)是形式簡單的函數,如nm,logn,2n,n!等。是事前分析中通過對計算時間或頻率計數統(tǒng)計分析所得的、與機器及語言無關的函數。
以下給出算法執(zhí)行時間:上界(О)、下界(Ω)、“平均”()的定義。第二十八頁,共103頁。1)上界函數定義1如果存在兩個正常數c和n0,對于所有的n≥n0,有|f(n)|≤c|g(n)|則記作f(n)=Ο(g(n))含義:如果算法用n值不變的同一類數據在某臺機器上運行時,所用的時間總是小于|g(n)|的一個常數倍。所以g(n)是計算時間f(n)的一個上界函數。f(n)的數量級就是g(n)。試圖求出最小的g(n),使得f(n)=Ο(g(n))。
第二十九頁,共103頁。多項式定理:定理1若A(n)=amnm+…+a1n+a0是一個m次多項式,則有A(n)=Ο(nm)即:變量n的固定階數為m的任一多項式,與此多項式的最高階nm同階。
證明:取n0=1,當n≥n0時,有|A(n)|≤|am|nm+…+|a1|n+|a0|≤(|am|+|am-1|/n+…+|a0|/nm)nm
≤(|am|+|am-1|+…+|a0|)nm
令c=|am|+|am-1|+…+|a0|則,定理得證。第三十頁,共103頁。計算時間的數量級對算法有效性的影響數量級的大小對算法的有效性有決定性的影響。例:假設解決同一個問題的兩個算法,它們都有n個輸入,計算時間的數量級分別是n2和nlogn。則,n=1024:分別需要1048576和10240次運算。n=2048:分別需要4194304和22528次運算。分析:在n加倍的情況下,一個Ο(n2)的算法計算時間增長4倍,而一個Ο(nlogn)算法則只用兩倍多一點的時間即可完成。第三十一頁,共103頁。算法2.8歸并分類
procedureMERGESORT(low,high)//A(low:high)是一個全程數組,它含有high-low+1≥0個待分類的元素//integerlow,highiflow<highthen
mid←//計算中分點//callMERGESORT(low,mid)//在第一個子集合上分類(遞歸)//callMERGESORT(mid+1,high)//在第二個子集合上分類(遞歸)//callMERGE(low,mid,high)//歸并已分類的兩子集合//endifendMERGESORT第三十二頁,共103頁。Merge算法示例(4,5,8,9)|(1,2,6,7)
(1,2,4,5,6,7,8,9)參數:low=1;high=8;mid=4(4,5,8,9)|(1,2,6,7)hjjjjhh(14256789)j第三十三頁,共103頁。算法分類(計算時間)多項式時間算法:可用多項式(函數)對其計算時間限界的算法。常見的多項式限界函數有:
Ο(1)<Ο(logn)<Ο(n)<Ο(nlogn)<Ο(n2)<Ο(n3)指數時間算法:計算時間用指數函數限界的算法常見的指數時間限界函數:
Ο(2n)<Ο(n!)<Ο(nn)說明:當n取值較大時,指數時間算法和多項式時間算法在計算時間上非常懸殊。第三十四頁,共103頁。典型的計算時間函數曲線第三十五頁,共103頁。當數據集的規(guī)模很大時,要在現有的計算機系統(tǒng)上運行具有比Ο(nlogn)復雜度還高的算法是比較困難的。指數時間算法只有在n取值非常小時才實用。要想在順序處理機上擴大所處理問題的規(guī)模,有效的途徑是降低算法的計算復雜度,而不是(僅僅依靠)提高計算機的速度。第三十六頁,共103頁。計算時間函數值比較第三十七頁,共103頁。定義1.2如果存在兩個正常數c和n0,對于所有的n≥n0,有|f(n)|≥c|g(n)|則記作f(n)=Ω(g(n))含義:如果算法用n值不變的同一類數據在某臺機器上運行時,所用的時間總是不小于|g(n)|的一個常數倍。所以g(n)是計算時間f(n)的一個下界函數。試圖求出“最大”的g(n),使得f(n)=Ω(g(n))。2)下界函數第三十八頁,共103頁。定義1.3如果存在正常數c1,c2和n0,對于所有的n≥n0,有c1|g(n)|≤|f(n)|≤c2|g(n)|則記作含義:算法在最好和最壞情況下的計算時間就一個常數因子范圍內而言是相同的??煽醋鳎杭扔衒(n)=Ω(g(n)),又有f(n)=Ο(g(n))3)“平均情況”限界函數第三十九頁,共103頁。4)限界函數的性質1)若且,則。即О具有傳遞性。(同)2)當且僅當3)若,則。即,定義了一個等價關系(等價類)第四十頁,共103頁。5.常用的整數求和公式在算法分析中,在統(tǒng)計語句的頻率時,求和公式的一般表示形式為:如:第四十一頁,共103頁。1+1+…+1(有n項1)=n1+2+…+n=n212+22+…+n2=n320+21+…+2n=2n+1第四十二頁,共103頁。1.3關于SPARKS語言本書為描述算法選用的一種類計算機語言類PASCAL語言結構化程序描述第四十三頁,共103頁。1.基本語法成分1)數據類型:整型、實型、布爾型、字符型2)變量聲明:integeri,j;booleanb;charc3)賦值運算:(變量)←(表達式)4)邏輯運算:andornot5)關系運算:<≤=≠≥>6)變量聲明:類型說明符變量;7)數組聲明:integerA(1:5,7:20)第四十四頁,共103頁。8)控制結構:
順序:分支:
·ifconditionthenS1elseS2endif
·case:cond1:S1;:cond2:S2;…:condn:Sn:else:Sn+1endcase循環(huán):
·whileconddoSrepeat
·loopSuntilcondrepeat
·forvble←starttofinishbyincrementdoSrepeat
2.同質異項3.其它
函數的定義與調用、函數和過程、變量與形式參數第四十五頁,共103頁。1.4基本數據結構1.棧和隊列棧和隊列:n個元素的線性表利用動態(tài)數據結構——鏈表實現?;蜿犃欣渺o態(tài)數據結構——數組實現?;蜿犃谢谝陨蟽煞N表示形式的棧和隊列上的基本運算第四十六頁,共103頁。隊列的數組表示第四十七頁,共103頁。棧的數組表示用一維數組STACKS(1:n)表示棧底:STACKS(1)第i個元素STACKS(i)棧頂指針:topprocedureADD(item,STACAK,n,top)iftop≥nthencallSTACKFULLendiftop←top+1STACK(top)←itemendaddprocedureDELETE(item,STACK,top)iftop≤0thencallSTACKEMPTYendifitem←STACK(top)top←top-1endDELETE第四十八頁,共103頁。棧的數組表示——增加、刪除第四十九頁,共103頁。棧的鏈接表表示一種單向鏈接表兩個信息段:DATA存放數據,LINK指向前一節(jié)點節(jié)點插入callGETNODE(T)DATA(T)←itemLINK(T)←STACKSTACK←T節(jié)點刪除item←DATA(STACK)T←STACKSTACK←LINK(SATCK)callRETNODE(T)ASTACK0第五十頁,共103頁。棧的鏈接表表示——增加、刪除第五十一頁,共103頁。2.樹1)樹的一般定義定義1.4樹(tree)是一個或多個結點的有限集合,它使得:有一個指定為根(root)的結點剩余結點被劃分成m≥0個不相交的集合:T1,…,Tm這些集合的每一個又都是一棵樹,并稱T1,…,Tm為根的子樹。第五十二頁,共103頁。關于樹的重要概念結點的度(degree):一個結點的子樹數樹的度:樹中結點度的最大值結點的級(level)(又叫層):設根是1級,若某結點在p級,則它的兒子在p+1級樹的高度(或深度):樹中結點的最大級數葉子(終端結點):度為0的結點內結點(非終端結點):度不為0的結點森林:m≥0個不相交樹的集合。第五十三頁,共103頁。樹的表示方法用鏈接表表示
每個結點三個信息段:TAG,DATA,LINK
TAG=0,DATA存數據;TAG=1,DATA存鏈接信息,指向一棵子樹第五十四頁,共103頁。2)二元樹定義1.5二元樹(binarytree)是結點的有限集合,它或者為空,或者由一個根和兩棵稱為左子樹和右子樹的不相交二元樹所組成。二元樹與度為2的樹的區(qū)別二元樹性質1:引理1.1一棵二元樹第i級的最大結點數是2i-1。深度為k的二元樹的最大結點數為2k-1,k>0。
第五十五頁,共103頁。第五十六頁,共103頁。特殊形態(tài)的二元樹
滿二元樹:深度為k且有2k-1個結點的二元樹
第五十七頁,共103頁。完全二元樹:一棵有n個結點深度為k的二元樹,當它的結點相當于深度為k的滿二元樹中編號為1到n的結點時,稱該二元樹是完全的。完全二元樹的葉子結點至多出現在相鄰的兩級上。完全二元樹的結點可以緊湊地存放在一個一維數組中(性質見引理1.2)。第五十八頁,共103頁。二元樹的表示方法1.數組表示法:對于完全二元樹,空間效率好;其他二元樹,要浪費大量空間2.鏈表法:結構簡單,有效。鏈表中每個結點有三個信息段,LCHILD,DATA和RCHILD第五十九頁,共103頁。③堆:堆是一棵完全二元樹,它的每個結點的值至少和該結點的兒子們(如果存在的話)的值一樣大(max-堆)(或小,min-堆)。
第六十頁,共103頁。④二分檢索樹:二分檢索樹T是一棵二元樹,它或者為空,或者其每個結點含有一個可以比較大小的數據元素,且有:·T的左子樹的所有元素比根結點中的元素??;·T的右子樹的所有元素比根結點中的元素大;·T的左子樹和右子樹也是二分檢索樹。
注:二分檢索樹要求樹中所有結點的元素值互異第六十一頁,共103頁。第六十二頁,共103頁。3.樹的應用——不相交集合的合并及搜索問題問題描述:給定一個全集U,該集合包含n個元素很明顯該集合包含多個不相交的子集某些應用需要實現這些不相交子集的合并、查找操作,并且這些操作最終可形成序列如何高效率實現這些操作序列就是我們要解決的問題第六十三頁,共103頁。集合操作舉例n=10,U={1,2,3,4,5,6,7,8,9,10}s1={1,7,8,9};s2={2,5,10};s3={3,4,6}合并運算:s1∪s2={1,7,8,9,2,5,10}查找運算:元素4包含在s1,s2,s3的哪個集合中?第六十四頁,共103頁。方法一——位向量方法一:位向量s1={1,0,0,0,0,0,1,1,1,0};s2={0,1,0,0,1,0,0,0,0,1};利用位運算可得出s1∪s2={1,1,0,0,1,0,1,1,1,1}缺點:n很大,超過一個機器字長,而參與運算的集合的勢很小時,運算與n成正比。第六十五頁,共103頁。方法二——集合元素表s1={1,7,8,9};s2={2,5,10}合并操作:|s1|+|s2|查找操作:最壞為|n|第六十六頁,共103頁。方法三——樹第六十七頁,共103頁。數據結構字符數組U={1,2,3,4,5,6,7,8,9,10}子集s1={1,7,8,9};s2={2,5,10}則用數組Parent表示集合s1和s2:數組中記錄的是節(jié)點U[i]的父節(jié)點在Parent中的位置(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)00……2…1112合并操作U(1,2)后:(Parent[1]=2)(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)20……2…1112第六十八頁,共103頁。查找元素F(9)U操作為常量時間,F操作則與查找元素在集合樹中的層數有關。第六十九頁,共103頁。U和F的性能問題——退化樹問題描述:有集合如下:(1)(2)…(n)000依次作下列操作:U(1,2),F(1),U(2,3),F(1),…,U(n-1,n)按照算法U和F,最終得到的樹及時間耗費分析U:每次都是常量時間,因此總共是O(n-1)F(1):2+3+…+(n-1),因此是O(n^2)癥結?合并操作!第七十頁,共103頁。加權規(guī)則節(jié)點數少的樹合并到節(jié)點數多的樹中。字符數組U={1,2,3,4,5,6,7,8,9,10}子集s1={1,7,8,9};s2={2,5,10}(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)-4-3……2…1112第七十一頁,共103頁。UnionF序列演示第七十二頁,共103頁。分析Union(1,2),F(1),Union(2,3),F(1),…,Union(n-1,n)Union合并的開銷較u要大,但仍然是常量時間每次查找1耗費時間為2,常量時間,則執(zhí)行n-2次查找耗費時間為O(n)注意:本例的查找耗時不是最壞情況第七十三頁,共103頁。引理1.3設T是一棵由算法union所產生的有n個節(jié)點的樹。在T中沒有節(jié)點的級數會大于(logn的下界+1)證明:n=1,顯然引理為真;i為T的級數,假設當i<=n-1時,引理為真,現證對于i=n,引理也為真;令k和j是形成樹T的最后一次合并,即Union(k,j);用count()表示數的節(jié)點數,假設count(j)=m,那么count(k)=n-m;不失一般性,可假設1<=m<n/2,則有m<=n-m;那么經Union合并后,j的父親為k;如右圖:則T的級數:1)等于k的級數:log(n-m)的下界+1<=(logn的下界+1)2)或者等于(j的級數+1):(logm的下界+2)<=(log(n/2)的下界+2)<=(logn的下界+1)得證第七十四頁,共103頁。壓縮規(guī)則更快的平均查找時間,適用于頻繁查找操作例1.2在下圖示例中實現8次對元素8的查找,用Find(8)算法實現總共20次,優(yōu)于使用F的8*3=24次結論:對于m次Find和n次Union的混合序列(m>=n),處理時間接近O(m),但稍差。詳細描述見引理1.4。第七十五頁,共103頁。第七十六頁,共103頁。4.圖圖G由稱之為結點V和邊E的兩個集合組成,記為G=(V,E)。其中,V是一個有限非空的結點集合;E是結點對偶的集合,E的每一對偶表示G的一條邊。第七十七頁,共103頁。有關圖的的重要概念無向圖:邊的表示(i,j)有向圖:邊的表示〈i,j〉成本:帶有成本的圖稱為網絡鄰接:結點的度(出度/入度)路徑:由結點vp到vq的一條路(path)是結點vp,
vi1,
vi2,
…,
vim,
vq的一個序列,它使得(vp,
vi1)
,(vi1,vi2)
,
…,(
vim,
vq)是E(G)的邊。路的長度:組成路的邊數。第七十八頁,共103頁。簡單路徑:除了第一和最后一個結點可以相同以外,其它所有結點都不同。環(huán):第一個和最后一個結點相同的簡單路。連通圖:在無向圖中,如果每對結點之間都存在一條路,則稱該圖是連通的。子圖:是由G的結點集V的子集(記為VB)和邊集E中連接VB中結點的邊的子集所組成的圖。連通分圖:一個圖的最大連通子圖。有向圖的強連通性:在有向圖中,如果對于每一對結點i和j,既存在一條從i到j的路,又存在一條從j到i的路,則稱該有向圖是強連通的。第七十九頁,共103頁。圖的表示方法鄰接矩陣鄰接表第八十頁,共103頁。1.5遞歸和消去遞歸1.遞歸直接調用自己或間接通過一些語句調用自己遞歸是一種強有力的設計方法描述某些數學問題非常自然,易于證明算法遞歸的效率問題執(zhí)行時間、空間消耗多第八十一頁,共103頁。例1.3斐波那契(Fibonacci)序列:F0=F1=1Fi=Fi-1+Fi-2(i>1)算法1.7求斐波那契數procedureF(n)//返回第n個斐波那契數//integernifn<=1thenreturn(1)elsereturn(F(n-1)+F(n-2))endifendF算法效率:對F(n-1)、F(n-2)存在大量的重復計算改進:保存中間結果第八十二頁,共103頁。例1.4歐幾里得算法已知兩個非負整數a和b,且a>b≥0,求這兩個數的最大公因數。輾轉相除法:若b=0,則a和b的最大公因數等于a;若b>0,則a和b的最大公因數等于b和用b除a的余數的最大公因數。算法1.8求最大公因數procedureGCD(a,b)//約定a>b//ifb=0thenreturn(a)elsereturn(GCD(b,amodb))endifendGCD例:GCD(22,8)=GCD(8,6)=GCD(6,2)=GCD(2,0)=2;第八十三頁,共103頁。GCD(22,8)GCD(8,6)GCD(6,2)GCD(2,0)2遞推遞推遞推遞推回歸回歸回歸回歸結果為GCD(22,8)=2第八十四頁,共103頁。例1.5遞歸在非數值算法設計中的應用已知元素x,判斷x是否在A(1:n)中。算法1.9在A(1:n)中檢索xprocedureSEARCH(i)//如果在A(1:n)中有一元素A(k)=x,則將其第一次出現的下標k返回,否則返回0//globaln,x,A(1:n)case:i>n:return(0):A(i)=x;return(i):else:return(SEARCH(i+1))endcaseendSEARCH第八十五頁,共103頁。2.消去遞歸直接遞歸的消去規(guī)則:
基本思路:將遞歸過程中出現遞歸調用的地方,用等價的非遞歸代碼來代替,并對return語句做適當處理。
13條規(guī)則:處理直接遞歸調用中的遞歸代碼和return語句,將之轉換成等價的迭代代碼。初始化
⑴在過程的開始部分,插入說明為棧的代碼并將其初始化為空。在一般情況下,這個棧用來存放參數、局部變量和函數的值、每次遞歸調用的返回地址。⑵將標號L1附于第一條可執(zhí)行語句。然后對于每一處遞歸調用都用一組執(zhí)行下列規(guī)則的指令來代替。第八十六頁,共103頁。處理遞歸調用語句⑶將所有參數和局部變量的值存入棧。
棧頂指針可作為一個全程變量來看待。⑷建立第i個新標號Li,并將i存入棧。這個標號的i值將用來計算返回地址。此標號放在規(guī)則⑺所描述的程序段中。⑸計算這次調用的各實在參數(可能是表達式)的值,并把這些值賦給相應的形式參數。⑹插入一條無條件轉向語句轉向過程的開始部分:GotoL1第八十七頁,共103頁。
對遞歸嵌套調用的處理⑺如果這過程是函數,則對遞歸過程中含有此次函數調用的那條語句做如下處理:將該語句的此次函數調用部分用從棧頂取回該函數值的代碼來代替,其余部分的代碼按原描述方式照抄,并將⑷中建立的標號附于這條語句上。如果此過程不是函數,則將⑷中建立的標號附于⑹所產生的轉移語句后面的那條語句。以上步驟實現消去過程中的遞歸調用。下面對過程中出現return語句進行處理(純過程結束處的end可看成是一條沒有值與之聯系的return語句)。第八十八頁,共103頁。對每個有return語句的地方,執(zhí)行下述規(guī)則:⑻如果棧為空,則執(zhí)行正常返回。⑼否則,將所有輸出參數(帶有返回值的出口參數,out/inout型)的當前值賦給棧頂上的那些對應的變量。⑽如果棧中有返回地址標號的下標,就插入一條此下標從棧中退出的代碼,并把這個下標賦給一個未使用的變量。⑾從棧中退出所有局部變量和參數的值并吧它們賦給對應的變量。⑿如果這個過程是函數,則插入以下指令,這些指令用來計算緊接在return后面的表達式并將結果值存入棧頂。⒀用返回地址標號的下標實現對該標號的轉向。第八十九頁,共103頁。例1.6遞歸調用示例求數組元素中的最大值算法1.10遞歸求取數組元素的最大值procedureMAX1(i)//查找數組A中最大值元素,并返回該元素的最大下標。//globalintegern,A(1:n),j,kintegeriifi<nthenj←MAX1(i+1)//遞歸調用//ifA(i)>A(j)thenk←ielsek←jendifelsek←nendif
return(k)//遞歸調用的返回//endMAX1第九十頁,共103頁。``第九十一頁,共103頁。消去上例中的遞歸procedureMAX2(i)localintegerj,k;globalintegern,A(1:n)integerIintegerSTACK(1:2*n)
top←0//規(guī)則1,聲明棧的代碼,并初始化為空//
L1:ifi<n//規(guī)則2,將標號L1賦于第一條可執(zhí)行語句前//thentop←top+1;STACK(top)←i;//規(guī)則3,參數或局部變量的值入棧//top←top+1;STACK(top)←2;//規(guī)則4,建立新的標號2,并入棧//
第九十二頁,共103頁。i←i+1
//規(guī)則5,計算參數值//
gotoL1
//規(guī)則6,無條件轉向算法的開始部分//
L2:j←STACK(top);top←top-1;
//規(guī)則7,處理函數調用,并將標號2賦于該語句上//ifA(i)>A(j)thenk←Ielsek←jendifelsek←nendif第九十三頁,共103頁。iftop=0thenreturn(k)
//規(guī)則8,如果棧空,則正常返回//elseaddr←STACK(top);top←top-1;
//規(guī)則10,從棧中退出返回標號//
i←STACK(top);top←top-1;
//規(guī)則11,從棧中退出局部變量和參數的值//top←top+1;STACK(top)←k;
//規(guī)則12,計算返回值,并將之入棧//ifaddr=2thengotoL2endif
//規(guī)則13,用返回地址標號的下標實現對該標號的轉向//endifendMAX2第九十四頁,共103頁。進一步優(yōu)化和簡化經過消去遞歸產生的迭代程序。procedureMAX3(A,n)integeri,k,n;i←k←nwhilei>1doi←i-1ifA(i)>A(k)thenk←iendifrepeatreturn(k)endMAX3第九十五頁,共103頁。不必死套13條規(guī)則,應具體情況具體分析procedureGCD1(a,b)//約定a>b//L1:ifb=0thenreturn(a)elset←b;b←amodb;a←t;gotoL1endifendGCD1整理后得:procedureGCD2(a,b)whileb≠0dot←b;b←amodb;a←trepeatreturn(a)endGCD2第九十六頁,共103頁。漸進分析
時間復雜性漸進階分析的規(guī)則:(最壞情況)
1).賦值,比較,算術運算,邏輯運算,讀寫單個變量(常量)只需1單位時間2).執(zhí)行條件語句if
c
thenS1elseS2的時間為TC+max(TS1,TS2).
3).選擇語句case
A
of
a1:s1;a2:s2;...;
am:sm
需要的時間為max(TS1,TS2,...,TSm).4).訪問數組的單個分量或紀錄的單個域需要一個單位時間.5).執(zhí)行for循環(huán)語句的時間=執(zhí)行循環(huán)體時間*循環(huán)次數.6).while
c
do
s
(repeat
suntilc)語句時間=(Tc+Ts)*循環(huán)次數.7).用goto從循環(huán)體內跳到循環(huán)體末或循環(huán)后面的語句時,不需額外時間8).過程或函數調用語句對非遞歸調用,根據調用層次由里向外用規(guī)則1-7進行分析;對遞歸調用,可建立關于T(n)的遞歸方程,求解該方程得到T(n).例題1-1第九十七頁,共103頁。
算法1-2:二分查找(假定c是A的最后一元)例題1-1分析:問題規(guī)模為n,元運算執(zhí)行時間設為賦值a,判斷t,加法s,除法d,減法b.最壞情況Tmax(n)=6a+4t+2s+d+(2a+2s+3t+d)lognfunctionb-search(c){L:=1;U:=n; 2found:=false; 1whilenotfoundandU>=Ldo 3{i:=(L+U)div2; 3 ifc=A[i] 1 thenfound:=true 1 elseifc>A[i] 1 thenL:=i+1 1elseU:=i-1 }iffoundthenb-search:=i elseb-search:=0 1}Logn+1第九十八頁,共103頁。算法設計與分析已知不重復且從小到大排列的m個整數的數組A[1...m],m=2K,Kc,要求找到一個下標i,使得A[i]=c.找不到返回0.例題1-1functionb-search(c,L,U){ifU<Lthen 1b-search:=0 1 else{index:=(L+U)div2; 3element:=A[index]; 2 ifelement=cthen 1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 樓頂吊繩施工方案
- 改建電梯施工方案
- 煤炭市場多元化經營探索考核試卷
- 核輻射測量在核設施退役資金預算與控制中的參考價值考核試卷
- ??漆t(yī)院醫(yī)療糾紛處理能力考核試卷
- 合成革在服裝領域的應用考核試卷
- 建筑材批發(fā)商市場競爭策略的綠色可持續(xù)發(fā)展考核試卷
- 2025年逆變植焊機項目可行性研究報告
- 屋頂氣管施工方案
- 2025年貉子領項目可行性研究報告
- 消防更換設備方案范本
- 合伙開辦教育培訓機構合同范本
- 嵌入式機器視覺流水線分揀系統(tǒng)設計
- GB/T 14689-2008技術制圖圖紙幅面和格式
- 2.1食物中的營養(yǎng)物質 導學案(1、2課時無解析)
- JC∕T 2634-2021 水泥行業(yè)綠色工廠評價要求
- 六年級下冊科學第二單元質量檢測卷粵教版(含答案)
- 跨境電商現狀與發(fā)展趨勢跨境電商行業(yè)分析跨境電商的發(fā)展課件
- 唐太宗-李世民
- 項目部二級安全教育內容
- 統(tǒng)編(部編)五年級語文下冊全冊教學反思
評論
0/150
提交評論