n 0 為其下限

Download Report

Transcript n 0 為其下限

Data Structure in C
─ 演算法分析
大綱



基本概念
演算法
效率評估


效率分析
效率估計
1
基本概念

需求


分析


所有大的程式都以一些定義專案目的規格書開始會獲
得輸入與輸出資訊
可以由下而上分析或由上而下分析
設計

設計者從程式所需要的資料物件和資料的運算來設計系
統



資料物件:可產生抽象資料型態
資料運算:需要演算法的規格並考量演算法的設計策略
抽象資料型態與演算法的規格是相互獨立的,我們可暫
時不考慮實作的因素
2
基本概念 (續)

改良和編碼


在這個階段,我們為每一個資料物件選擇表
示法,並編寫它的各種運算之演算法
驗證

這個階段包括程式正確性的驗證,以不同的
輸入資料測試程式,並改正錯誤
3
演算法

定義:演算法(algorithms)是一組有限的指令,根
據這些指令,可以完成一項特定的工作。此外,
所有的演算法需符合下列的條件:






輸入:可以沒有或從外部提供多個資料
輸出:至少產生一個結果
明確的:每一個指令都很明白且沒有混淆不清
有限的:如果追蹤一個演算法指令,演算法會在有限
的步驟之後停止
有效率的:每個運算即使都如“明確性的”定義,但
仍是不夠的,演算法必須是一個可行的運算
定義:演算法是一個解決問題的有限步驟程序,
也可以說是產生解答中一步一步的的程序
4
效率評估

對於一個程式而言,我們除了需要了解

是否符合原始規格
是否正確執行
是否有文件說明,以解釋如何使用與操作
是否有效率應用函數建立邏輯單元
是否易於閱讀
要考量程式能否有效率地使用記憶體

程式的執行時間是否可接受





5
效率評估 (續)

效率評估方法

效率分析(performance analysis)



著重於獲得和機器無關的估計時間和空間
以複雜度理論(complexity theory)為核心,又可分
為空間複雜度(space complexity)與時間複雜度
(time complexity)
效率估計(performance measurement)

利用獲得與機器相關的執行時間,以找尋出沒有
效率的程式片段
6
效率分析

空間複雜度


一個程式的空間複雜度是取決於執行程式所需
的記憶體空間
程式所需的空間為下列兩項的和

固定的空間需求


固定空間需求包括指令空間(用以儲存程式碼的空間),用來
存簡單變數,固定大小的結構變數和常數空間
可變的空間需求

包含了所有要解決問題中所有相關的結構化變數所需要的
空間還包含當函數採用遞迴方式呼叫時所需的空間最
常用的特性包括數量、大小及輸入與輸出值
7
效率分析 (續)

時間複雜度


一個程式的時間複雜度是取決於執行程式所需
的計算時間
程式所需的時間為下列兩項的和

編譯時間


執行時間


類似固定的空間項目。此外,一旦程式可以正確執行,我
們可以多次執行而不必再從新編譯
執行時間的估算並不十分容易,常見的有利用系統時間來
計算程式時間或利用程式運算的次數來評量
時間複雜度較常為人們所使用
8
效率分析 (續)

程式的時間複雜度是以用來執行函數的程式所發
生的步驟數目來表示


步驟數目是受測程式特性(輸入的數目、輸出的數目、
輸入與值出之值等)的集合函數
使用者可依其想了解的部份,以步驟數目估算時間複
雜度


輸入的
資料量
函數計
算之
Ex. 想知道當輸入資料量增加時,計算時間增加的程度為何?
Ex. 對不同的程式,我們想知道當輸入的值增大時,計算時
間如何增加?
輸入值的函
數計算之
9
效率分析 (續)

使用者必需先選擇相關的特性,以做為估算步驟的依據
步驟是與特性無關的計算單元



在某些情況下單純只依特性來計算步驟數目並不一定準
確


Ex.10個加法是一個步驟
Ex.100個加法也是一個步驟
Ex.利用binary search找尋特定數字,而估算方式是依參數數目,
但估算過程可能依數字所在的位置而有很大的差異,故步驟的
估算會有很大的誤差。
三種步驟計數



最佳狀況:步驟計算是對指定的參數所執行的最少步驟數
最差狀況:步驟計算是對指定的參數所執行的最多步驟數
平均值:步驟計算是以指定的參數在實體上執行的平均步驟數
10
效率分析 (續)

步驟估算方式

Ex. 陣列元素相加乃將陣列中每一元素的值加總起來
int sum(int arr[], int n) 步驟計數
{
int i, total=0;
1
for (i=0;i<n; i++)
n+1
total+=arr[i];
n
return total;
1
}
2n+3
11
效率分析 (續)

Ex. 陣列的相加表示將相對應的元素相加
void add(int a[][], int b[][], int c[][],
int rows, int cols)
步驟計數
{
for (int i=0;i<rows; i++) rows+1
for (int j=0;j<cols;j++) rows*cols+rows
c[i][j] = a[i][j] + b[i][j]; rows*cols
2rows*cols+2rows+1
}
12
效率分析 (續)

