34
Chapter 1 Chapter 1 演演演演演 演演演演演 1.1 1.1 演演演 演演演 1.2 Big-O 1.2 Big-O

Chapter 1 演算法分析

  • Upload
    emilie

  • View
    88

  • Download
    0

Embed Size (px)

DESCRIPTION

Chapter 1 演算法分析. 1.1 演算法 1.2 Big-O. 演算法分析 演算法是解決一問題的有限步驟,而評斷演算法的優劣可利用 Big-O 分析之,如 O(n) 比 O(n 2 ) 來得佳。. 1.1 演算法. 演算法( Algorithms )是一解決問題( problems )的有限步驟程序。 舉例來說,現有一問題為:判斷數字 x 是否在一已排序好的數字串列 s 中,其演算法為: 從 s 串列的第一個元素開始,依序的比較,直到 x 被發現或 s 串列已達盡頭。假使 x 被找到,則印出 Yes ;否則,印出 No 。. 1.1 演算法. - PowerPoint PPT Presentation

Citation preview

Page 1: Chapter 1   演算法分析

Chapter 1 Chapter 1 演算法分析演算法分析

1.1 1.1 演算法演算法 1.2 Big-O1.2 Big-O

Page 2: Chapter 1   演算法分析

資料結構 - 使用 C 語言 2

演算法分析演算法分析 演算法是解決一問題的有限步驟,而評

斷演算法的優劣可利用 Big-O 分析之,如 O(n) 比 O(n2) 來得佳。

Page 3: Chapter 1   演算法分析

資料結構 - 使用 C 語言 3

1.11.1 演算法演算法 演算法( Algorithms )是一解決問題

( problems )的有限步驟程序。 舉例來說,現有一問題為:判斷數字 x

是否在一已排序好的數字串列 s 中,其演算法為:從 s 串列的第一個元素開始,依序的比較,直到 x 被發現或 s 串列已達盡頭。假使 x 被找到,則印出 Yes ;否則,印出 No 。

Page 4: Chapter 1   演算法分析

資料結構 - 使用 C 語言 4

1.11.1 演算法演算法 當問題很複雜時,上述敘述性的演算法

就難以表達出來。因此,演算法大都以類似的程式語言表達之,繼而利用您所熟悉的程式語言執行之。

Page 5: Chapter 1   演算法分析

資料結構 - 使用 C 語言 5

1.11.1 演算法演算法 ““ 他的程式寫得比我好嗎?”他的程式寫得比我好嗎?” 應該利用客觀的方法進行比較,而此客

觀的方法就是複雜度分析( complexity analysis )。

首先必須求出程式中每一敘述的執行次數(其中{和}不加以計算),將這些執行次數加總起來。然後求出其 Big-O 。

Page 6: Chapter 1   演算法分析

資料結構 - 使用 C 語言 6

1.11.1 演算法演算法 陣列元素相加( Add array members )

Page 7: Chapter 1   演算法分析

資料結構 - 使用 C 語言 7

1.11.1 演算法演算法 矩陣相乘( Matrix Multiplication )

Page 8: Chapter 1   演算法分析

資料結構 - 使用 C 語言 8

1.11.1 演算法演算法

Page 9: Chapter 1   演算法分析

資料結構 - 使用 C 語言 9

1.11.1 演算法演算法 循序搜尋( Sequential search )

Page 10: Chapter 1   演算法分析

資料結構 - 使用 C 語言 10

1.11.1 演算法演算法 二元搜尋( Binary search )

Page 11: Chapter 1   演算法分析

資料結構 - 使用 C 語言 11

1.11.1 演算法演算法 費氏數列(遞迴的片段程式)

Page 12: Chapter 1   演算法分析

資料結構 - 使用 C 語言 12

1.11.1 演算法演算法 費氏數列(非遞迴的片段程式)

Page 13: Chapter 1   演算法分析

資料結構 - 使用 C 語言 13

1.21.2 Big-O Big-O 如何去計算演算法所需要的執行時間呢?

在程式或演算法中,每一敘述( statement )的執行時間為: 此敘述執行的次數, 每一次執行所需的時間,兩者相乘即為此敘

述的執行時間。 由於每一敘述所須的時間必需實際考慮

到機器和編譯器的功能,因此通常只考慮執行的次數而已。

Page 14: Chapter 1   演算法分析

資料結構 - 使用 C 語言 14

1.21.2 Big-O Big-O 下列有三個片段程式,請計算 x=x+1 的

執行次數:

Page 15: Chapter 1   演算法分析

資料結構 - 使用 C 語言 15

1.21.2 Big-O Big-O 在分析演算法時,一般稱敘述的執行次

數為 order of magnitude ,所以上述的(a) 、 (b) 、 (c) 中, x=x+1 的 order of magnitude 分別為 1 , n , n2 。

而整個演算法的 order of magnitude 為演算法中每一敘述的執行次數之和。

Page 16: Chapter 1   演算法分析

資料結構 - 使用 C 語言 16

1.21.2 Big-O Big-O 算完程式敘述的執行次數後,通常利用

Big-O 來表示此演算法執行的時間。

