版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、自動化系算法設(shè)計與分析自動化系算法設(shè)計與分析 配套全冊教學(xué)課件配套全冊教學(xué)課件 算法設(shè)計與分析 西安交通大學(xué)西安交通大學(xué) 計算機(jī)系計算機(jī)系 2021-7-18算法設(shè)計與分析課件3 第1章 算法引論 n1.1 算法與程序 n1.2 表達(dá)算法的抽象機(jī)制 n1.3 描述算法 n1.4 算法復(fù)雜性分析 本章主要知識點: 2021-7-18算法設(shè)計與分析課件4 1.1 算法與程序 n輸 入:有零個或多個外部量作為算法的輸入。 n輸 出:算法產(chǎn)生至少一個量作為輸出。 n確定性:組成算法的每條指令清晰、無歧義。 n有限性:算法中每條指令的執(zhí)行次數(shù)有限,執(zhí)行 每條指令的時間也有限。 算法:算法:是滿足下述性質(zhì)
2、的指令序列。 2021-7-18算法設(shè)計與分析課件5 1.1 算法與程序 程序:程序:是算法用某種程序設(shè)計語言的具體實現(xiàn)。 程序可以不滿足算法的性質(zhì)(4)即有限性。 l 例如操作系統(tǒng),是一個在無限循環(huán)中執(zhí)行的 程序,因而不是一個算法。 l 操作系統(tǒng)的各種任務(wù)可看成是單獨的問題, 每一個問題由操作系統(tǒng)中的一個子程序通過 特定的算法來實現(xiàn)。該子程序得到輸出結(jié)果 后便終止。 2021-7-18算法設(shè)計與分析課件6 1.1 算法與程序 n算法的研究可以分成四個不同的領(lǐng)域:算法的研究可以分成四個不同的領(lǐng)域: 1)怎樣設(shè)計算法: 算法設(shè)計的策略,技巧 2)怎樣驗證算法: 驗證算法可以正確運行。 程序驗證;
3、 算法證明 3)怎樣分析算法: 算法分析,分析算法的性能 (時間/空間) 4)怎樣測試算法: 包括調(diào)試、評測 本課程主要集中于算法的設(shè)計與分析。 2021-7-18算法設(shè)計與分析課件7 1.從機(jī)器語言到高級語言的抽象 1.2 表達(dá)算法的抽象機(jī)制 高級程序設(shè)計語言的主要好處是: (4)把繁雜瑣碎的事務(wù)交給編譯程序,所以自動化程度高,開發(fā)周期短, 程序員可以集中時間和精力從事更重要的創(chuàng)造性勞動,提高程序質(zhì)量。 (1)高級語言更接近算法語言,易學(xué)、易掌握,一般工程技術(shù)人員只需 要幾周時間的培訓(xùn)就可以勝任程序員的工作; (2)高級語言為程序員提供了結(jié)構(gòu)化程序設(shè)計的環(huán)境和工具,使得設(shè)計 出來的程序可讀性
4、好,可維護(hù)性強(qiáng),可靠性高; (3)高級語言不依賴于機(jī)器語言,與具體的計算機(jī)硬件關(guān)系不大,因而 所寫出來的程序可植性好、重用率高; 2021-7-18算法設(shè)計與分析課件8 2.抽象數(shù)據(jù)類型 1.2 表達(dá)算法的抽象機(jī)制 抽象數(shù)據(jù)類型是算法的一個數(shù)據(jù)模型連同定義在該模型上 并作為算法構(gòu)件的一組運算。 抽象數(shù)據(jù)類型帶給算法設(shè)計的好處有: (1)算法頂層設(shè)計與底層實現(xiàn)分離; (2)算法設(shè)計與數(shù)據(jù)結(jié)構(gòu)設(shè)計隔開,允許數(shù)據(jù)結(jié)構(gòu)自由選擇; (3)數(shù)據(jù)模型和該模型上的運算統(tǒng)一在ADT中,便于空間和時間耗費的折衷; (4)用抽象數(shù)據(jù)類型表述的算法具有很好的可維護(hù)性; (5)算法自然呈現(xiàn)模塊化; (6)為自頂向下逐步
5、求精和模塊化提供有效途徑和工具; (7)算法結(jié)構(gòu)清晰,層次分明,便于算法正確性的證明和復(fù)雜性的分析。 2021-7-18算法設(shè)計與分析課件9 在本書中,采用Java語言描述算法。 1.1.JavaJava程序結(jié)構(gòu)程序結(jié)構(gòu) 1.3 描述算法 以下,對JavaJava語言的若干重要特性作簡要概述。 (1)Java程序的兩種類型:應(yīng)用程序和appletapplet 區(qū)別:應(yīng)用程序的主方法為main,其可在命令行中用命令 語句 java 應(yīng)用程序名 來執(zhí)行; applet的主方法為init,其必須嵌入HTML文件,由 Web瀏覽器或applet閱讀器來執(zhí)行。 (2)包:java程序和類可以包(pack
6、ages)的形式組織管理。 (3)import語句:在java程序中可用import語句加載所需的包。 例如,import java.io.*;語句加載java.io包。 2021-7-18算法設(shè)計與分析課件10 1.3 描述算法 2.2.JavaJava數(shù)據(jù)類型數(shù)據(jù)類型 數(shù)據(jù)類型 基本數(shù)據(jù)類型:詳見下頁表1-1 非基本數(shù)據(jù)類型:如 Byte, Integer, Boolean, String等。 Java對兩種數(shù)據(jù)類型的不同處理方式: 對基本數(shù)據(jù)類型:在聲明一個具有基本數(shù)據(jù)類型的變量時,自 動建立該數(shù)據(jù)類型的對象(或稱實例)。如:int k; 對非基本數(shù)據(jù)類型:語句 String s; 并不
7、建立具有數(shù)據(jù)類型 String的對象,而是建立一個類型String的引用對象, 數(shù)據(jù)類型為String的對象可用下面的new語句建立。 s = new StringString(“Welcome”); StringString s = new StringString(“Welcome”); 2021-7-18算法設(shè)計與分析課件11 1.3 描述算法 表格表格1-1 1-1 JavaJava基本數(shù)據(jù)類型基本數(shù)據(jù)類型 類型缺省值分配空間(bits)取值范圍 booleanfalse1true,false byte08-128,127 charu000016u0000,uFFFF double0.
8、0644.9*10-324 1.8*10308 float0.0321.4*10-45 3.4*1038 int032-2147483648,2147483647 long0649.2*1017 short016-32768,32767 2021-7-18算法設(shè)計與分析課件12 1.3 描述算法 3.3.方法方法 在Java中,執(zhí)行特定任務(wù)的函數(shù)或過程統(tǒng)稱為方法(methods) 。 例如,java的MathMath類類給出的常見數(shù)學(xué)計算的方法如下表所示: 方法方法功能功能方法方法功能功能 abs(x)x的絕對值max(x,y)x和y中較大者 ceil(x)不小于x的最小整數(shù)min(x,y)x
9、和y中較小者 cos(x)x的余弦pow(x,y)xy exp(x)exsin(x)x的正弦 floor(x)不大于x的最大整數(shù)sqrt(x)x的平方根 log(x)x的自然對數(shù)tan(x)x的正切 2021-7-18算法設(shè)計與分析課件13 1.3 描述算法 3.3.方法方法 2 baba 計算表達(dá)式 值的自定義方法ab描述如下: public static int ab(int a, int b) return (a+b+Math.abs(a-b)/2; (1)方法參數(shù):Java中所有方法的參數(shù)均為值參數(shù)。上述方法ab中, a和b是形式參數(shù),在調(diào)用方法時通過實際參數(shù)賦值。 (2)方法重載:J
10、ava允許方法重載,即允許定義有不同簽名的同名方法。 上述方法ab可重載為: public static double ab(double a, double b) return (a+b+Math.abs(a-b)/2.0; 2021-7-18算法設(shè)計與分析課件14 1.3 描述算法 4.4.異常異常 Java的異常提供了一種處理錯誤的方法。當(dāng)程序發(fā)現(xiàn)一個 錯誤,就引發(fā)一個異常,以便在合適地方捕獲異常并進(jìn)行處理。 通常用trytry塊來定義異常處理。每個異常處理由一個catchcatch 語句組成。 public static void main(String args) try f ( )
11、; catch (exception1) 異常處理; catch (exception2) 異常處理; finally finally塊; 2021-7-18算法設(shè)計與分析課件15 1.3 描述算法 5.5.JavaJava的類的類 (4)訪問修飾訪問修飾 公有(public) 私有(private) 保護(hù)(protected) Java的類一般由4個部分組成: (1)類名類名 (2)數(shù)據(jù)成員數(shù)據(jù)成員 (3)方法方法 2021-7-18算法設(shè)計與分析課件16 1.3 描述算法 6.6.通用方法通用方法 下面的方法swapswap用于交換一維整型數(shù)組a的位置i和位置j處的值。 public st
12、atic void swap(int a, int i, int j) int temp = ai; ai = aj; aj = temp; public static void swap(object a, int i, int j) object temp = ai; ai = aj; aj = temp; 該方法只適用于該方法只適用于 整型數(shù)組整型數(shù)組 該方法具有通用性,適用該方法具有通用性,適用 于于ObjectObject類型及其所有子類型及其所有子 類類 以上方法修改如下:以上方法修改如下: 2021-7-18算法設(shè)計與分析課件17 1.3 描述算法 6.6.通用方法通用方法 (1
13、 1)ComputableComputable界面界面 public static Computable sum(Computable a, int n) if (a.length = 0) return null; Computable sum = (Computable) a0.zero(); for (int i = 0; i n; i+) sum.increment(ai); return sum; 利用此界面使利用此界面使 方法方法sumsum通用化通用化 2021-7-18算法設(shè)計與分析課件18 1.3 描述算法 6.6.通用方法通用方法 (2 2)java.lang.Compar
14、able java.lang.Comparable 界面界面 Java的Comparable 界面中惟一的方法頭compareTo用于比較 2個元素的大小。例如java.lang.CpareTo(y) 返回x-y的符號,當(dāng)xy時返 回正數(shù)。 (3 3)OperableOperable 界面界面 有些通用方法同時需要Computable界面和Comparable 界面 的支持。為此可定義Operable界面如下: public interface Operable extends Computable, Comparable (4 4)自定義包裝類)自定義包裝類 由于Java的包裝類如Integ
15、er等已定義為final型,因此無法 定義其子類,作進(jìn)一步擴(kuò)充。為了需要可自定義包裝類。 2021-7-18算法設(shè)計與分析課件19 1.3 描述算法 7.7.垃圾收集垃圾收集 8.8.遞歸遞歸 Java的newnew運算用于分配所需的內(nèi)存空間。 例如, int a = new int500000; 分配2000000字節(jié)空間 給整型數(shù)組a。頻繁用new分配空間可能會耗盡內(nèi)存。Java的垃垃 圾收集器圾收集器會適時掃描內(nèi)存,回收不用的空間(垃圾)給new重新 分配。 Java允許方法調(diào)用其自身。這類方法稱為遞歸方法。 public static int sum(int a, int n) if
16、(n=0) return 0; else return an-1+sum(a,n-1); 計算一維整型數(shù)組前計算一維整型數(shù)組前n n個個 元素之和的遞歸方法元素之和的遞歸方法 2021-7-18算法設(shè)計與分析課件20 1.4 算法復(fù)雜性分析 算法復(fù)雜性是算法運行所需要的計算機(jī)資源的 量,需要時間資源的量稱為時間復(fù)雜性時間復(fù)雜性,需要的空 間資源的量稱為空間復(fù)雜性空間復(fù)雜性。這個量應(yīng)該只依賴于 算法要解的問題的規(guī)模、算法的輸入和算法本身的 函數(shù)。如果分別用N、I和A表示算法要解問題的規(guī)模、 算法的輸入和算法本身,而且用C表示復(fù)雜性,那么, 應(yīng)該有C=F(N,I,A)。 一般把時間復(fù)雜性和空間復(fù)雜
17、性分開,并分別 用T和S來表示,則有: T=T(N,I)和S=S(N,I) 。 (通常,讓A隱含在復(fù)雜性函數(shù)名當(dāng)中) 2021-7-18算法設(shè)計與分析課件21 1.4 算法復(fù)雜性分析 最壞情況下的時間復(fù)雜性: ),(max max INT(N)T N DI ),(max 1 INet k i ii DI N ),( * 1 INet k i ii ),( * INT 最好情況下的時間復(fù)雜性: ),(min min INT(N)T N DI ),(min 1 INet k i ii DI N ) ,( 1 INet k i ii ) ,(INT 平均情況下的時間復(fù)雜性: N DI INTIP(N
18、)T),()( avg N DI k i ii INetIP),()( 1 其中DN是規(guī)模為N的合法輸入的集合;I*是DN中使T(N, I*) 達(dá)到Tmax(N)的合法輸入; 是中使T(N, )達(dá)到Tmin(N)的合法 輸入;而P(I)是在算法的應(yīng)用中出現(xiàn)輸入I的概率。 I I 2021-7-18算法設(shè)計與分析課件22 1.4 算法復(fù)雜性分析 算法復(fù)雜性在漸近意義下的階: 漸近意義下的記號:O、o 設(shè)f(N)和g(N)是定義在正數(shù)集上的正函數(shù)。 O的定義的定義:如果存在正的常數(shù)C和自然數(shù)N0,使得當(dāng)NN0 時有f(N)Cg(N),則稱函數(shù)f(N)當(dāng)N充分大時上有界,且g(N)是 它的一個上界,
19、記為f(N)=O(g(N)。即f(N)的階不高于g(N)的階。 根據(jù)O的定義,容易證明它有如下運算規(guī)則: (1)O(f)+O(g)=O(max(f,g); (2)O(f)+O(g)=O(f+g); (3)O(f)O(g)=O(fg); (4)如果g(N)=O(f(N),則O(f)+O(g)=O(f); (5)O(Cf(N)=O(f(N),其中C是一個正的常數(shù); (6)f=O(f)。 2021-7-18算法設(shè)計與分析課件23 1.4 算法復(fù)雜性分析 的定義的定義:如果存在正的常數(shù)C和自然數(shù)N0,使得當(dāng)NN0 時有f(N)Cg(N),則稱函數(shù)f(N)當(dāng)N充分大時下有界,且g(N) 是它的一個下界,
20、記為f(N)=(g(N)。即f(N)的階不低于 g(N)的階。 的定義的定義:定義f(N)= (g(N)當(dāng)且僅當(dāng)f(N)=O(g(N)且 f(N)= (g(N)。此時稱f(N)與g(N)同階。 o o的定義的定義:對于任意給定的0,都存在正整數(shù)N0,使 得當(dāng)NN0時有f(N)/Cg(N),則稱函數(shù)f(N)當(dāng)N充分大時的階 比g(N)低,記為f(N)=o(g(N)。 例如,4NlogN+7=o(3N2+4NlogN+7)。 2021-7-18算法設(shè)計與分析課件25 n將要求解的較大規(guī)模的問題分割成k個更小規(guī)模的子問題。 n T(n/2) T(n/2)T(n/2)T(n/2) T(n) = n對這
21、k個子問題分別求解。如果子問題的規(guī)模仍然不夠小,則 再劃分為k個子問題,如此遞歸的進(jìn)行下去,直到問題規(guī)模足 夠小,很容易求出其解為止。 2021-7-18算法設(shè)計與分析課件26 n對這k個子問題分別求解。如果子問題的規(guī)模仍然不夠小,則 再劃分為k個子問題,如此遞歸的進(jìn)行下去,直到問題規(guī)模足 夠小,很容易求出其解為止。 n T(n)= n/2 T(n/4)T(n/4)T(n/4)T(n/4) n/2 T(n/4)T(n/4)T(n/4)T(n/4) n/2 T(n/4)T(n/4)T(n/4)T(n/4) n/2 T(n/4)T(n/4)T(n/4)T(n/4) n將求出的小規(guī)模的問題的解合并為
22、一個更大規(guī)模的問題的解, 自底向上逐步求出原來問題的解。 2021-7-18算法設(shè)計與分析課件27 n將求出的小規(guī)模的問題的解合并為一個更大規(guī)模的問題的解, 自底向上逐步求出原來問題的解。 n T(n) = n/2 T(n/4) T(n/4) T(n/4) T(n/4) n/2 T(n/4) T(n/4) T(n/4) T(n/4) n/2 T(n/4) T(n/4) T(n/4) T(n/4) n/2 T(n/4) T(n/4) T(n/4) T(n/4) 2021-7-18算法設(shè)計與分析課件28 n將求出的小規(guī)模的問題的解合并為一個更大規(guī)模的問題的解, 自底向上逐步求出原來問題的解。 n
23、T(n) = n/2 T(n/4) T(n/4) T(n/4) T(n/4) n/2 T(n/4) T(n/4) T(n/4) T(n/4) n/2 T(n/4) T(n/4) T(n/4) T(n/4) n/2 T(n/4) T(n/4) T(n/4) T(n/4) 分治法的設(shè)計思想是,將一個難以直接解決的大問題,分治法的設(shè)計思想是,將一個難以直接解決的大問題, 分割成一些規(guī)模較小的相同問題,以便各個擊破,分割成一些規(guī)模較小的相同問題,以便各個擊破, 分而治之。分而治之。 凡治眾如治寡,分?jǐn)?shù)是也。凡治眾如治寡,分?jǐn)?shù)是也。 -孫子兵法孫子兵法 2021-7-18算法設(shè)計與分析課件29 2.1
24、n直接或間接地調(diào)用自身的算法稱為遞歸算法遞歸算法。用 函數(shù)自身給出定義的函數(shù)稱為遞歸函數(shù)遞歸函數(shù)。 n由分治法產(chǎn)生的子問題往往是原問題的較小模式, 這就為使用遞歸技術(shù)提供了方便。在這種情況下, 反復(fù)應(yīng)用分治手段,可以使子問題與原問題類型 一致而其規(guī)模卻不斷縮小,最終使子問題縮小到 很容易直接求出其解。這自然導(dǎo)致遞歸過程的產(chǎn) 生。 n分治與遞歸像一對孿生兄弟,經(jīng)常同時應(yīng)用在算 法設(shè)計之中,并由此產(chǎn)生許多高效算法。 下面來看幾個實例。下面來看幾個實例。 2021-7-18算法設(shè)計與分析課件30 2.1 例例1 1 階乘函數(shù)階乘函數(shù) 階乘函數(shù)可遞歸地定義為: 0 0 )!1( 1 ! n n nn
25、n 邊界條件邊界條件 遞歸方程遞歸方程 邊界條件與遞歸方程是遞歸函數(shù)的二個要素,遞歸函 數(shù)只有具備了這兩個要素,才能在有限次計算后得出 結(jié)果。 2021-7-18算法設(shè)計與分析課件31 2.1 例例2 Fibonacci2 Fibonacci數(shù)列數(shù)列 無窮數(shù)列1,1,2,3,5,8,13,21,34,55,被稱為 Fibonacci數(shù)列。它可以遞歸地定義為: 邊界條件邊界條件 遞歸方程遞歸方程 1 1 0 )2() 1( 1 1 )( n n n nFnF nF 第n個Fibonacci數(shù)可遞歸地計算如下: public static int fibonacci(int n) if (n 1時
26、,perm(R)由(r1)perm(R1),(r2)perm(R2), (rn)perm(Rn)構(gòu)成。 2021-7-18算法設(shè)計與分析課件37 2.1 例例5 5 整數(shù)劃分問題整數(shù)劃分問題 將正整數(shù)n表示成一系列正整數(shù)之和:n=n1+n2+nk, 其中n1n2nk1,k1。 正整數(shù)n的這種表示稱為正整數(shù)n的劃分。求正整數(shù)n的不 同劃分個數(shù)。 例如正整數(shù)6有如下11種不同的劃分: 6; 5+1; 4+2,4+1+1; 3+3,3+2+1,3+1+1+1; 2+2+2,2+2+1+1,2+1+1+1+1; 1+1+1+1+1+1。 2021-7-18算法設(shè)計與分析課件38 (2) q(n,m)=
27、q(n,n),mn; 最大加數(shù)n1實際上不能大于n。因此,q(1,m)=1。 (1) q(n,1)=1,n1; 當(dāng)最大加數(shù)n1不大于1時,任何正整數(shù)n只有一種劃分形式, 即 n n111 (4) q(n,m)=q(n,m-1)+q(n-m,m),nm1; 正整數(shù)n的最大加數(shù)n1不大于m的劃分由n1=m的劃分和 n1n-1 的劃分組成。 (3) q(n,n)=1+q(n,n-1); 正整數(shù)n的劃分由n1=n的劃分和n1n-1的劃分組成。 2.1 例例5 5 整數(shù)劃分問題整數(shù)劃分問題 前面的幾個例子中,問題本身都具有比較明顯的遞歸關(guān)系,因 而容易用遞歸函數(shù)直接求解。 在本例中,如果設(shè)p(n)為正整
28、數(shù)n的劃分?jǐn)?shù),則難以找到遞歸關(guān) 系,因此考慮增加一個自變量:將最大加數(shù)n1不大于m的劃分個 數(shù)記作q(n,m)??梢越(n,m)的如下遞歸關(guān)系。 2021-7-18算法設(shè)計與分析課件39 1 1, 1 ),() 1,( ) 1,(1 ),( 1 ),( mn mn mn mn mmnqmnq nnq nnq mnq 2.1 例例5 5 整數(shù)劃分問題整數(shù)劃分問題 前面的幾個例子中,問題本身都具有比較明顯的遞歸關(guān)系,因 而容易用遞歸函數(shù)直接求解。 在本例中,如果設(shè)p(n)為正整數(shù)n的劃分?jǐn)?shù),則難以找到遞歸關(guān) 系,因此考慮增加一個自變量:將最大加數(shù)n1不大于m的劃分個 數(shù)記作q(n,m)??梢越?/p>
29、立q(n,m)的如下遞歸關(guān)系。 正整數(shù)n的劃分?jǐn)?shù)p(n)=q(n,n)。 2021-7-18算法設(shè)計與分析課件40 2.1 例例6 Hanoi6 Hanoi塔問題塔問題 設(shè)a,b,c是3個塔座。開始時,在塔座a上有一疊共n個圓盤,這 些圓盤自下而上,由大到小地疊在一起。各圓盤從小到大編號 為1,2,n,現(xiàn)要求將塔座a上的這一疊圓盤移到塔座b上,并 仍按同樣順序疊置。在移動圓盤時應(yīng)遵守以下移動規(guī)則: 規(guī)則1:每次只能移動1個圓盤; 規(guī)則2:任何時刻都不允許將大的圓盤壓在較小的圓盤之上; 規(guī)則3:在滿足移動規(guī)則1和 2的前提下,可將圓盤移至 a,b,c中任一塔座上。 2021-7-18算法設(shè)計與分
30、析課件41 在問題規(guī)模較大時,較難找到一般的方法,因此我們嘗試 用遞歸技術(shù)來解決這個問題。 當(dāng)n=1時,問題比較簡單。此時,只要將編號為1的圓盤從塔座a直 接移至塔座b上即可。 當(dāng)n1時,需要利用塔座c作為輔助塔座。此時若能設(shè)法將n-1個 較小的圓盤依照移動規(guī)則從塔座a移至塔座c,然后,將剩下的最 大圓盤從塔座a移至塔座b,最后,再設(shè)法將n-1個較小的圓盤依照 移動規(guī)則從塔座c移至塔座b。 由此可見,n個圓盤的移動問題可分為2次n-1個圓盤的移動問題, 這又可以遞歸地用上述方法來做。由此可以設(shè)計出解Hanoi塔問題 的遞歸算法如下。 2.1 例例6 Hanoi6 Hanoi塔問題塔問題 pub
31、lic static void hanoi(int n, int a, int b, int c) if (n 0) hanoi(n-1, a, c, b); move(a,b); hanoi(n-1, c, b, a); 2021-7-18算法設(shè)計與分析課件42 優(yōu)點:優(yōu)點:結(jié)構(gòu)清晰,可讀性強(qiáng),而且容易用數(shù)學(xué)歸納法來結(jié)構(gòu)清晰,可讀性強(qiáng),而且容易用數(shù)學(xué)歸納法來 證明算法的正確性,因此它為設(shè)計算法、調(diào)試程序帶證明算法的正確性,因此它為設(shè)計算法、調(diào)試程序帶 來很大方便。來很大方便。 缺點:缺點:遞歸算法的運行效率較低,無論是耗費的計算時遞歸算法的運行效率較低,無論是耗費的計算時 間還是占用的存儲空
32、間都比非遞歸算法要多。間還是占用的存儲空間都比非遞歸算法要多。 2021-7-18算法設(shè)計與分析課件43 解決方法:解決方法:在遞歸算法中消除遞歸調(diào)用,使其轉(zhuǎn)化在遞歸算法中消除遞歸調(diào)用,使其轉(zhuǎn)化 為非遞歸算法。為非遞歸算法。 1.1.采用一個用戶定義的棧來模擬系統(tǒng)的遞歸調(diào)用工采用一個用戶定義的棧來模擬系統(tǒng)的遞歸調(diào)用工 作棧。該方法通用性強(qiáng),但本質(zhì)上還是遞歸,只作棧。該方法通用性強(qiáng),但本質(zhì)上還是遞歸,只 不過人工做了本來由編譯器做的事情,優(yōu)化效果不過人工做了本來由編譯器做的事情,優(yōu)化效果 不明顯。不明顯。 2.2.用遞推來實現(xiàn)遞歸函數(shù)。用遞推來實現(xiàn)遞歸函數(shù)。 3.3.通過通過CooperCoop
33、er變換、變換、反演變換能反演變換能將一些遞歸轉(zhuǎn)化為將一些遞歸轉(zhuǎn)化為 尾遞歸,從而迭代求出結(jié)果。尾遞歸,從而迭代求出結(jié)果。 后兩種方法在時空復(fù)雜度上均有較大改善,后兩種方法在時空復(fù)雜度上均有較大改善, 但其適用范圍有限。但其適用范圍有限。 2021-7-18算法設(shè)計與分析課件44 n該問題的規(guī)模縮小到一定的程度就可以容易地解決;該問題的規(guī)模縮小到一定的程度就可以容易地解決; n該問題可以分解為若干個規(guī)模較小的相同問題,即該問題具有該問題可以分解為若干個規(guī)模較小的相同問題,即該問題具有 最優(yōu)子結(jié)構(gòu)性質(zhì)最優(yōu)子結(jié)構(gòu)性質(zhì) n利用該問題分解出的子問題的解可以合并為該問題的解;利用該問題分解出的子問題的解
34、可以合并為該問題的解; n該問題所分解出的各個子問題是相互獨立的,即子問題之間不該問題所分解出的各個子問題是相互獨立的,即子問題之間不 包含公共的子問題。包含公共的子問題。 因為問題的計算復(fù)雜性一般是隨著問題規(guī)模的增加 而增加,因此大部分問題滿足這個特征。 這條特征是應(yīng)用分治法的前提,它也是大多數(shù)問題 可以滿足的,此特征反映了遞歸思想的應(yīng)用 能否利用分治法完全取決于問題是否具有這條特征, 如果具備了前兩條特征,而不具備第三條特征,則 可以考慮貪心算法貪心算法或動態(tài)規(guī)劃動態(tài)規(guī)劃。 這條特征涉及到分治法的效率,如果各子問題是不 獨立的,則分治法要做許多不必要的工作,重復(fù)地 解公共的子問題,此時雖然
35、也可用分治法,但一般 用動態(tài)規(guī)劃動態(tài)規(guī)劃較好。 2021-7-18算法設(shè)計與分析課件45 divide-and-conquer(P) if ( | P | = n0) adhoc(P); /解決小規(guī)模的問題 divide P into smaller subinstances P1,P2,.,Pk;/分解問題 for (i=1,i=k,i+) yi=divide-and-conquer(Pi); /遞歸的解各子問題 return merge(y1,.,yk); /將各子問題的解合并為原問題的解 人們從大量實踐中發(fā)現(xiàn),在用分治法設(shè)計算法時,最好使子問題的 規(guī)模大致相同。即將一個問題分成大小相等的
36、k個子問題的處理方法是 行之有效的。這種使子問題規(guī)模大致相等的做法是出自一種平衡平衡 (balancing)子問題子問題的思想,它幾乎總是比子問題規(guī)模不等的做法要好。 2021-7-18算法設(shè)計與分析課件46 一個分治法將規(guī)模為n的問題分成k個規(guī)模為nm的子問題去解。 設(shè)分解閥值n0=1,且adhoc解規(guī)模為1的問題耗費1個單位時間。 再設(shè)將原問題分解為k個子問題以及用merge將k個子問題的解合 并為原問題的解需用f(n)個單位時間。用T(n)表示該分治法解 規(guī)模為|P|=n的問題所需的計算時間,則有: 1 1 )()/( ) 1 ( )( n n nfmnkT O nT 通過迭代法求得方程
37、的解: 1log 0 log )/()( n m j jj k m mnfknnT 注意注意:遞歸方程及其解只給出n等于m的方冪時T(n)的值,但 是如果認(rèn)為T(n)足夠平滑,那么由n等于m的方冪時T(n)的值 可以估計T(n)的增長速度。通常假定T(n)是單調(diào)上升的,從而 當(dāng)minmi+1時,T(mi)T(n)T(mi+1)。 2021-7-18算法設(shè)計與分析課件47 分析:如果n=1即只有一個元素,則只要比較這個元素和x就 可以確定x是否在表中。因此這個問題滿足分治法的第一個適 用條件 給定已按升序排好序的給定已按升序排好序的n個元素個元素a0:n-1,現(xiàn)要在這,現(xiàn)要在這n個元素中找個元素
38、中找 出一特定元素出一特定元素x。 分析:分析: 該問題的規(guī)模縮小到一定的程度就可以容易地解決;該問題的規(guī)模縮小到一定的程度就可以容易地解決; 該問題可以分解為若干個規(guī)模較小的相同問題該問題可以分解為若干個規(guī)模較小的相同問題; 分解出的子問題的解可以合并為原問題的解;分解出的子問題的解可以合并為原問題的解; 分解出的各個子問題是相互獨立的。分解出的各個子問題是相互獨立的。 2021-7-18算法設(shè)計與分析課件48 分析:比較x和a的中間元素amid,若x=amid,則x在L 中的位置就是mid;如果xai,同理我們只 要在amid的后面查找x即可。無論是在前面還是后面查找 x,其方法都和在a中
39、查找x一樣,只不過是查找的規(guī)??s 小了。這就說明了此問題滿足分治法的第二個和第三個適 用條件。 給定已按升序排好序的給定已按升序排好序的n個元素個元素a0:n-1,現(xiàn)要在這,現(xiàn)要在這n個元素中找個元素中找 出一特定元素出一特定元素x。 2021-7-18算法設(shè)計與分析課件49 分析:很顯然此問題分解出的子問題相互獨立,即在ai的前 面或后面查找x是獨立的子問題,因此滿足分治法的第四個適 用條件。 給定已按升序排好序的給定已按升序排好序的n個元素個元素a0:n-1,現(xiàn)要在這,現(xiàn)要在這n個元素中找個元素中找 出一特定元素出一特定元素x。 分析:分析: 該問題的規(guī)??s小到一定的程度就可以容易地解決;
40、該問題的規(guī)模縮小到一定的程度就可以容易地解決; 該問題可以分解為若干個規(guī)模較小的相同問題該問題可以分解為若干個規(guī)模較小的相同問題; 分解出的子問題的解可以合并為原問題的解;分解出的子問題的解可以合并為原問題的解; 分解出的各個子問題是相互獨立的。分解出的各個子問題是相互獨立的。 2021-7-18算法設(shè)計與分析課件50 給定已按升序排好序的給定已按升序排好序的n個元素個元素a0:n-1,現(xiàn)要在這,現(xiàn)要在這n個元素中找個元素中找 出一特定元素出一特定元素x。 據(jù)此容易設(shè)計出二分搜索算法二分搜索算法: public static int binarySearch(int a, int x, int
41、 n) / 在 a0 = a1 = . = an-1 中搜索 x / 找到x時返回其在數(shù)組中的位置,否則返回-1 int left = 0; int right = n - 1; while (left amiddle) left = middle + 1; else right = middle - 1; return -1; / 未找到x 算法復(fù)雜度分析:算法復(fù)雜度分析: 每執(zhí)行一次算法的 while循環(huán), 待搜索數(shù) 組的大小減少一半。因 此,在最壞情況下, while循環(huán)被執(zhí)行了 O(logn) 次。循環(huán)體內(nèi) 運算需要O(1) 時間, 因此整個算法在最壞情 況下的計算時間復(fù)雜性 為O(l
42、ogn) 。 2021-7-18算法設(shè)計與分析課件51 請設(shè)計一個有效的算法,可以進(jìn)行兩個請設(shè)計一個有效的算法,可以進(jìn)行兩個n n位大整數(shù)的乘法運算位大整數(shù)的乘法運算 u小學(xué)的方法:O(n2) 效率太低 u分治法: 復(fù)雜度分析復(fù)雜度分析 T(n)=O(n2) 沒有改進(jìn)沒有改進(jìn) 1 1 )()2/(4 ) 1 ( )( n n nOnT O nT ab cd X = Y = X = a 2n/2 + b Y = c 2n/2 + d XY = ac 2n + (ad+bc) 2n/2 + bd 2021-7-18算法設(shè)計與分析課件52 請設(shè)計一個有效的算法,可以進(jìn)行兩個請設(shè)計一個有效的算法,可以
43、進(jìn)行兩個n n位大整數(shù)的乘法運算位大整數(shù)的乘法運算 u小學(xué)的方法:O(n2) 效率太低 u分治法: XY = ac 2n + (ad+bc) 2n/2 + bd 為了降低時間復(fù)雜度,必須減少乘法的次數(shù)。 1.XY = ac 2n + (a-c)(b-d)+ac+bd) 2n/2 + bd 2.XY = ac 2n + (a+c)(b+d)-ac-bd) 2n/2 + bd 復(fù)雜度分析復(fù)雜度分析 T(n)=O(nlog3) =O(n1.59) 較大的改進(jìn)較大的改進(jìn) 1 1 )()2/(3 ) 1 ( )( n n nOnT O nT 細(xì)節(jié)問題細(xì)節(jié)問題:兩個XY的復(fù)雜度都是O(nlog3),但考慮
44、到a+c,b+d可 能得到m+1位的結(jié)果,使問題的規(guī)模變大,故不選擇第2種方案。 2021-7-18算法設(shè)計與分析課件53 請設(shè)計一個有效的算法,可以進(jìn)行兩個請設(shè)計一個有效的算法,可以進(jìn)行兩個n n位大整數(shù)的乘法運算位大整數(shù)的乘法運算 u小學(xué)的方法:O(n2) 效率太低 u分治法: O(n1.59) 較大的改進(jìn) u更快的方法? 如果將大整數(shù)分成更多段,用更復(fù)雜的方式把它們組合起 來,將有可能得到更優(yōu)的算法。 最終的,這個思想導(dǎo)致了快速傅利葉變換快速傅利葉變換(Fast Fourier Transform)的產(chǎn)生。該方法也可以看作是一個復(fù)雜的分治算 法,對于大整數(shù)乘法,它能在O(nlogn)時間
45、內(nèi)解決。 是否能找到線性時間的算法?目前為止還沒有結(jié)果。 2021-7-18算法設(shè)計與分析課件54 A和B的乘積矩陣C中的元素Ci,j定義為: n k jkBkiAjiC 1 若依此定義來計算A和B的乘積矩陣C,則每計 算C的一個元素Cij,需要做n次乘法和n-1次 加法。因此,算出矩陣C的 個元素所需的計算 時間為O(n3) u傳統(tǒng)方法:O(n3) 2021-7-18算法設(shè)計與分析課件55 使用與上例類似的技術(shù),將矩陣A,B和C中每一矩陣都分塊成4 個大小相等的子矩陣。由此可將方程C=AB重寫為: u傳統(tǒng)方法:O(n3) u分治法: 2221 1211 2221 1211 2221 1211
46、 BB BB AA AA CC CC 由此可得: 2112111111 BABAC 2212121112 BABAC 2122112121 BABAC 2222122122 BABAC 復(fù)雜度分析復(fù)雜度分析 T(n)=O(n3) 沒有改進(jìn)沒有改進(jìn) 2 2 )()2/(8 ) 1 ( )( 2 n n nOnT O nT 2021-7-18算法設(shè)計與分析課件56 為了降低時間復(fù)雜度,必須減少乘法的次數(shù)。 2221 1211 2221 1211 2221 1211 BB BB AA AA CC CC )( 2212111 BBAM 2212112 )(BAAM 1122213 )(BAAM )(
47、1121224 BBAM )( 221122115 BBAAM )( 222122126 BBAAM )( 121121117 BBAAM 624511 MMMMC 2112 MMC 4321 MMC 731522 MMMMC 復(fù)雜度分析復(fù)雜度分析 T(n)=O(nlog7) =O(n2.81) 較大的改進(jìn)較大的改進(jìn) 2 2 )()2/(7 ) 1 ( )( 2 n n nOnT O nT 2021-7-18算法設(shè)計與分析課件57 u更快的方法? Hopcroft和Kerr已經(jīng)證明(1971),計算2個矩陣的乘 積,7次乘法是必要的。因此,要想進(jìn)一步改進(jìn)矩陣乘法的時 間復(fù)雜性,就不能再基于計算
48、22矩陣的7次乘法這樣的方法 了?;蛟S應(yīng)當(dāng)研究或矩陣的更好算法。 在Strassen之后又有許多算法改進(jìn)了矩陣乘法的計算時間復(fù) 雜性。目前最好的計算時間上界是 O(n2.376) 是否能找到O(n2)的算法?目前為止還沒有結(jié)果。 2021-7-18算法設(shè)計與分析課件58 在一個2k2k 個方格組成的棋盤中,恰有一個方格與其他方格 不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。在 棋盤覆蓋問題中,要用圖示的4種不同形態(tài)的L型骨牌覆蓋給定 的特殊棋盤上除特殊方格以外的所有方格,且任何2個L型骨牌 不得重疊覆蓋。 2021-7-18算法設(shè)計與分析課件59 當(dāng)k0時,將2k2k棋盤分割為4個2k
49、-12k-1 子棋盤(a)所示。 特殊方格必位于4個較小子棋盤之一中,其余3個子棋盤中無特 殊方格。為了將這3個無特殊方格的子棋盤轉(zhuǎn)化為特殊棋盤,可 以用一個L型骨牌覆蓋這3個較小棋盤的會合處,如 (b)所示, 從而將原問題轉(zhuǎn)化為4個較小規(guī)模的棋盤覆蓋問題。遞歸地使用 這種分割,直至棋盤簡化為棋盤11。 2021-7-18算法設(shè)計與分析課件60 public void chessBoard(int tr, int tc, int dr, int dc, int size) if (size = 1) return; int t = tile+, / L型骨牌號 s = size/2; / 分割
50、棋盤 / 覆蓋左上角子棋盤 if (dr tr + s else / 此棋盤中無特殊方格 / 用 t 號L型骨牌覆蓋右下角 boardtr + s - 1tc + s - 1 = t; / 覆蓋其余方格 chessBoard(tr, tc, tr+s-1, tc+s-1, s); / 覆蓋右上角子棋盤 if (dr = tc + s) / 特殊方格在此棋盤中 chessBoard(tr, tc+s, dr, dc, s); else / 此棋盤中無特殊方格 / 用 t 號L型骨牌覆蓋左下角 boardtr + s - 1tc + s = t; / 覆蓋其余方格 chessBoard(tr, t
51、c+s, tr+s-1, tc+s, s); / 覆蓋左下角子棋盤 if (dr = tr + s else / 用 t 號L型骨牌覆蓋左上角 boardtr + stc + s = t; / 覆蓋其余方格 chessBoard(tr+s, tc+s, tr+s, tc+s, s); 復(fù)雜度分析復(fù)雜度分析 T(n)=O(4k) 漸進(jìn)意義下的最優(yōu)算法 0 0 ) 1 () 1(4 ) 1 ( )( k k OkT O kT 2021-7-18算法設(shè)計與分析課件61 基本思想:基本思想:將待排序元素分成大小大致相同的2個子集合,分 別對2個子集合進(jìn)行排序,最終將排好序的子集合合并成為所 要求的排好
52、序的集合。 public static void mergeSort(Comparable a, int left, int right) if (leftright) /至少有2個元素 int i=(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ù)雜度分析復(fù)雜度分析 T(n)=O(nlogn) 漸進(jìn)意義下的最優(yōu)算法 1 1 )()2/(2 ) 1 ( )( n n
53、 nOnT O nT 2021-7-18算法設(shè)計與分析課件62 算法mergeSort的遞歸過程可以消去。 初始序列49 38 65 97 76 13 27 38 49 65 97 13 76 27 第一步 第二步38 49 65 97 13 27 76 第三步 13 27 38 49 65 76 97 2021-7-18算法設(shè)計與分析課件63 if (i = j) break; MyMath.swap(a, i, j); ap = aj; aj = x; return j; 快速排序具有不穩(wěn)定性不穩(wěn)定性。 初始序列 6, 7, 5, 2, 5, 8 j-; j i 5, 7, 5, 2, 6
54、, 8 i+; ji 5, 6, 5, 2, 7, 8 j-; j i 5, 2, 5, 6, 7, 8 i+; ji 完成 6, 7, 5, 2, 5, 8 5, 2, 5 6 7, 8 2021-7-18算法設(shè)計與分析課件66 private static int randomizedPartition (int p, int r) int i = random(p,r); MyMath.swap(a, i, p); return partition (p, r); 快速排序算法的性能取決于劃分的對稱性。通過修改 算法partition,可以設(shè)計出采用隨機(jī)選擇策略的快速排 序算法。在快速排
55、序算法的每一步中,當(dāng)數(shù)組還沒有被 劃分時,可以在ap:r中隨機(jī)選出一個元素作為劃分基準(zhǔn), 這樣可以使劃分基準(zhǔn)的選擇是隨機(jī)的,從而可以期望劃 分是較對稱的。 int i=randomizedpartition(p,r), j=i-p+1; if (k=j) return randomizedSelect(p,i,k); else return randomizedSelect(i+1,r,k-j); 在最壞情況下,算法randomizedSelect需要O(n2)計算時間 但可以證明,算法randomizedSelect可以在O(n)平均時間內(nèi) 找出n個輸入元素中的第k小元素。 2021-7-1
56、8算法設(shè)計與分析課件68 如果能在線性時間內(nèi)找到一個劃分基準(zhǔn),使得 按這個基準(zhǔn)所劃分出的2個子數(shù)組的長度都至少 為原數(shù)組長度的倍(01是某個正常數(shù)),那 么就可以在最壞情況下在最壞情況下用O(n)時間完成選擇任 務(wù)。 例如,若=9/10,算法遞歸調(diào)用所產(chǎn)生的子 數(shù)組的長度至少縮短1/10。所以,在最壞情 況下,算法所需的計算時間T(n)滿足遞歸式 T(n)T(9n/10)+O(n) 。由此可得T(n)=O(n)。 2021-7-18算法設(shè)計與分析課件69 l將n個輸入元素劃分成n/5個組,每組5個元素,只可能 有一個組不是5個元素。用任意一種排序算法,將每組中的 元素排好序,并取出每組的中位數(shù)
57、,共n/5個。 l遞歸調(diào)用select來找出這n/5個元素的中位數(shù)。如果 n/5是偶數(shù),就找它的2個中位數(shù)中較大的一個。以這個 元素作為劃分基準(zhǔn)。 設(shè)所有元素互不相同。在這種情況下, 找出的基準(zhǔn)x至少比3(n-5)/10個元素 大,因為在每一組中有2個元素小于 本組的中位數(shù),而n/5個中位數(shù)中又 有(n-5)/10個小于基準(zhǔn)x。同理,基準(zhǔn) x也至少比3(n-5)/10個元素小。而當(dāng) n75時,3(n-5)/10n/4所以按此基 準(zhǔn)劃分所得的2個子數(shù)組的長度都至 少縮短1/4。 2021-7-18算法設(shè)計與分析課件70 private static Comparable select (int
58、p, int r, int k) if (r-p5) /用某個簡單排序算法對數(shù)組ap:r排序; bubbleSort(p,r); return ap+k-1; /將ap+5*i至ap+5*i+4的第3小元素與ap+i交換位置; /找中位數(shù)的中位數(shù),r-p-4即上面所說的n-5 for ( int i = 0; i=(r-p-4)/5; i+ ) int s=p+5*i, t=s+4; for (int j=0;j3;j+) bubble(s,t-j); MyMath.swap(a, p+i, s+2); Comparable x = select(p, p+(r-p-4)/5, (r-p+6)
59、/10); int i=partition(p,r,x), j=i-p+1; if (k=j) return select(p,i,k); else return select(i+1,r,k-j); 復(fù)雜度分析復(fù)雜度分析 T(n)=O(n) 75 75 )4/3()5/( )( 2 1 n n nTnTnC C nT 上述算法將每一組的大小定為5,并選取75作為是否作遞歸 調(diào)用的分界點。這2點保證了T(n)的遞歸式中2個自變量之和 n/5+3n/4=19n/20=n,01。這是使T(n)=O(n)的關(guān)鍵之 處。當(dāng)然,除了5和75之外,還有其他選擇。 2021-7-18算法設(shè)計與分析課件71
60、給定平面上n個點的集合S,找其中的一對點,使得在n個點組 成的所有點對中,該點對間的距離最小。 u為了使問題易于理解和分析,先來考慮一維一維的情形。此時, S中的n個點退化為x軸上的n個實數(shù) x1,x2,xn。最接近點對 即為這n個實數(shù)中相差最小的2個實數(shù)。 假設(shè)我們用x軸上某個點m將S劃分為2個子集S1和S2 ,基于 平衡子問題平衡子問題的思想,用S中各點坐標(biāo)的中位數(shù)來作分割點。 遞歸地在S1和S2上找出其最接近點對p1,p2和q1,q2,并設(shè) d=min|p1-p2|,|q1-q2|,S中的最接近點對或者是p1,p2,或 者是q1,q2,或者是某個p3,q3,其中p3S1且q3S2。 能否
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 會計師事務(wù)所兼職合同范本:工作職責(zé)與權(quán)益保障
- 2024解除勞動合同的問題
- 國家級代理授權(quán)經(jīng)營合同范本
- 2024新版廣告合同格式
- 醫(yī)院與社區(qū)合作協(xié)議
- 2024年度別墅電梯定制安裝合同
- 2024建筑材料的購銷合同范本
- 2024年專用電纜采購合同
- 2024苗圃土地承包合同模板
- 工程項目協(xié)作股權(quán)協(xié)議范例
- 2015-2024北京中考真題語文匯編:記敘文閱讀
- 2024年湖南土建中級職稱-建筑工程《法律法規(guī)及技術(shù)標(biāo)準(zhǔn)》考試題庫(含答案)
- 旅游景區(qū)消防安全培訓(xùn)
- 《創(chuàng)意改善生活》課件 2024-2025學(xué)年湘美版(2024)初中美術(shù)七年級上冊
- 2024-2025學(xué)年 浙教版七年級數(shù)學(xué)上冊期中(第1-4章)培優(yōu)試卷
- 個人簡歷模板(5套完整版)
- CHT 1027-2012 數(shù)字正射影像圖質(zhì)量檢驗技術(shù)規(guī)程(正式版)
- 勞務(wù)派遣勞務(wù)外包服務(wù)方案(技術(shù)方案)
- (完整版)裝修主要材料一覽表
- 排球正面下手發(fā)球教學(xué)設(shè)計
- 給4S店精品銷售的幾點建議
評論
0/150
提交評論