第一章投影片

Download Report

Transcript 第一章投影片

Chapter 1 演算法分析
 1.1 演算法
 1.2 Big-O
資料結構 - 使用 C 語言 2
演算法分析
 演算法是解決一問題的有限步驟,而評
斷演算法的優劣可利用Big-O分析之,如
O(n)比O(n2)來得佳。
資料結構 - 使用 C 語言 3
1.1 演算法
 演算法(Algorithms)是一解決問題
(problems)的有限步驟程序。
 舉例來說,現有一問題為:判斷數字x是
否在一已排序好的數字串列s中,其演算
法為:
從s串列的第一個元素開始,依序的比較,
直到x被發現或s串列已達盡頭。假使x被
找到,則印出Yes;否則,印出No。
資料結構 - 使用 C 語言 4
1.1 演算法
 當問題很複雜時,上述敘述性的演算法
就難以表達出來。因此,演算法大都以
類似的程式語言表達之,繼而利用您所
熟悉的程式語言執行之。
資料結構 - 使用 C 語言 5
1.1 演算法
 “他的程式寫得比我好嗎?”
 應該利用客觀的方法進行比較,而此客
觀的方法就是複雜度分析(complexity
analysis)。
 首先必須求出程式中每一敘述的執行次
數(其中{和}不加以計算),將這些
執行次數加總起來。然後求出其Big-O。
資料結構 - 使用 C 語言 6
1.1 演算法
 陣列元素相加(Add array members)
資料結構 - 使用 C 語言 7
1.1 演算法
 矩陣相乘(Matrix Multiplication)
資料結構 - 使用 C 語言 8
1.1 演算法
資料結構 - 使用 C 語言 9
1.1 演算法
 循序搜尋(Sequential search)
資料結構 - 使用 C 語言 10
1.1 演算法
 二元搜尋(Binary search)
資料結構 - 使用 C 語言 11
1.1 演算法
 費氏數列(遞迴的片段程式)
資料結構 - 使用 C 語言 12
1.1 演算法
 費氏數列(非遞迴的片段程式)
資料結構 - 使用 C 語言 13
1.2 Big-O
 如何去計算演算法所需要的執行時間呢?
在程式或演算法中,每一敘述
(statement)的執行時間為:


此敘述執行的次數,
每一次執行所需的時間,兩者相乘即為此敘
述的執行時間。
 由於每一敘述所須的時間必需實際考慮
到機器和編譯器的功能,因此通常只考
慮執行的次數而已。
資料結構 - 使用 C 語言 14
1.2 Big-O
 下列有三個片段程式,請計算x=x+1的執
行次數:
資料結構 - 使用 C 語言 15
1.2 Big-O
 在分析演算法時,一般稱敘述的執行次
數為order of magnitude,所以上述的
(a) 、(b) 、(c)中,x=x+1的order of
magnitude分別為1,n,n2。
 而整個演算法的order of magnitude為演
算法中每一敘述的執行次數之和。
資料結構 - 使用 C 語言 16
1.2 Big-O
 算完程式敘述的執行次數後,通常利用
Big-O來表示此演算法執行的時間。
資料結構 - 使用 C 語言 17
1.2 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)是沒問題的。
資料結構 - 使用 C 語言 18
1.2 Big-O
 其實,我們可以加以證明,當
f(n)=amnm +...+a1n+a0 時,f(n)=O(nm)
資料結構 - 使用 C 語言 19
1.2 Big-O
 循序搜尋(sequential search)的情形可
分,其平均搜尋到的次數為
資料結構 - 使用 C 語言 20
1.2 Big-O
 二元搜尋法乃是資料已經皆排序好,因
此由中間(mid)開始比較,便可知欲搜
尋的資料(key)落在mid的左邊還是右
邊,再將左邊的中間拿出來與key相比,
只是每次要調整每個段落的起始位址或
最終位址。
資料結構 - 使用 C 語言 21
1.2 Big-O
資料結構 - 使用 C 語言 22
1.2 Big-O
 搜尋的次數為log32+1=6,此處的log表示log2。
資料量為128個時,其搜尋的次數為log128+1,
因此當資料量為n時,其執行的次數為logn+1。
資料結構 - 使用 C 語言 23
1.2 Big-O
 讀者大略可知二元搜尋比循序搜尋好得
太多了,其執行敘率為O(logn) 。
 費氏數列(Fibonacci number),其定
義如下:
資料結構 - 使用 C 語言 24
1.2 Big-O
資料結構 - 使用 C 語言 25
1.2 Big-O
資料結構 - 使用 C 語言 26
1.2 Big-O
資料結構 - 使用 C 語言 27
1.2 Big-O
 當n=3(f3)從上圖可知需計算的項目為5;n=5時,
需計算的項目數為15個。因此我們可以下列公
式表示:
資料結構 - 使用 C 語言 28
1.2 Big-O

資料結構 - 使用 C 語言 29
1.2 Big-O
 上述費氏數列是以遞迴的方式算出,其
Big-O為O(2n/2 ),若改以非遞迴方式計算
的話,其f(n)執行的項目為n+1項。
 從上表得知,計算費氏數列若採用遞迴
方法並不太適合,所以並不是所有的問
題皆適合利用遞迴法,有關遞迴的詳細
情形,請參閱第五章。
資料結構 - 使用 C 語言 30
1.2 Big-O
 Big-O的圖形表示如下:
資料結構 - 使用 C 語言 31
1.2 Big-O
 例如有一程式的執行次數為n2+10n,則其BigO為n2,表示此程式執行的時間最壞的情況下
不會超過n2,因為
n2+10n≦2n2,當c=2,n≧10時
資料結構 - 使用 C 語言 32
1.2 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!) 稱為階層時間
資料結構 - 使用 C 語言 33
1.2 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
得知。
資料結構 - 使用 C 語言 34
1.2 Big-O