漸近式表示法(Asymptotic Notation)



決定步驟計數的目標是為了能夠比較相同函數
的兩個程式的時間複雜度,及預測當程式特性
改變時,執行時間增長的情形
當步驟所代表的概念不明確(x=y和
x=y+z+(x/y)+(x*y*z-x/z)都算是一個步驟),耗費
大量精神來決定精確的步驟計數是不值得做的
大多數情況下,只要可以構成一個敍述,如c1n2
Tp(n) c2n2或TQ(n,m)=c1n+c2m,其中c1和c2為非
負之常數,就足夠表示了
13
效率分析 (續)

若我們有兩個程式c1n2+c2n與c3n


在n夠大的情況,複雜度c3n的程式將比複雜度為
c1n2+c2n的程式快速
對於小的n而言,任一程式都可能比另一個快(視c1,
c2及c3而定)。


若c1=1, c2=2, c3=100,則c1n2+c2n  c3n,當n  98,則
c1n2+c2n > c3n
不論c1, c2及c3之值為何,總有一個n值使得複
雜度為c3n的程式比複雜度為c1n2+c2n的程式快速
這個n就稱為損益點(估算)
14
效率分析 (續)

術語介紹


O(n):f(n)=O(g(n)),若且唯若存在一正整數c及n0,
使得f(n)  cg(n),對所有的n,n  n0 (Big-O) 敍述
f(n)=O(g(n))僅陳述g(n)是當n  n0時函數f(n)之值的上
限,但未說出上限好到何種程度。所以O(n2),
O(n3)…都足以表達為使其更具意義,在下結論說
f(n)=O(g(n))時,g(n)必須是最小函數,n0為其上限
Ω(n) :f(n)= Ω(g(n)),若且唯若存在一正整數c及n0,

使得f(n) cg(n),對所有的n,n
n0 對於f(n)=

Ω(g(n))而言,它暗示了當敍述f(n)= Ω(g(n))時,g(n)
應是最大函數, n0為其下限
15
效率分析 (續)

Θ(n) :f(n)= Θ(g(n)),若且唯若存在正整數c1、c2及
n0,使得c1g(n)  f(n)  cg2(n),對所有的n,n  n0 
Θ(n)比O(n)和Ω(n)兩者都準確g(n)同時是f(n)的上
限和下限
f(n)
c*g(n)
c*g(n)
f(n)
n0
O(n)
n
n0
n
Ω(n)
16
效率分析 (續)

Big-O的類別









O(1):常數時間
O(log n):對數時間
O(n):線性時間
O(n log n):對數線性時間
O(n2):平方時間
O(n3):立方時間
O(2n):指數時間
O(n!):階層時間
O(nn):n的n次方時間
優
效率
差
17
效率分析 (續)

Ex. 陣列的相加表示將相對應的元素相加
void add(int a[][], int b[][], int c[][],
int rows, int cols)
步驟計數
{
for (int i=0;i<rows; i++) Θ(rows)
for (int j=0;j<cols;j++) Θ(rows*cols)
c[i][j] = a[i][j] + b[i][j]; Θ(rows*cols)
Θ(rows*cols)
}
方法一:將每
行程式的漸近
式複度相加即
可
方法二:取得
最大的指令複
雜度
18
效率估計


雖然效率分析在確認一個演算法的空間和時
間複雜度上提供一個強大的工具,但有些時
候,我們仍然需要考慮演算法如何在我們機
上執行
時間的計算可利用C語言所提供的指令
方法1
開始時間
start=clock( );
結束時間
stop=clock( );
回傳型態
clock_t
結果(秒數計算) duration=((double)(stop-start)/CLK_TCK;
方法2
start=time(NULL);
stop=time(NULL);
time_t
duration=(double) difftime(stop,start);
19
效率估計(續)
Time for f(n) instructions on a 109 instr/sec computer
n
f(n) = n
f(n) = log2 n f(n) = n2
f(n) = n3
f(n) = n4
f(n) = n10
f(n) = 2n
10
20
30
40
50
0.01μs
0.02μs
0.03μs
0.04μs
0.05μs
0.03μs
0.09μs
0.15μs
0.21μs
0.28μs
0.1μs
0.4μs
0.9μs
1.6μs
2.5μs
1μs
8μs
27μs
64μs
125μs
10μs
160μs
810μs
2.56ms
6.25ms
10sec
2.84hr
6.83d
121.36d
3.1yr
1μs
1ms
1sec
18.3min
13d
100
0.10μs
0.66μs
10μs
1ms
100ms
3171yr
4*10 13 yr
1000
1.00μs
9.96μs
1ms
1sec
10000 10.00μs 130.03μs
100000 100.00μs
1000000
1.00ms
1.66ms
100ms 16.67min
10sec
19.92ms 16.67min
11.57d
16.67min 3.17*10 13 yr 32*10 283 yr
115.7d 3.17*10 23 yr
3171yr 3.17*10 33 yr
7
43
31.71yr 3.17*10 yr 3.17*10 yr
μs=microsecond=10-6seconds
ms=millisecond=10-3seconds
20