計算機算法基礎1_第1頁
計算機算法基礎1_第2頁
計算機算法基礎1_第3頁
計算機算法基礎1_第4頁
計算機算法基礎1_第5頁
已閱讀5頁,還剩61頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

序專業基礎課程:數據結構、計算機語言操作系統、編譯如何編寫計算機程序:數據結構+算法=程序算法:計算機軟件的“靈魂”算法是計算機科學和計算機應用的核心2023/3/8教材:計算機算法基礎余祥宣等編著華中科技高校出版社參考書:算法設計與分析王曉東編著清華高校出版社計算機算法導引——設計與分析盧開澄編著清華高校出版社IntroductionToAlgorithm高教出版社,MITPress

學時:32+8學時2023/3/8章節支配第一章導引與基本數據結構√其次章分治法 √第三章貪心方法 √第四章動態規劃√第五章檢索與周游 √第六章回溯法 ⊙第七章分枝-限界 ⊙第八章NP-問題 ?

2023/3/8第一章導引與基本數據結構1.1算法的定義及特性1.什么是算法?★算法如數字、計算一樣,是一個基本概念。★算法是解一確定類問題的隨意一種特殊的方法。★在計算機科學中,算法是運用計算機解一類問題的精確、有效方法的代名詞;算法是一組有窮的規則,它規定了解決某一特定類型問題的一系列運算。2023/3/82.算法的五個重要特性確定性、能行性、輸入、輸出、有窮性1)確定性:算法的每種運算必須要有準確的定義,不能有二義性。例:不符合確定性的運算5/0將6或7與x相加未賦值變量參與運算2023/3/82)能行性算法中有待實現的運算都是基本的運算,原理上每種運算都能由人用紙和筆在“有限”的時間內完成。例:整數的算術運算是“能行”的實數的算術運算是“不能行”的2023/3/83)輸入每個算法有0個或多個輸入。這些輸入是在算法起先之前給出的量,取自于特定的對象集合——定義域(或值域)4)輸出一個算法產生一個或多個輸出,這些輸出是同輸入有某種特定關系的量。2023/3/85)有窮性一個算法總是在執行了有窮步的運算之后終止。計算過程:只滿足確定性、能行性、輸入、輸出四個特性的一組規則。

算法和計算過程的區分:計算過程:操作系統(不終止的運行過程)算法是“可以終止的計算過程”算法的時效性:只能把在相當有窮步內終止的算法投入到計算機上運行2023/3/84.我們的主要任務算法學習將涉及5個方面的內容:1)設計算法:創建性的活動2)表示算法:思想的表示形式,SPARKS語言3)確認算法:證明算法對全部可能的合法輸入都能得出正確的答案。算法證明:證明算法的正確性,與語言無關程序證明:證明程序的正確性4)分析算法:對算法的時、空特性做定量分析,以了解算法的好壞5)測試程序:調試:“調試只能指出有錯誤,而不能指出它們不存在錯誤”作時空分布圖:驗證分析結論,優化算法設計本課程集中于學習算法的設計與分析。通過學習,駕馭計算機算法設計和分析基本策略與方法,為設計更困難、更有效的算法奠定基礎2023/3/85.課程關系數據結構程序設計語言:結構化設計數學基礎非數值計算領域的基本學問2023/3/81.2分析算法1.分析算法的目的在于:通過對算法的分析,在把算法變成程序實際運行前,就知道為完成一項任務所設計的算法的好壞,從而運行好的算法,改進差的算法,避開無益的人力和物力奢侈。算法分析是計算機領域的“古老”而“前沿”的課題。

2023/3/82.重要的假設和約定1)計算機模型的假設計算機形式理論模型:Turing機模型通用計算機模型:依次計算機有足夠的“內存”能在固定的時間內存取數據單元

2023/3/82)計算的約定算法的執行時間=∑fi*ti其中,fi是算法中用到的某種運算i的次數——稱為該運算的“頻率計數”ti是該運算執行一次所用的時間——與程序語言和硬件有關

確定:運用何種運算及其執行時間。從運算的“時間特性”上將運算的分類:時間囿界于常數的運算:·基本算術運算,如整數、浮點數的加、減、乘、除·字符運算、賦值運算、過程調用等特點:盡管每種運算的執行時間不同,但一般只花一個固定量的時間(單位時間)就可完成。2023/3/82)計算的約定(續)其他運算:

·字符串操作:與字符串中字符的數量成正比

·記錄操作:與記錄的屬性數、屬性類型等有關特點:運算時間無定量。如何分析非時間囿界于常數的運算:分解成若干時間囿界于常數的運算。

