演算法复杂度分析范例课件.ppt
《演算法复杂度分析范例课件.ppt》由会员分享,可在线阅读,更多相关《演算法复杂度分析范例课件.ppt(101页珍藏版)》请在三一办公上搜索。
1、1 認識演算法,從食譜到高階程式語言,1.1 演算法名稱的由來,2,阿布迦法穆罕默德賓穆薩阿爾-可瓦里茲米,演算法(Algorithm)一詞源自一位的阿拉伯數學家:阿布賈法穆罕默德賓穆薩阿爾可瓦里茲米(Abu Jafar Muhammad ibn Musa al-Khwarizmi)(780 850 A.D.)的拉丁文譯名(al-Khwarizmi)。,3,阿爾-可瓦里茲米(al-Khwarizmi),阿爾可瓦里茲米將印度所發明的十進位數字記號傳入阿拉伯地區,而阿拉伯商人在經商時則將十進位數字記號傳入歐洲成為現今我們使用的數字記號。更重要的是,阿爾可瓦里茲米著有一本討論有系統地解決一次方程式(
2、linear equation)及一元二次方程式(quadratic equation)的書籍,此書被翻譯成名為”Liber algebrae et almucabala”的拉丁文書籍,啟發了代數學的萌芽,對人類的現代科技與文明發展有相當深遠的影響。代數學的英文名稱 Algebra 就是源自於此書之書名。,4,阿爾-可瓦里茲米(續)(al-Khwarizmi),阿爾可瓦里茲米以一步一步(step by step)的方式,描述算術(arithmetic)運算與一元二次方程式及某些一次方程式的解答過程。稍後我們會知道,這些一步一步描述的解答過程就是我們現今所定義的演算法。這就是為什麼演算法(alg
3、orithm)的名稱是源自於阿爾可瓦里茲米(al-Khwarizmi)的原因。以下我們展示 一元二次方程的解法描述:,5,一元二次方程解法描述,關於解開 x 的方程 ax2+bx=c 的解法,6,1.2 什麼是演算法?,7,什麼是演算法?,廣義的說,演算法是解決某一問題的一步一步程序(a step-by-step procedure for solving a problem)-Merriam-Webster Dictionary狹義的說,演算法是一個由一些步驟所構成的集合,依循這些步驟得以解決數學問題或完成計算機進程(a set of steps that are followed in o
4、rder to solve a mathematical problem or to complete a computer process)-Merriam-Webster Dictionary,8,食譜(recipe)是演算法,9,出處:嘉義市政府衛生局網頁(http:/www.cichb.gov.tw/other/bus_detail.asp?bus_dtl_id=1066),流程圖(flowchart)是演算法,10,其他廣義演算法的例子,企業組織的標準作業程序(Standard Operating Procedure,SOP)也是演算法工作人員面對特定問題時,只要按照步驟指示一步一步
5、進行就能解決問題設備的使用手冊(manual)或故障排除手冊也包含許多演算法因為它包含許多可以用於解決某一問題(例如,如何安裝新設備及解決印表機的卡紙問題等)的一步一步程序。,11,演算法計算角度的嚴謹定義,演算法(algorithm):由有限(finite)步驟(step)所構成的集合,依照給定輸入(input)依序執行每個明確(definite)且有效(effective)的步驟,以便能夠解決特定的問題;而步驟的執行必定會終止(terminate),並產生輸出(output)。,12,演算法的特性,根據演算法計算角度的嚴謹定義,演算法是由解決某一特定問題的步驟所組成,具有以下特性:指定輸入
6、(input):演算法必須指定輸入,可以由外界輸入0 個、1 個或多個資料。具有輸出(output):演算法必定有至少1 個以上的輸出。有限性(finiteness):演算法步驟的個數必須是有限的,而且步驟的執行最後會終止(terminate)。明確性(definiteness):演算法的每個步驟都必須是明確(definite)而不含糊的(unambiguous)。有效性(effectiveness):演算法的每個步驟必須是有效的(effective)或說是可行的(feasible)。,13,演算法的特性(續),演算法必須指定輸入我們有時會透過介面(例如鍵盤)由外界獲得問題輸入,有時也會將輸入
7、直接寫在演算法中。因此演算法可以由外界輸入0 個、1 個或多個資料。演算法必須要有一個以上的輸出如此演算法才能為人們所用。演算法必須滿足有限性(finiteness)它的步驟個數必須是有限的,而且步驟的執行最後會終止(terminate);如此,演算法才有可能在執行有限步驟之後終止並產生輸出為人們所用。,14,演算法的特性(續),演算法必須滿足明確性(definiteness),也就是說它的每一個步驟必須是明確(definite)而不含糊的(unambiguous)。例如,若有一個步驟是加6 或7 到變數x,則這個步驟是不明確的,因為我們可能加6 也可能加7 到變數x 中但是,加亂數生成器(r
8、andom number generator)函數的值到變數x則是明確的步驟,因為我們可以很明確地將亂數產生器函數的值加到變數x又例如,計算5/0是不明確的,因為分母(除數)為0 是沒有明確定義的計算。,15,演算法的特性(續),演算法必須滿足有效性(effectiveness),也就是說演算法的每個步驟必須是有效的(effective)或說是可行的(feasible)每個步驟即使由人們拿著紙筆,都可以在有限時間內計算出結果。例如,步驟計算出2 完全無誤差的值不滿足有效性,因為它是不可行的,我們需要進行無窮位數的計算才可以得到 2 完全無誤差的值。相反的,計算2 到小數點以下10 位,並捨棄其
9、後位數則滿足有效性,因為它是可行的,人們即使只是藉由紙筆,都可以計算出2=1.4142135623 的結果。,16,1.3 演算法的例子,17,解決正整數m是不是正整數n的倍數問題的流程圖,18,解決正整數m是不是正整數n的倍數問題的C+程式,19,一個既不會終止,也不產生輸出的C程式 不是演算法,20,1.4 如何表示演算法?,21,演算法的表示,一般我們使用以下方式來表示演算法:自然語言(中文或英文等語言)流程圖(flow chart)虛擬碼(pseudo code)以下我們舉一個古老的演算法 歐幾里德演算法(Euclid Algorithm)為例子,說明如何以上列三種方式表示演算法。,2
10、2,歐幾里德演算法(輾轉相除法),歐幾里德演算法大約在西元前300年由希臘數學家歐幾里德提出,可用於求出二個整數的最大公因數(GCD,Greatest Common Divisor),又稱為輾轉相除法。,23,歐幾里德演算法(Euclid Algorithm)以自然語言表示,24,歐幾里德演算法(Euclid Algorithm)以流程圖表示,25,ANSI流程圖符號,26,ANSI流程圖符號(續),27,歐幾里德演算法(Euclid Algorithm)以虛擬碼表示,28,虛擬碼(Pseudo Code),虛擬碼以一種混雜著自然語言與高階程式語言結構的方式來描述演算法。可以達到簡潔易讀、容易
11、分析,而且也容易轉換為高階程式語言的目的。以下我們介紹本課程所採用的虛擬碼撰寫規則,因為虛擬碼仍然具有自然語言性質,因此這些撰寫規則有時可以稍稍調整,以方便閱讀者理解為原則。,29,虛擬碼(Pseudo Code)(續),虛擬碼撰寫規則如下:演算法名稱及參數:以 Algorithm 演算法名稱(參數 1,參數 2,)來列出演算法名稱並指明其輸入參數。輸入:以 Input 輸入描述 來進行輸入說明輸出:以 Output 輸出描述 來進行輸出說明,30,虛擬碼(Pseudo Code)(續),設定:以 表示,可以將一個算式(expression)的值指定給某一個變數(置入某變數中)算術運算:以+/
12、%表示加、減、乘、除、模(除法求餘數)運算,31,虛擬碼(Pseudo Code)(續),比較與邏輯運算:以=表示等於、大於、小於、大於等於、小於等於及不等於的運算,並使用 表示邏輯的且、或與反向的運算。決策結構:以 if 條件 then 條件為真的動作 else 條件為偽的動作 end if 來表示。當條件成立時,演算法執行所有包含在條件為真的動作的所有指令(步驟);反之則執行所有包含在條件為偽的動作的所有指令。,32,虛擬碼(Pseudo Code)(續),while 迴圈:以 while 條件 do 迴圈動作 end while 來表示。當條件成立時,演算法會重複執行所有包含在迴圈動作的
13、所有指令;反之則離開迴圈,進入下一個指令。for 迴圈:以 for 迴圈變數變動之範圍及其變動方式do 迴圈動作 end for 來表示。當迴圈變數的值在指定的範圍中時,演算法會重複執行所有包含在迴圈動作的所有指令;反之則離開迴圈,進入下一個指令。,33,虛擬碼(Pseudo Code)(續),陣列元素索引:以 陣列名稱 i 代表命名為陣列名稱的陣列索引(index)為 i 的元素,一個有 n 個元素的陣列,其元素索引值為 0,1,n-1演算法呼叫:以 演算法名稱(參數)來表示演算法的呼叫演算法返回:以 return 返回值 來代表演算法結束執行並輸出返回值。,34,1.5 如何實作演算法?,
14、35,演算法的實作(implementation),除了以自然語言、流程圖、虛擬碼表示演算法之外,我們也可以使用高階程式語言(high level programming language)來表示演算法。當我們以高階程式語言表示演算法時,我們可以在電腦上直接執行以高階程式語言編寫而成的程式,並藉此得到執行結果。我們特別將之稱為以高階程式語言實作(implement)演算法,或是稱為以高階程式語言進行演算法的實作(implementation)。,36,演算法的實作(implementation)(續),以下我們將舉例說明使用C、C+、Java 與Python 語言實作歐幾里德演算法,或稱為歐幾
15、里德GCD(Euclid GCD)演算法。建議使用Jeep5軟體進行C、C+、Java 與Python 語言的編輯、編譯與執行。Jeep5 為Java Editor for Chinese Programmer v5.0 的簡稱,是由江振瑞教授使用Java 語言所編寫的整合開發環境(Integrated Development Environment,IDE)軟體,支援C、C+、Java 與Python 四種語言,並透過簡潔的中文介面,讓使用者輕易完成四種不同語言程式的編輯、編譯與執行等工作。請參考本單元後的Jeep5補充資料以獲得Jeep5詳細的資訊。,37,演算法的實作(implement
16、ation)(續),因為演算法有指定輸入的特性,因此演算法僅處理特定的輸入。例如,剛剛提過的歐幾里德演算法指定輸入二個正整數m及n。當然,當我們以高階程式語言實作演算法,讓使用者特過輸入介面由外界傳入演算法輸入時,可能會輸入錯誤的資料(例如輸入負數)。本課程聚焦於演算法解決問題的核心概念,因而假設所有的輸入都符合演算法的指定,所以在實作演算法時不處理使用者輸入錯誤資料的狀況。,38,演算法的實作(implementation)(續),在實務上,若我們將符合演算法指定的輸入資料以文字檔案形式儲存,並以作業系統之輸入轉向(redirect)方式將文字檔案資料直接輸入高階程式語言程式中,則所有的輸入
17、都會符合演算法的指定。基本上,著名的計算機協會國際大學生程式設計競賽(Association of Computing Machinery International Collegiate Programming Contest,簡稱 ACM ICPC)就是採取上述的方法作為高階語言程式的輸入方式以進行比賽。ACM ICPC是一個試煉各種演算法實作的好場合,國際間也有許多團體提供相關的ICPC訓練教學網站(例如,UVa Online Judge)與ICPC賽事裁判系統(例如,PC2(Programming Contest Control)系統)。請參考本單元後的補充資料以獲得ACM ICPC詳
18、細的資訊。,39,以C程式語言實作歐幾里德GCD演算法,40,下列的C語言程式EuclidGCD.c以int EuclidGCD(int m,int n)函式或函數(function)實作歐幾里德演算法。並在主要函式main()中加入標準輸入(printf(.)與標準輸出(scanf(.)敘述,並呼叫EuclidGCD方法,讓演算法可以由外部輸入訊息,並輸出計算結果。,以C程式語言實作歐幾里德GCD演算法執行結果,41,實作展示:以Jeep5編輯、編譯及執行執行結果:,以C+程式語言實作歐幾里德GCD演算法,42,下列的C+語言程式EuclidGCD.cpp以int EuclidGCD(int
19、 m,int n)函式實作歐幾里德演算法。並在主要函式int main()中加入標準輸入(cin.)與標準輸出(cout.)敘述,並呼叫EuclidGCD方法,讓演算法可以由外部輸入訊息,並輸出計算結果。,以C+程式語言實作歐幾里德GCD演算法執行結果,43,實作展示:以Jeep5編輯、編譯及執行執行結果:,以Java程式語言實作歐幾里德GCD演算法,44,下列的Java語言程式EuclidGCDClass1.java以方法(method)static int EuclidGCD(int m,int n)實作了歐幾里德演算法。並在主類別EuclidGCDClass1中的主要方法public s
20、tatic void main()中加入標準輸入(Scanner Cin=new Scanner(System.in);.Cin.nextInt()與標準輸出(System.out.print(.)敘述,並呼叫EuclidGCD方法,讓演算法可以由外部輸入訊息,並輸出計算結果。,以Java程式語言實作歐幾里德GCD演算法執行結果,45,實作展示:以Jeep5編輯、編譯及執行執行結果:,以Java程式語言實作歐幾里德GCD演算法(續),46,下列的Java語言程式EuclidGCDClass2.java與EuclidGCDClass1.java類似,但是採用視窗輸入(JOptionPane.sh
21、owInputDialog(.)與視窗輸出(JOptionPane.showMessageDialog(.)敘述,讓演算法可以由外部輸入訊息,並輸出計算結果。另外,程式EuclidGCDClass2.java也善用Java語言支援UTF-8字元編碼的國際化特性,使用中文來替變數命名。這樣做有一個好處,當讀者看到程式中出現中文的變數名稱時,就可以知道這是由使用者自行命名的,而英文的部份則很清楚的是語言的關鍵字或是語言系統中內建的類別。,以Java程式語言實作歐幾里德GCD演算法執行結果(續),47,實作展示:以Jeep5編輯、編譯及執行執行結果:,以Python程式語言實作歐幾里德GCD演算法,
22、48,下列的Python語言程式EuclidGCD.py以EuclidGCD(m,n)方法實作歐幾里德演算法。並以標準輸入(raw_input(.)與標準輸出(print(.)敘述由外部輸入訊息及輸出計算結果。,以Python程式語言實作歐幾里德GCD演算法執行結果,49,實作展示:以Jeep5編輯及執行執行結果:,1.6 演算法的正確性與效能,50,演算法的正確性與效能,一個演算法一定要能夠產生正確的結果,也就是滿足正確性(correctness),如此演算法才能夠為人們所用。我們可以透過一些證明的技術,如歸納法(induction)或矛盾法(contradiction)等來證明演算法的正確
23、性。演算法的正確性無疑的是演算法最重要的特性,然而因為課程時間有限,我們有時不會特別說明演算法的正確性證明。請大家自行參考文獻資料以獲得演算法的正確性證明。,51,演算法的正確性與效能(續),除了演算法的正確性之外,我們也關心演算法的效能(efficiency),也就是討論演算法是否能夠使用較少資源而有效率地執行。演算法執行時使用的資源有:時間資源記憶體資源網路頻寬資源(當演算法需要透過網路傳輸資料時)邏輯閘資源(當演算法使用邏輯閘實作時)在本課程我們聚焦於討論演算法執行時使用的時間資源與記憶體資源。,52,演算法的正確性與效能(續),若我們能夠將所有的演算法以相同的高階程式語言實作,並在相同
24、條件下於相同的電腦上執行,則我們似乎可以利用高階程式語言程式的執行時間與執行時所佔用的記憶體空間來衡量被實作演算法的效能。不過,這太不實際了,而且藉由這個方式我們也難以直接看出演算法效能與演算法輸入規模(input size)的關係。我們需要其他更具學理基礎,而且更容易分析與比較的方式來衡量演算法的效能,53,演算法的正確性與效能(續),在學理上,我們使用:時間複雜度(time complexity)空間複雜度(space complexity)來分析演算法的執行時間與佔用的記憶體空間。以下我們先說明演算法的時間複雜度概念,而演算法空間複雜度則是類似的概念,我們在稍後演算法複雜度分析範例時會一
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 演算法 复杂度 分析 范例 课件
链接地址:https://www.31ppt.com/p-3958899.html