Page 17: Chapter 1   演算法分析

資料結構 - 使用 C 語言 17

1.21.2 Big-O Big-O 請看下列範例:

3n+2=O(n) ,∵我們可找到 c=4 , n0=2 ,使得 3n+2<4n

10n2+5n+1=O(n2) ,∵我們可以找到 c=11 , n0=6 ,使得 10n2+5n+1<11n2

7*2n +n2+n=O(2n) ,∵我們可以找到 c=8 , n0=4 ,使得 7*2n+n2+n<8*2n

10n2+5n+1=O(n3) ,原來 10n2+5n+1 O(n2) ,而 n3 又大於 n2 ,理所當然 10n2+5n+1=O(n3) 是沒問題的。

Page 18: Chapter 1   演算法分析

資料結構 - 使用 C 語言 18

1.21.2 Big-O Big-O 其實,我們可以加以證明,當

f(n)=amnm +...+a1n+a0 時, f(n)=O(nm)

Page 19: Chapter 1   演算法分析

資料結構 - 使用 C 語言 19

1.21.2 Big-O Big-O 循序搜尋( sequential search )的情形

可分,其平均搜尋到的次數為

Page 20: Chapter 1   演算法分析

資料結構 - 使用 C 語言 20

1.21.2 Big-O Big-O 二元搜尋法乃是資料已經皆排序好,因

此由中間( mid )開始比較,便可知欲搜尋的資料( key )落在 mid 的左邊還是右邊,再將左邊的中間拿出來與 key相比,只是每次要調整每個段落的起始位址或最終位址。

Page 21: Chapter 1   演算法分析

資料結構 - 使用 C 語言 21

1.21.2 Big-O Big-O

Page 22: Chapter 1   演算法分析

資料結構 - 使用 C 語言 22

1.21.2 Big-O Big-O 搜尋的次數為 log32+1=6 ,此處的 log 表示 lo

g2 。資料量為 128 個時,其搜尋的次數為 log1

28+1 ,因此當資料量為 n 時,其執行的次數為 logn+1 。

Page 23: Chapter 1   演算法分析

資料結構 - 使用 C 語言 23

1.21.2 Big-O Big-O 讀者大略可知二元搜尋比循序搜尋好得

太多了,其執行敘率為 O(logn) 。 費氏數列( Fibonacci number ),其定

義如下:

Page 24: Chapter 1   演算法分析

資料結構 - 使用 C 語言 24

1.21.2 Big-O Big-O

Page 25: Chapter 1   演算法分析

資料結構 - 使用 C 語言 25

1.21.2 Big-O Big-O

Page 26: Chapter 1   演算法分析

資料結構 - 使用 C 語言 26

1.21.2 Big-O Big-O

Page 27: Chapter 1   演算法分析

資料結構 - 使用 C 語言 27

1.21.2 Big-O Big-O 當 n=3(f3) 從上圖可知需計算的項目為 5 ; n=

5 時,需計算的項目數為 15 個。因此我們可以下列公式表示:

Page 28: Chapter 1   演算法分析

資料結構 - 使用 C 語言 28

1.21.2 Big-O Big-O

Page 29: Chapter 1   演算法分析

資料結構 - 使用 C 語言 29

1.21.2 Big-O Big-O 上述費氏數列是以遞迴的方式算出,其

Big-O 為 O(2n/2 ) ,若改以非遞迴方式計

算的話,其 f(n) 執行的項目為 n+1 項。 從上表得知,計算費氏數列若採用遞迴

方法並不太適合,所以並不是所有的問題皆適合利用遞迴法,有關遞迴的詳細情形,請參閱第五章。

Page 30: Chapter 1   演算法分析

資料結構 - 使用 C 語言 30

1.21.2 Big-O Big-O Big-O 的圖形表示如下:

Page 31: Chapter 1   演算法分析

資料結構 - 使用 C 語言 31

1.21.2 Big-O Big-O 例如有一程式的執行次數為 n2+10n ,則其 Bi

g-O 為 n2 ,表示此程式執行的時間最壞的情況下不會超過 n2 ,因為

n2+10n 2n≦ 2 ,當 c=2 , n 10≧ 時

Page 32: Chapter 1   演算法分析

資料結構 - 使用 C 語言 32

1.21.2 Big-O Big-O 一般常見的 Big-O 有下列幾種情形:

O(1) 稱為常數時間( constant ) O(log n) 稱為次線性時間( sub-linear ) O(n) 稱為線性時間( linear ) O(n log n) 稱為 n logn n O(n2) 稱為平方時間( quadratic ) (n3) 稱為立方時間( cubic ) O(2n) 稱為指數時間( exponential ) O(n!) 稱為階層時間

Page 33: Chapter 1   演算法分析

資料結構 - 使用 C 語言 33

1.21.2 Big-O Big-O O(1)<O(log n) <O

(n)<O(n log n) <O(n2)<O(n3)<O(2n)<O(3n)<O(n!) ,可由圖 1-1 或圖 1-2 得知。

Page 34: Chapter 1   演算法分析

資料結構 - 使用 C 語言 34

1.21.2 Big-O Big-O