如:tstring=Length(String)*tchar2023/3/83)工作數據集的選擇編制能夠反映算法在最好、平均、最壞狀況下工作的數據配置。然后運用這些數據配置運行算法,以了解算法的性能。編制測試數據是程序測試與算法分析中的關鍵技術之一。·作為算法分析的數據集:反映算法的典型特征·作為程序正確性及性能測試的數據集:測試程序的對錯,反映對性能指標產生影響的方面,如邊界值2023/3/83.如何進行算法分析?對算法進行全面分析,可分兩個階段進行:事前分析:求算法的一個時間/空間限界函數,即通過對算法的“理論”分析,得出關于算法時間和空間特性的特征函數(Ο、Ω)——與計算機物理軟硬件沒有干脆關系。事后測試:將算法編制成程序后實際放到計算機上運行,收集其執行時間和空間占用等統計資料,進行分析推斷——干脆與物理實現有關。2023/3/81)事前分析目的:試圖得出關于算法特性的一種形式描述,以“理論上”衡量算法的“好壞”。如何給出反映算法特性的描述?統計算法中各種運算的執行狀況,包括:引用了哪些運算每種運算被執行的次數該種運算執行一次所花費的時間等。算法的執行時間=∑fi*ti2023/3/8頻率計數

頻率計數:算法中語句或運算的執行次數。

例:

x←x+yfori←1tondofori←1tondox←x+yforj←1tondorepeatx←x+yrepeatrepeat(a)(b)(c)

分析:

(a):x←x+y執行了1次

(b):x←x+y執行了n次

(c):x←x+y執行了n2次2023/3/8一條語句在整個程序運行時實際執行時間=頻率計數*每執行一次該語句所需的時間在事前分析中,只限于確定與所運用的機器及其他環境因素無關的頻率計數,依此建立一種理論上分析模型。2023/3/8數量級——衡量頻率計數的“大小”的一種測度語句的數量級:語句的執行頻率例:1,n,n2算法的數量級:算法所包含的全部語句的執行頻率之和。數量級反映了算法困難度的最本質的特征。例:假如求解同一個問題的三個算法分別具有n,n2,n3數量級。若n=10,則可能的執行時間將分別是10,100,1000個單位時間——與環境因素無關。2023/3/8頻率計數的函數表示就計算時間而言,事前分析階段求得算法在頻率計數上的函數表示——與規模n有關的函數形式,記為:g(n)★不同的算法,g(n)的具體形式是不同的,如logn,nlogn,n2等★g(n)的一般形式:關于n的簡潔函數式“實際”能夠得到的:1)函數式的最高次項2)最高次項與函數整體的關系。空間特性分析(與時間特性的分析類似,略)2023/3/82)事后測試目的:運行程序,統計執行實際耗費的精確的時間與空間,與事前分析的結論進行比較,驗證從前的分析結論——包括正確性、執行性能等,比較、優化所設計的算法。分析手段:作時、空性能分布圖2023/3/84.計算時間的漸近表示記:算法的實際計算時間為f(n),計算時間的限界函數為g(n)其中,n是輸入或輸出規模的某種測度。f(n)表示算法的“實際”執行時間—與機器及語言有關。g(n)是事前分析的結果——一個形式簡潔的函數,如nm,logn,2n,n!等。是與頻率計數有關、而與機器及語言無關的函數。

以下給出算法執行時間:上界(О)、下界(Ω)、“平均”()的定義。2023/3/81)上界函數定義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))。2023/3/8多項式定理定理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|則,定理得證。2023/3/8計算時間的數量級的大小對算法的有效性有確定性的影響例:假設解決同一個問題的兩個算法,它們都有n個輸入,計算時間的數量級分別是n2和nlogn。則,n=1024:分別須要1048576和10240次運算。n=2048:分別須要4194304和22528次運算。分析:★同等規模下的計算量比較:★規模增大狀況下的比較:在n加倍的狀況下,一個Ο(n2)的算法計算時間增長4倍,而一個Ο(nlogn)算法則只用兩倍多一點的時間即可完成。2023/3/8多項式時間算法和指數時間算法多項式時間算法:可用多項式(函數)對其計算時間限界的算法。常見的多項式限界函數有:Ο(1)<Ο(logn)<Ο(n)<Ο(nlogn)<Ο(n2)<Ο(n3)指數時間算法:計算時間用指數函數限界的算法常見的指數時間限界函數:Ο(2n)<Ο(n!)<Ο(nn)說明:當n取值較大時,指數時間算法和多項式時間算法在計算時間上特別懸殊。2023/3/8典型的計算時間函數曲線2023/3/8一般相識當數據集的規模很大時,要在現有的計算機系統上運行具有比Ο(nlogn)困難度還高的算法是比較困難的。指數時間算法只有在n取值特別小時才好用。要想在依次處理機上擴大所處理問題的規模,有效的途徑是降低算法的計算困難度,而不是(僅僅依靠)提高計算機的速度。2023/3/8計算時間函數值比較32023/3/8定義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)下界函數2023/3/8定義1.3假如存在正常數c1,c2和n0,對于全部的n≥n0,有c1|g(n)|≤|f(n)|≤c2|g(n)|則記作含義:算法在最好和最壞狀況下的計算時間就一個常數因子范圍內而言是相同的。可看作:既有f(n)=Ω(g(n)),又有f(n)=Ο(g(n))3)“平均狀況”限界函數2023/3/84)限界函數的性質1)若且,則。即О具有傳遞性。(同)2)當且僅當3)若,則。即,定義了一個等價關系(等價類)證明:從定義動身。證明過程略。2023/3/85.常用的整數求和公式在算法分析中,在統計語句的頻率時,求和公式的一般形式為:如:2023/3/81.3關于SPARKS語言本書為描述算法選用的一種計算機語言類PASCAL語言結構化設計2023/3/81.基本語法成分1)數據類型整型integer

