Presentation is loading. Please wait.

Presentation is loading. Please wait.

Data Structure in C ─ 演算法分析. 1 大綱 基本概念 演算法 效率評估 效率分析 效率估計.

Similar presentations


Presentation on theme: "Data Structure in C ─ 演算法分析. 1 大綱 基本概念 演算法 效率評估 效率分析 效率估計."— Presentation transcript:

1 Data Structure in C ─ 演算法分析

2 1 大綱 基本概念 演算法 效率評估 效率分析 效率估計

3 2 基本概念 需求 所有大的程式都以一些定義專案目的規格書開始  會獲 得輸入與輸出資訊 分析 可以由下而上分析或由上而下分析 設計 設計者從程式所需要的資料物件和資料的運算來設計系 統 資料物件:可產生抽象資料型態 資料運算:需要演算法的規格並考量演算法的設計策略 抽象資料型態與演算法的規格是相互獨立的,我們可暫 時不考慮實作的因素

4 3 基本概念 ( 續 ) 改良和編碼 在這個階段,我們為每一個資料物件選擇表 示法,並編寫它的各種運算之演算法 驗證 這個階段包括程式正確性的驗證,以不同的 輸入資料測試程式,並改正錯誤

5 4 演算法 定義:演算法 (algorithms) 是一組有限的指令,根 據這些指令,可以完成一項特定的工作。此外, 所有的演算法需符合下列的條件: 輸入:可以沒有或從外部提供多個資料 輸出:至少產生一個結果 明確的:每一個指令都很明白且沒有混淆不清 有限的:如果追蹤一個演算法指令,演算法會在有限 的步驟之後停止 有效率的:每個運算即使都如 “ 明確性的 ” 定義,但仍是 不夠的,演算法必須是一個可行的運算 定義:演算法是一個解決問題的有限步驟程序, 也可以說是產生解答中一步一步的的程序

6 5 效率評估 對於一個程式而言,我們除了需要了解 是否符合原始規格 是否正確執行 是否有文件說明,以解釋如何使用與操作 是否有效率應用函數建立邏輯單元 是否易於閱讀 要考量程式能否有效率地使用記憶體 程式的執行時間是否可接受

7 6 效率評估 ( 續 ) 效率評估方法 效率分析 (performance analysis) 著重於獲得和機器無關的估計時間和空間 以複雜度理論 (complexity theory) 為核心,又可分 為空間複雜度 (space complexity) 與時間複雜度 (time complexity) 效率估計 (performance measurement) 利用獲得與機器相關的執行時間,以找尋出沒有 效率的程式片段

8 7 效率分析 空間複雜度 一個程式的空間複雜度是取決於執行程式所需 的記憶體空間 程式所需的空間為下列兩項的和 固定的空間需求 固定空間需求包括指令空間 ( 用以儲存程式碼的空間 ) ,用來 存簡單變數,固定大小的結構變數和常數空間 可變的空間需求 包含了所有要解決問題中所有相關的結構化變數所需要的 空間  還包含當函數採用遞迴方式呼叫時所需的空間  最 常用的特性包括數量、大小及輸入與輸出值

9 8 效率分析 ( 續 ) 時間複雜度 一個程式的時間複雜度是取決於執行程式所需 的計算時間 程式所需的時間為下列兩項的和 編譯時間 類似固定的空間項目。此外,一旦程式可以正確執行,我 們可以多次執行而不必再從新編譯 執行時間 執行時間的估算並不十分容易,常見的有利用系統時間來 計算程式時間或利用程式運算的次數來評量 時間複雜度較常為人們所使用

10 9 效率分析 ( 續 ) 程式的時間複雜度是以用來執行函數的程式所發 生的步驟數目來表示 步驟數目是受測程式特性 ( 輸入的數目、輸出的數目、 輸入與值出之值等 ) 的集合函數 使用者可依其想了解的部份,以步驟數目估算時間複 雜度 Ex. 想知道當輸入資料量增加時,計算時間增加的程度為何? Ex. 對不同的程式,我們想知道當輸入的值增大時,計算時 間如何增加? 輸入的 資料量 函數計 算之 輸入值的函 數計算之

11 10 效率分析 ( 續 ) 使用者必需先選擇相關的特性,以做為估算步驟的依據  步驟是與特性無關的計算單元 Ex.10 個加法是一個步驟 Ex.100 個加法也是一個步驟 在某些情況下單純只依特性來計算步驟數目並不一定準 確 Ex. 利用 binary search 找尋特定數字,而估算方式是依參數數目, 但估算過程可能依數字所在的位置而有很大的差異,故步驟的 估算會有很大的誤差。 三種步驟計數 最佳狀況:步驟計算是對指定的參數所執行的最少步驟數 最差狀況:步驟計算是對指定的參數所執行的最多步驟數 平均值:步驟計算是以指定的參數在實體上執行的平均步驟數

