1、1,第二十章 演算法簡介,計算機概論編輯小組,p20-2,內容,前言 20.1 演算法分析 20.2 個別擊破策略 20.3 貪婪策略 20.4 動態規劃 20.5 刪除與搜尋策略 20.6 課後習題 20.7 欲罷不能,p20-3,前言,演算法 (Algorithm) 電腦上解決問題的方法 包括明確的輸出入資料和詳細且有限的執行步驟 了解每個演算法在不同狀況下所花的時間,而從中挑選適合的演算法以迅速得到答案 演算法設計策略,p20-4,20.1 演算法分析,在電腦上解決問題的基本架構 演算法以程式描述後在電腦上執行,資料輸入至程式後,經過程式對資料的運算,最後產生解答,p20-5,時間複雜度
2、 (Time Complexity),假設演算法 A 能解問題P 問題P的輸入資料量為N 假設資料量為N的資料樣本 (Data Instance) 有 D1 , D2 , . , Di , . , Dm 共 m 種 令 T(Di) 表示當輸入資料為 Di 時演算法 A 要執行的運算或步驟的總次數 演算法 A 的最好狀況時間複雜度 (Best-Case Time Complexity)T(Di)(1 i m)中最小的值,即min1 i m T(Di) ,p20-6,時間複雜度 (cont.),演算法 A 的最差狀況時間複雜度 (Worst-Case Time Complexity) T(Di)(
3、1 i m)中最大者,即max1 i m T(Di) 演算法A的一般狀況時間複雜度 (Average-Case Time Complexity) T(Di) (1 i m)的平均值或期望值(在某機率假設下) 說“演算法A的時間複雜度為C”就是指其最差狀況時間複雜度為C,p20-7,時間複雜度 (cont.),範例 若問題P之輸入資料量為 N 的樣本有D1 , D2 , D3 三種,且 T(D1)=3 , T(D2)=N , T(D3)=N3 演算法 A 的 最好狀況時間複雜度為 3 演算法 A 的最差狀況為 N3 演算法 A 的一般狀況為 (3+N+N3)/3 稱演算法 A 的時間複雜度為 N
4、3,p20-8,漸近上限 (Asymptotic Upper Bound) O階次,如果存在某固定正實數 c 及某個非負整數 m 使得對所有的 n m,不等式 g (n) c f (n) 都成立,則 g (n) = O ( f (n),稱 f (n) 為 g (n) 的漸近上限 Example: N2+10N = O(N2),因為當n 10 時,N2+10N 2N2 稱N2為N2+10N的漸進上限,p20-9,漸近下限 (Asymptotic Lower Bound) 階次,若存在某固定正變數 c 及某非負整數 m 使得對所有 n m,不等式 g (n) c f (n) 都成立,則 g (n)
5、 = ( f (n),稱 f (n) 為 g (n) 的漸近下限 Example n3 = (n2),因為當n 1時,n31 n2,所以n2為n3的漸近下限。,p20-10,真正階次 (Exact Order) ,若存在某固定正變數 c 及某非負整數 m 使得對所有 n m,不等式 g (n) c f (n) 都成立,則 g (n) = ( f (n),稱 f (n) 為 g (n) 的漸近下限 Example N2+10N = (N2),因為 N2+10N = O(N2) 且 N2+10N = (N2)。,p20-11,真正階次(cont.),當n足夠大時,2n n3 n2 nlogn n
6、logn,p20-12,指數函數分析,指數函數 (Exponential Function) 例如:f(n) = cp(n),其中c為常數,p(n)為n的多項式函數 (Polynomial Function) (如n,n2 + 10,log2n,nlog2n) Example:2n、3n、4logn等函數 函數值上升速度相當快時間複雜度為指數函數階次的演算法在資料量足夠多時需要相當長的時間才能解得答案,p20-13,多項式時間演算法 (Polynomial-Time Algorithm),時間複雜度是O(p(n)的演算法,其中p(n)為n的多項式函數電腦上可解(Tractable)的問題 能用
7、多項式時間演算法解得答案的問題,即能用電腦在合理時間內求得答案 例如:排序及搜尋等問題,p20-14,排序法及搜尋法的時間複雜度,p20-15,最佳演算法 (Optimal Algorithm),若可解問題P的演算法A的時間複雜度為t,而解問題P的演算法最少需要t時間,則稱演算法A是解問題P的最佳演算法 例如:兩兩合併排序法是最佳排序演算法 排序n個數的問題最少需要O(nlog2n)時間 兩兩合併排序法的時間複雜度是O(nlog2n),p20-16,難解問題 (Intractable Problem),若問題P無法以多項式時間演算法解得答案,則問題P無法於電腦上在合理時間內求得答案,稱問題P為
8、難解問題,或NP-Complete問題Example 旅行推銷員問題 (Travelling Salesman Problem) 圖形塗色問題 (Graph-Coloring Problem) 裝箱問題 (Bin-Packing Problem),p20-17,20.2 個別擊破策略(Divide-and-Conquer Method),將原來的問題P分解成2個或多個子問題 待個別解決這些子問題後再經由合併 (merge) 處理整理出原來問題的答案 因為分割後的子問題是資料量較小的問題P,因此解子問題時又可遞迴應用上述的方法經由分割及合併的過程得到解答Example:二分搜尋法,兩兩合併排序法
9、,p20-18,兩兩合併排序法,一開始就將資料分割成兩部份處理,然後再遞迴細分各資料直至不能細分為止 接著就兩兩合併成排序的序列,慢慢的將分割的資料合併成排序的序列,最後得到所有資料的排序結果,p20-19,二分搜尋法,假設陣列D中依序放有4, 3, 5, 2, 6, 7, 1等七個整數,目標是將這些數依小到大順序排序 首先觀察第一個數4在最後排序好的序列中應是第四位即應放在D(4) 如果能將不大於4的數放在D(1)至D(3)中而不小於4的數放在D(5)至D(7)中則只要再分別排序好D(1)至D(3)的數及D(5)至D(7)內的數那原來排序問題就解決了,p20-20,二分搜尋法(cont.),
10、方法 令i=2j =7 從D(i)開始向右找到第一個不小於D(1)的數以i記錄其陣列的索引 從D(j)開始向左找到第一個不大於D(1)的數以j記錄其陣列索引 若i j ,則交換D(i)與D(j)的內容,並繼續前述的左右搜尋; 若i j,則交換D(1)與D(j)的內容,並停止搜尋,p20-21,二分搜尋法(cont.),確定4的位置 將不大於4的資料放其左方 將不小於4的資料放其右方,p20-22,快速排序法(Quick Sort),原來的排序問題可細分為排序 D(1) 至 D(3) 的數及排序 D(5) 至 D(7) 的數的兩個子問題 待解決子問題題後,可依序將答案組合起來,就是原來的答案。
11、而分割後的子問題仍是排序問題可再利用前一段敘述的方法排序之,p20-23,快速排序法-程式,QSORT副程式以快速排序法對陣列D(M)至D(N)的元素排序,p20-24,快速排序法(cont.),快速排序法 最差時間複雜度為O(n2) ,其中n為資料個數 一般狀況時間複雜度為O(nlog2n)個別擊破策略常用於計算幾何 (Computational Geometry) 的應用問題,p20-25,20.3 貪婪策略(Greedy Method),每次的決策都是朝向目前“最好”的方向前進 櫃檯服務問題 某一個銀行出納櫃檯要服務n位顧客,銀行的目標是希望顧客在櫃檯等待的平均時間要最少 解決之道是每次
12、都從尚未服務的顧客中,選擇需要服務時間最短的顧客來服務,如此就可達到預期目標,p20-26,貪婪策略-實例說明,假設有5個顧客A,B,C,D,E幾乎同時到達銀行櫃檯,其所需服務時間如表所示 銀行櫃檯將依序服務B,D,E,C,A 顧客在櫃檯等待的平均時間為 1 + (1 + 2) + (1 + 2 + 3) + (1 + 2 + 3 + 4) + (1 + 2 + 3 + 4 + 5) / 5 = 7,p20-27,背包問題 (Knapsack Problem),假設有多個可分解的物件和一只限重W的背包 每件物件有其重量及其被選取放入背包內的利益 請問要如何將物件放進背包內而使得獲得的利益最大
13、解決的方法: 是每次在限重的情形下,選取尚未放入的物件中擁有最大的利益與重量的比值之物件放入背包內。,p20-28,背包問題-實例說明,設背包限重100,有A,B,C,D,E共五個物件,其資料如表所示,p20-29,背包問題-實例說明(cont.),解法 依利益/重量由大至小順序放入物件,即C, A, B, E, D順序考慮,p20-30,最小擴展樹 (Minimum Spanning Tree),右圖 由頂點 (Vertex) 及邊 (Edge) 構成 每一邊都連接兩頂點,可指定其加權(Weight) ,分有向和無向兩種 圓圈代表頂點 連接兩頂點的線為邊 每個邊都有非負的加權 例如頂點V3與
14、頂點V5間的邊之加權為5,p20-31,最小擴展樹(cont.),無向圖 (Undirected Graph):均是無方向邊的圖形。 無向圖的路徑 (Path):由頂點構成的序列,其中序列裏每個頂點與其後一個頂點之間必有邊相連 例如V1, V5, V2是一條從頂點V1到頂點V2的路徑。 聯通圖 (Connected Graph):任兩頂點都存在一條路徑的無向圖 例如右圖是聯通圖,p20-32,最小擴展樹(cont.),迴圈 (Cycle):從某頂點出發回到該頂點的路徑 例如V1, V5, V2, V1路徑就是迴圈 無迴圈圖 (Acyclic Graph):沒有迴圈的圖形 樹 (Tree):聯通
15、的無迴圈圖 圖形G=(V, E), V是頂點所成的集合, E是邊所成的集合,p20-33,最小擴展樹(cont.),圖形G=(V, E)的擴展樹T=(V, E)是包括所有G的頂點的樹,其中E是E的子集合。 例如圖(a)及(b)都是右上圖的擴展樹,p20-34,最小擴展樹(cont.),擴展樹T=(V, E)的加權:集合E中所有的邊的加權的總和 例如圖(a)的擴展樹加權為1+3+5+7=16,而圖(b) 的擴展樹加權為1+2+3+6=12。 最小擴展樹問題:求出給定的聯通且加權的無向圖之最小擴展樹 圖形G的最小擴展樹就是 擁有最小加權的擴展樹 如圖(b)的擴展樹是 右上圖的最小擴展樹,p20-3
16、5,Kruskal演算法,Kruskal演算法:依據邊的加權由小到大的順序考慮該邊是否為最小擴展樹的邊 步驟1:將圖形G=(V, E)所有的邊依其加權由小到大排好,依序為e1, e2, e3, , em。 步驟2:建立圖形T=(V, E),其中 E = 。設i = 1。 步驟3:若ei加入圖形T中不產生迴圈,則將ei加入圖形T,即E= E ei ;否則,i = i + 1。 步驟4:若圖形T不是圖形G的擴展樹,則重複步驟3;否則,圖形T是圖形G的最小擴展樹,結束演算法執行。,p20-36,Kruskal演算法實例說明,p20-37,最短路徑問題 (Shortest Path Problem),
17、下圖是S、A、B、T四個地點的交通路線,各路線分別標上距離 令D(a,b)表示從a到b的最短路徑長度 可知D(S,T)=D(S,A)+D(A,B)+D(B,T)=10+15+20=45 利用貪婪策略就能得到答案,p20-38,最短路徑問題 (cont.),若要找下圖的D(S,T),則D(S,T)=24+20=44,此結果並不等於D(S,A)+D(A,B)+D(B,T)=45 以動態規劃策略找一般圖形的最短路徑,p20-39,20.4 動態規劃,個別擊破策略 是遞迴地將問題分成較小的問題後分別求得解答,然後合併這些部份答案成為完整的答案 由上至下 (Top-Down) 的計算策略 Fibonac
18、ci函數f(n):f(0)=0f(1)=1f(n) = f(n-1) + f(n-2),n 2,p20-40,以個別擊破策略計算f(5),過程如下圖所示 其中f(3)f(2)f(1)f(0)被重複計算許多次 如果能先依序將f(0)f(1)f(2)f(3)f(4)的結果計算出來,就可避免重複計算,增進計算速度。,p20-41,以個別擊破策略計算f(5)(cont.),以陣列FIB儲存Fibonacci函數利用下面的方法計算f(n):FIB(0)=0FIB(1)=1FOR I = 2 TO nFIB(I) = FIB(I-1) + FIB(I-2)NEXT I,p20-42,動態規劃 (Dynam
19、ic Programming)策略,將問題分成小問題然後直接解小問題將結果儲存起來以備之後使用 由下至上 (Bottom-Up) 計算策略,p20-43,二項式係數 (Binomial Coefficient),B(n,k)=n!/(k!(n-k)!) 當nk的值不小時難計算n!及k! 計算速度慢 B(n,k) = B(n-1,k-1)+B(n-1,k) if 0 k n1 if k=0 or k=n 以動態規劃策略計算之,p20-44,二項式係數(cont.),以動態規劃策略計算B(n,k) 令陣列BI是一個二維陣列有n+1個列(編號從0至n)k+1個欄(編號從0到k) 將B(n,k)的值儲
20、存於BI(n,k)內FOR I = 0 TO nFOR J = 0 TO mini,kIF J = 0 OR J = I THEN BI(I, J) =1ELSEBI(I, J)=BI(I-1,J-1)+BI(I-1,J)END IFNEXT JNEXT I,p20-45,有向圖的最短路徑問題 (Shortest Path Problem),找出在有向及非負加權的圖形上任兩頂點的最短路徑。 圓圈代表頂點 連接兩頂點的線稱為邊 每個邊都有方向也有對應的非負的加權 有向圖的路徑是一個頂點序列,其中序列裏每個頂點到其後一個頂點的邊一定存在 例如V1, V3, V2就是一條從頂點V1至頂點V2的路徑。
21、 路徑的長度為路徑上所有的邊的加權的和 例如路徑V1, V3, V2的長度為6+4=10。,p20-46,有向圖的最短路徑問題(cont.),假設圖形有n個頂點分別是V1, , Vn。 令dk(i,j)表示只有經過集合V1, V2, , Vk中某頂點的Vi到Vj的最短路徑長度 令d0(i,j)為Vi到Vj的邊的加權 經過集合V1, ,Vk中某些頂點的Vi到Vj最短路徑可能不經過Vk也可能經過Vk 如果不經過Vk則dk(i,j) = dk-1(i,j); 如果經過Vk,則dk(i,j) = dk-1(i,k)+dk-1(k,j) dk(i,j)=mindk-1(i,j), dk-1(i,k)+d
22、k-1(k,j),p20-47,有向圖的最短路徑問題(cont.),p20-48,有向圖的最短路徑問題(cont.),假設Vi到Vj的最短路徑經過Vk則Vi到Vk的路徑也是最短的路徑而Vk到Vj的路徑也是最短的。 例如由V2到V4的最短路徑為V2, V1, V4而路徑V2, V1也是V2到V1的最短路徑而路徑V1, V4也是V1到V4的最短路徑 最佳解包含其組成份子的最佳解之特性稱為最佳化原則 (Principle of Optimality) 如果最佳化問題能應用此最佳化原則則可以用動態規劃策略設計遞迴運算式來求得最佳解,p20-49,20.5 刪除與搜尋策略 (Prune-and-Sear
23、ch Method),包含多次的處理,每次的處理都會將輸入資料刪除固定的百分比,並運用同樣的方法遞迴地以刪除後的資料當作輸入資料重新解問題,經過若干次處理後,資料量將可縮小到能用固定常數的時間解得答案 Example:二元搜尋法的每個步驟能去除一半的資料,是典型的刪除與搜尋演算法,p20-50,刪除與搜尋策略(cont.),找出 n 個數的第 k 小的數 直接的解法:將這 n 個數由小到大排好後,然後就能依序找出第 k 小的數 O(nlog2n)時間。 刪除與搜尋策略:O(n)時間,p20-51,刪除與搜尋策略-範例,假設 n 為 5 的倍數 步驟 1 : 將此 n 個數,分成 n/5 個數堆
24、,每堆 5 個數。 步驟 2 :分別將各數堆排序。 步驟 3 :令 P 為數堆中間值的中間值。 步驟 4 :令 S1 為小於 P 的數所成的集合,S2為等於 P 的數所成的集合,S3為大於 P 的數所成的集合。 步驟 5 :若 S1 的元素個數大於或等於 K,則丟棄 S2及S3,並繼續利用本演算法找尋 S1 中的第 K 小的數。否則,如果S1 與 S2 的元素個數和大於或等於 K ,則 P 為第 K 小數;否則,令 K = K - |S1| - |S2| ,丟棄 S1及 S2,並繼續利用本演算法找尋 S3 中的第K小的數,p20-52,刪除與搜尋策略-範例(cont.),假設 n =25,經過
25、步驟 1 分成 25/5 =5 個數堆後的資料,p20-53,刪除與搜尋策略-範例(cont.),各數堆排序後,此時各數堆的中間值分別為 11 , 8 , 10 , 12 , 22 , 而 11 是這些數的中間值。,p20-54,刪除與搜尋策略-範例(cont.),將數堆位置調整後,左上角的矩形部份為 S1 和 S2,而右下角的矩形部份為 S2 和 S3,p20-55,刪除與搜尋策略-範例(cont.),步驟5可能丟棄S2及S3,或丟棄S1及S2, 被丟棄的資料至少為n/4個數 每執行一次此演算法,資料將只剩下n-(n/4) = 3n/4個數。 令T(n)表示此演算法在n個數中找第k小的數所需
26、的時間 T(n) = T(3n/4) + O(n) 步驟1至步驟4需O(n)時間 得T(n) = O(n) 刪除與搜尋策略能應用於如雙變數的線性規劃問題、單中心問題等計算幾何問題。,p20-56,20.6 課後練習,以快速排序法完成下列0個數的排序: 10, 21,5,31,42,24,90,50,15,2。 假設有面額元、元、元及元郵票。若某郵件需元的郵資,為了讓郵票張數最少,請問這些面額的郵票各需幾張? (提示:貪婪策略) 分別以O、階次表示下列各函數: 0.001n2 + n n + log2n 2n + nlog2n,p20-57,20.6 課後練習(cont.),請以動態規劃演算法找
27、出下圖任兩頂點的最短路徑:,p20-58,20.6 課後練習(cont.),請以刪除與搜尋演算法找出下列25個數的第10小的數: 25,50,1,10,31,55,97,87,101,32 40,21,75,41,60,34,63,15,86,11 47,33, 74,81,44。,p20-59,設背包限重,有A,B,C三件可分解的物件,其資料如下表:請問應如何將物件放入背包以獲得最大利益?若將習題4的圖形視為無向圖,請問此無向圖的最小擴展樹為何?,20.6 課後練習(cont.),p20-60,20.7 欲罷不能,Brassard and Bratley, Fundamentals of A
28、lgorithmics, Prentice-Hall, 1996. Cormen, Leiserson and Rivest, Introduction to Algorithms, MIT Press, 2000. Horowitz, Computer Algorithms in C+, 1998. Lee, Tseng, Chang and Tsai, Introduction to Design and Analysis of Algorithms (2nd Ed.), Flag Publishing (旗標), 2002。 Neapditan and Naimipour, Foundations of Algorithms, D.C. Heath and Company, 1996.,