實型float

布爾型boolean

字符型char2)變量聲明類型說明符變量;integeri,j;booleanb;charc3)數組隨意整數下標integerA(1:5,7:20)integerB(5,7:20)2023/3/84)賦值運算

(變量)←(表達式)

x←2+x;5)邏輯運算:andornot6)關系運算:<≤=≠≥>2023/3/87)限制結構:依次:(略)分支:·ifconditionthenS1elseS2endif·case:cond1:S1;:cond2:S2;…:condn:Sn:else:Sn+1endcase循環:

·whileconddoSrepeat

·loopSuntilcondrepeat

·forvble←starttofinishbyincrementdoSrepeat2023/3/88)函數的定義與調用

過程定義

procedureNAME((參數表))

(說明部分)

SendNAME

過程的調用:CALL過程名函數定義類型名procedureNAME((參數表))

(說明部分)

Sreturn(表達式)endNAME

函數的引用:x←function(參數);2023/3/89)變量的分類a)依據數據類型分類整型、實型、字符型等b)依據作用域分類:全程變量、局部變量、形式參數c)依據是否帶入、帶出數據值/結果分類:in型變量out型變量inout型變量

邊界效應:變更了參變量或全程變量的值函數:通過函數值返回輸出結果,沒有邊界效應純過程:沒有函數值返回,只通過邊界效應帶出輸出結果2023/3/810)特殊語句a)exit退出當前一層的循環b)return退出過程return(表達式):函數返回結果c)goto無條件轉向語句gotolabel11)遞歸a)干脆遞歸:過程中包含對自身的調用b)間接遞歸:間接調用自身12)輸入輸出read、print13)注釋//注釋//2023/3/81.4基本數據結構1.棧和隊列線性表:n個元素的有序表棧和隊列:特殊的線性表利用動態數據結構——鏈表實現棧或隊列利用靜態數據結構——數組實現棧或隊列基于以上兩種表示形式的棧和隊列上的基本運算2023/3/82.樹定義1.4樹(tree)是一個或多個結點的有限集合,它使得:有一個指定為根(root)的結點剩余結點被劃分成m≥0個不相交的集合:

T1,…,Tm

這些集合的每一個又都是一棵樹,并稱T1,…,Tm為根的子樹。2023/3/8關于樹的重要概念結點的度(degree):一個結點的子樹數樹的度:樹中結點度的最大值結點的級(level)(又叫層):設根是1級,若某結點在p級,則它的兒子在p+1級樹的高度(或深度):樹中結點的最大級數葉子(終端結點):度為0的結點內結點(非終端結點):度不為0的結點森林:m≥0個不相交樹的集合。2023/3/83二元樹定義1.5二元樹(binarytree)是結點的有限集合,它或者為空,或者由一個根和兩棵稱為左子樹和右子樹的不相交二元樹所組成。二元樹與度為2的樹的區分二元樹性質:引理1.1一棵二元樹第i級的最大結點數是2i-1。深度為k的二元樹的最大結點數為2k-1,k>0。2023/3/82023/3/8特殊形態的二元樹①滿二元樹:深度為k且有2k-1個結點的二元樹

2023/3/8②完全二元樹:一棵有n個結點深度為k的二元樹,當它的結點相當于深度為k的滿二元樹中編號為1到

n的結點時,稱該二元樹是完全的。完全二元樹的葉子結點至多出現在相鄰的兩級上。完全二元樹的結點可以緊湊地存放在一個一維數組中(性質見引理1.2)。2023/3/8③堆:堆是一棵完全二元樹,它的每個結點的值至少和該結點的兒子們(假如存在的話)的值一樣大(max-堆)(或小,min-堆)。④二分檢索樹:二分檢索樹T是一棵二元樹,它或者為空,或者每個結點含有一個可以比較大小的數據元素,且有:·T的左子樹的全部元素比根結點中的元素小;·T的右子樹的全部元素比根結點中的元素大;·T的左子樹和右子樹也是二分檢索樹。