12 11 效率分析 ( 續 ) 步驟估算方式 Ex. 陣列元素相加乃將陣列中每一元素的值加總起來 int sum(int arr[], int n) { int i, total=0; for (i=0;i<n; i++) total+=arr[i]; return total; } 步驟計數 1 n+1 n 1 2n+3

13 12 效率分析 ( 續 ) Ex. 陣列的相加表示將相對應的元素相加 void add(int a[][], int b[][], int c[][], int rows, int cols) { for (int i=0;i<rows; i++) for (int j=0;j<cols;j++) c[i][j] = a[i][j] + b[i][j]; } 步驟計數 rows+1 rows*cols+rows rows*cols 2rows*cols+2rows+1

14 13 效率分析 ( 續 ) 漸近式表示法 (Asymptotic Notation) 決定步驟計數的目標是為了能夠比較相同函數 的兩個程式的時間複雜度,及預測當程式特性 改變時,執行時間增長的情形 當步驟所代表的概念不明確 (x=y 和 x=y+z+(x/y)+(x*y*z-x/z) 都算是一個步驟 ) ,耗費 大量精神來決定精確的步驟計數是不值得做的 大多數情況下,只要可以構成一個敍述,如 c 1 n 2 T p (n) c 2 n 2 或 T Q (n,m)=c 1 n+c 2 m ,其中 c 1 和 c 2 為非 負之常數,就足夠表示了

15 14 效率分析 ( 續 ) 若我們有兩個程式 c 1 n 2 +c 2 n 與 c 3 n 在 n 夠大的情況,複雜度 c 3 n 的程式將比複雜度為 c 1 n 2 +c 2 n 的程式快速 對於小的 n 而言,任一程式都可能比另一個快 ( 視 c 1, c 2 及 c 3 而定 ) 。 若 c 1 =1, c 2 =2, c 3 =100 ,則 c 1 n 2 +c 2 n c 3 n ,當 n 98 ,則 c 1 n 2 +c 2 n > c 3 n 不論 c 1, c 2 及 c 3 之值為何,總有一個 n 值使得複 雜度為 c 3 n 的程式比複雜度為 c 1 n 2 +c 2 n 的程式快速  這個 n 就稱為損益點 ( 估算 )

16 15 效率分析 ( 續 ) 術語介紹 O(n) : f(n)=O(g(n)) ,若且唯若存在一正整數 c 及 n 0 , 使得 f(n) cg(n) ,對所有的 n , n n 0 (Big-O)  敍述 f(n)=O(g(n)) 僅陳述 g(n) 是當 n n 0 時函數 f(n) 之值的上 限,但未說出上限好到何種程度。所以 O(n 2 ), O(n 3 )… 都足以表達  為使其更具意義,在下結論說 f(n)=O(g(n)) 時, g(n) 必須是最小函數, n 0 為其上限 Ω(n) : f(n)= Ω(g(n)) ,若且唯若存在一正整數 c 及 n 0 , 使得 f(n) cg(n) ,對所有的 n , n n 0  對於 f(n)= Ω(g(n)) 而言,它暗示了當敍述 f(n)= Ω(g(n)) 時, g(n) 應是最大函數, n 0 為其下限

17 16 效率分析 ( 續 ) Θ(n) : f(n)= Θ(g(n)) ,若且唯若存在正整數 c 1 、 c 2 及 n 0 ,使得 c 1 g(n) f(n) cg 2 (n) ,對所有的 n , n n 0  Θ(n) 比 O(n) 和 Ω(n) 兩者都準確  g(n) 同時是 f(n) 的上 限和下限 O(n)Ω(n)

18 17 效率分析 ( 續 ) Big-O 的類別 O(1) :常數時間 O(log n) :對數時間 O(n) :線性時間 O(n log n) :對數線性時間 O(n 2 ) :平方時間 O(n 3 ) :立方時間 O(2 n ) :指數時間 O(n!) :階層時間 O(n n ) : n 的 n 次方時間 效率 優 差

19 18 效率分析 ( 續 ) Ex. 陣列的相加表示將相對應的元素相加 void add(int a[][], int b[][], int c[][], int rows, int cols) { for (int i=0;i<rows; i++) for (int j=0;j<cols;j++) c[i][j] = a[i][j] + b[i][j]; } 步驟計數 Θ(rows) Θ(rows*cols) 方法一:將每 行程式的漸近 式複度相加即 可 方法二:取得 最大的指令複 雜度

20 19 效率估計 雖然效率分析在確認一個演算法的空間和時 間複雜度上提供一個強大的工具,但有些時 候,我們仍然需要考慮演算法如何在我們機 上執行 時間的計算可利用 C 語言所提供的指令

21 20 效率估計 ( 續 ) μs=microsecond=10 -6 seconds ms=millisecond=10 -3 seconds


Download ppt "Data Structure in C ─ 演算法分析. 1 大綱 基本概念 演算法 效率評估 效率分析 效率估計."

Similar presentations


Ads by Google