注:二分檢索樹要求樹中全部結點的元素值互異2023/3/83.圖圖G由稱之為結點V和邊E的兩個集合組成,記為

G=(V,E)其中,V是一個有限非空的結點集合;E是結點對偶的集合,E的每一對偶表示G的一條邊。2023/3/8有關圖的的重要概念無向圖:邊表示為(i,j)有向圖:邊表示為〈i,j〉成本:帶有成本的圖稱為網絡(帶權圖)鄰接結點的度(出度/入度)路徑:由結點vp到vq的一條路(path)是結點

vp,

vi1,

vi2,

…,

vim,

vq的一個序列,它使得

(vp,

vi1)

,(vi1

,vi2)

…,(

vim,

vq)

是E(G)的邊。路的長度:組成路的邊數。2023/3/8簡潔路徑:除了第一和最終一個結點可以相同以外,其它全部結點都不同。環:第一個和最終一個結點相同的簡潔路。連通圖:在無向圖中,假如每對結點之間都存在一條路徑,則稱該圖是連通的。子圖:是由G的結點集V的子集(記為VB)和邊集E中連接VB中結點的邊的子集所組成的圖。連通分圖:一個圖的最大連通子圖。有向圖的強連通性:在有向圖中,假如對于每一對結點i和j,既存在一條從i到j的路,又存在一條從j到i的路,則稱該有向圖是強連通的。2023/3/8圖的表示方法鄰接矩陣鄰接表2023/3/81.5遞歸和消去遞歸1.遞歸遞歸是一種強有力的設計方法遞歸的效率問題2023/3/8例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)存在大量的重復計算改進:保存中間結果2023/3/8例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))endifendGDC

例:GCD(22,8)=GCD(8,6)=GCD(6,2)=GCD(2,0)=2;2023/3/8例1.5用遞歸策略設計的檢索算法已知元素x和元素表A(1:n),推斷x是否等于A中某元素的值。算法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))endcaseendSEARCH2023/3/82.消去遞歸干脆遞歸的消去規則:基本思路:將遞歸調用的地方用等價的非遞歸代碼來代替,并對return語句做適當處理。13條規則:處理干脆遞歸調用和return語句,將之轉換成等價的迭代代碼。初始化⑴在過程的起先部分,插入說明為棧的代碼并將其初始化為空。在一般狀況下,這個棧用來存放參數、局部變量和函數的值、每次遞歸調用的返回地址。⑵將標號L1附于第一條可執行語句。然后對于每一處遞歸調用都用一組執行下列規則的指令來代替。2023/3/8處理遞歸調用語句⑶將全部參數和局部變量的值存入棧。棧頂指針可作為一個全程變量來看待。⑷建立第i個新標號Li,并將i存入棧。這個標號的i值將用來計算返回地址。此標號放在規則⑺所描述的程序段中。⑸計算這次調用的各實在參數(可能是表達式)的值,并把這些值賦給相應的形式參數。⑹插入一條無條件轉向語句轉向過程的起先部分:gotoL12023/3/8對退出一層遞歸調用后的處理⑺假如這過程是函數,則對遞歸過程中含有此次函數調用的那條語句做如下處理:將該語句的此次函數調用部分用從棧頂取回該函數值的代碼來代替,其余部分的代碼按原描述方式照抄,并將⑷中建立的標號附于這條語句上。假如此過程不是函數,則將⑷中建立的標號附于⑹所產生的轉移語句后面的那條語句。以上步驟消去過程中的遞歸調用。下面對過程中出現return語句進行處理。(純過程結束處的end可看成是一條沒有值與之聯系的return語句)2023/3/8對每個有return語句的地方,執行下述規則:⑻假如棧為空,則執行正常返回。⑼否則,將全部輸出參數(帶有返回值的出口參數,out/inout型)的當前值賦給棧頂上的那些對應的變量。⑽假如棧中有返回地址標號的下標,就插入一條此下標從棧中退出的代碼,并把這個下標賦給一個未運用的變量。⑾從棧中退出全部局部變量和參數的值并吧它們賦給對應的變量。⑿假如這個過程是函數,則插入以下指令,這些指令用來計算緊接在return后面的表達式并將結果值存入棧頂。⒀用返回地址標號的下標實現對該標號的轉向。2023/3/8例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)//遞歸調用的返回//endMAX12023/3/8消去上例中的遞歸算法1.11運用上述的規則消去例1.10中的遞歸代碼procedureMAX2(i)localintegerj,k;globalintegern,A(1:n)integerIi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論