introduction 基本概念 授課老師:蕭志明

43
Introduction 基基基基 基基基基 基基基

Upload: scarlett-berg

Post on 03-Jan-2016

92 views

Category:

Documents


0 download

DESCRIPTION

Introduction 基本概念 授課老師:蕭志明. 資料. 基本資料 : 單一而不可以再分割的資料個體。 例如,整數 45 就是一個單一的整數數值。 程式中宣告 : integer , char…. 複合資料 : 可被分解為多個有意義的基本資料。 例如,以住址來說,可以被區隔為縣 ( 市 ) 、鄉 ( 鎮 ) 、道路等。. 資料型態. 資料的集合:整數、浮點數、字串 … 。 運算的集合 : 資料型態各有其特殊的操作,像整數的加、減、乘、除運算。. 資料結構. 資料結構是由基本資料與複合資料所組成,而且可以定義資料之間的依存關係。 - PowerPoint PPT Presentation

TRANSCRIPT

Introduction基本概念

     授課老師:蕭志明

2

資料1. 基本資料:單一而不可以再分割

的資料個體。 例如,整數 45 就是一個單一的整

數數值。 程式中宣告: integer , char….

2. 複合資料 : 可被分解為多個有意義的基本資料。

例如,以住址來說,可以被區隔為縣 ( 市 ) 、鄉 ( 鎮 ) 、道路等。

3

資料型態

1. 資料的集合:整數、浮點數、字串 …。

2. 運算的集合:資料型態各有其特殊的操作,像整數的加、減、乘、除運算。

4

資料結構 1. 資料結構是由基本資料與複合資

料所組成,而且可以定義資料之間的依存關係。

2. 結構係指儲存資料的一組規則。3. 如果我們選取一組資料型態,並

且將它們放入一個結構中並定義此結構的相關規則,那麼我們就是在製作一個資料結構。

4. 許多個資料結構可以巢狀的方式結合在一起。

5. 一個資料結構可以由其他資料結構所組成。

5

資料結構範例

陣    列    記 錄

由型態相同的資料所組成的循序串列

由型態不同的資料所組成的單一結構,並有一個識別鍵

組成元素間位置的相互關連 沒有關連

Ex:1. int Array[10]2. Record person

{ Char ID;  String name;  int phone;….} 

定義了兩個資料結構,陣列 (Array) 與記錄 (Record)。

6

1. 資料的定義與組識 2. 和資料有關的操作

排隊陣列的相關操作

資料結構

Example-用陣列

7

資料型態 ( 續 )

1. 基本資料型態:例如:整數、浮點數、字串、日期、布林值( Boolean value )等,都算是基本資料型態,這些資料型態各有其特殊的操作,像整數的加、減、乘、除運算,或是布林值的邏輯運算,從廣義的說,其實基本資料型態可以看成是最簡易的資料結構。

2. 抽象資料型態 ( ADT , Abstract data type ): 所謂的「抽象化」,在此是指將現實世界的事物或觀念轉化成資料結構來表示, ADT 在設計上希望做到隱藏內部細節,展現平易外觀的目的,也就是讓使用者能善用 ADT ,卻不必了解其內部的詳細結構。

8

抽象資料型式( ADT Data Typ

e)

圖中最底層的部分,這些基本型式的資料可結合成各種抽象資料型式

9

1. 資料的定義與組識 2. 和資料有關的操作

排隊陣列的相關操作

資料結構

ADT  Example

10

抽象資料型態(續)

1. 在使用 ADT 的時候,我們並不在意 ADT 如何完成工作,而是它能夠做什麼樣的工作。

2. ADT 允許我們使用隱藏起來的各種函數。但是程式設計師仍然能夠使用這些函數。

3. 所謂抽象,就是未載明一般實作方式的運算。我們抽象化程序處理的本質,而將實作細節隱藏起來。

11

1. 何謂抽象: 我們可以知道一個資料型態能作什麼

工作; 資料型態如何完成工作則被隱藏起來。

2. 抽象資料型態包括: 資料的宣告; 運算的宣告; 資料與運算的封裝。

3. 至少有三種資料結構可用來支援串列,例如陣列、連結串列、與檔案。

4. 如果我們將串列放在 ADT 中, ADT 的使用者不應該知道我們使用的是那一種結構。使用者只要能夠對串列進行資料的插入與讀取即可。

12

抽象資料型態的模型

13

ADT 的模型 1. 呈現不規則狀且反白的區域代表整

個模型。2. 在這個抽象的區域之內,是由模型

的兩大部份,資料結構與運算函數所組成。

3. 兩者都包含在區域之內,而且使用者無法存取它們。

4. 但是其中的函數可以存取所有的資料結構,而且很可能會呼叫其他函數來完成工作。換句話說,區域內的資料結構與運算函數之間是沒有隔閡的。

14

ADT 運算

1. 圖中有一些長方格,只有一半在區域之內,是所謂的操作介面,資料可經由此進行輸入、讀取、更新、與刪除等處理的工作。

2. 對於介面中的每一個操作都有一個對應的演算法來實作。長方格中所包含的內容就是操作的表頭。

3. 由表頭可知使用者只能知道操作名稱與參數,而且這些操作是存取 ADT 的唯一介面。

15

ADT 資料結構1. ADT要對使用者隱藏實作細節 ,

不過結構的所有資料都必須在 ADT 中維護。

2. 僅僅將結構封裝在 ADT 中是不夠的, ADT還要使不同版本的結構能夠共存。

3. 也就因為要儲存不同的資料,所以必須對使用者隱藏實作的細節。

4. ADT類別所屬的物件都會有一個定義好的型態,而且使用者也必需要使用這些型態來撰寫程式。

5. 當物件建立之後,它會包含所有需要的結構。應用程式不必關注這些結構確切的格式與型態。

6. 就一個實務問題而言,我們會將這些結構實作在動態記憶體中。

16

一個指標 (指向一個被穩藏的結構 )

資 料 外 部 介 面ADT

動 態 記 憶 體

新 增

建 立

搜 尋

刪 除

清 除

ADT 資 料 外 部 介 面

17

演算法( Algorithms) 

1.演算法 (algorithm): 由有限步驟所構成的集合,

可以用於解決某一個特定的問題。

是一解決問題( problems)的有限步驟程序。

2.舉例來說,現有一問題為:判斷數字 x是否在一已排序好的數字串列 s中。 其演算法為:從 s串列的第

一個元素開始,依序的比較,直到 x被發現或 s串列已達盡頭。假使 x被找到,則印出 Yes;否則,印出 No。

18

演算法(續)當問題很複雜時,上述敘述性的演算法就難以表達出來。因此,演算法大都以類似的程式語言表達之,繼而利用您所熟悉的程式語言執行之。

19

演算法條件演算法必須滿足以下五個條件:1. 輸入 (input) :可以由外界輸入 0

個、 1 個或多個以上的資料。2. 輸出 (output) :至少要有 1 個以

上的輸出。3. 明確性 (definiteness) :每個步驟都必須是明確而不含糊的。

4. 有限性 (finiteness) :必須在有限步驟內結束。

5. 有效性 (effectiveness) :每一個步驟必須是基本的 ( 可行的 ) ,也就是說,即使我們僅僅具有紙和筆也可以執行這些步驟。

20

資料結構和演算法

資料結構和演算法要用程式語言來描述,才能交由電腦執行,至於要用那一種程式語言;並沒有特別規定

21

1. 影響程式執行時間的因素,最簡單的有

機器的速度 演算法的好壞

2. 演算法 (algorithm) 是一解決問題的有限步驟之程序。

3. 演算法的好壞,必須做複雜度的分析 (complexity analysis) 。

4. 分析演算法的複雜度,必須先求出程式中每一敘述的執行次數,並加總起來,然後求出其Big-O 。

演算法效率分析

22

演算法效率分析(續)1. 我們必須要知道如何計算演算法的效率,以便選擇效率高的來使用。

2. 如果一個程式不包含迴圈,那麼它的效率就與指令的總數目相關 ( 在數學上稱為函數關係 ) 。

3. 演算法如果包含迴圈,那麼它的效率的變動情形就會很大,所以迴圈是我們分析的重點所在。

4. 研究一個演算法時,通常都以一個表示被處理資料數目的函數,來衡量所謂的效率。一般格式如下:

f (n) = 效率

23

執行時間 = 執行次數 * 每次執行所需的時間。

由於每一敘述所需的時間必須考慮到機器和編譯器的功能,因此通常只考慮執行的次數而已。

例如: x=x+1; for (i=1; i <= n; i++) for(i=1; i<=n; i++) x=x+1; for(j=1; j<=n; j++) x=x+1;

1次 n次 n2次

程式執行時間

24

陣列元素相加

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

25

矩陣相加

假設兩矩陣 a, b皆為 n*n 。

void add(int a[ ][ ], int b[ ][ ], int c[ ][ ], int n){ int i, j; for(i=0; i<n; i++) for (j=0; j<n; j++) c[i][j] =a[i][j]+b[i][j];}

執行次數

1 n+1 n(n+1) n2

________ 2n2+2n+2

26

矩陣相加

27

矩陣相乘

void mul(int a[ ][ ], int b[ ][ ], int c[ ][ ], int n)

{

int i, j, k, sum;

for (i=0; i < n; i++)

for (j=0; j < n; j++)

{

sum = 0;

for (k=0; k < n; k++)

sum = sum+a[i][k]*b[k][j];

c[i][j] = sum;

}}

執行次數

1

n+1

n(n+1)

n2

n2(n+1)

n3

n2

___________

2n3+4n2+2n+2

28

相乘兩個矩陣矩陣相乘( Matrix Multiplication )

29

相乘兩個矩陣

30

Big-O1. 算完程式敘述的執行次數後,通常利用 Big-O 來表示此演算法的執行時間,表示如 O(n) ,亦稱為該程式的「時間複雜度 (time complexity) 」。

2. Big-O 取執行次數中最高次方或最大指數部份的項目即可。 如:

陣列元素相加為 2n+3 = O(n) 矩陣相加為 2n2+2n+1 = O(n2) 矩陣相乘為 2n3+4n2+2n+2 = O

(n3)

3. 運用時間複雜度的觀念,我們可以判斷該程式的執行效率是否良好。

4. 衡量程式效率的方法還有與。

31

Big-O  定義

32

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

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

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

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

(d) 10n2+5n+1=O(n3) ,原來 10n2

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

33

Big-O  公式  f(n)=amnm +...+a1n+a0 時, f

(n)=O(nm)

34

Big-O

1. 例如有一程式的執行次數為 n2+10n ,則其 Big-O 為 n2,表示此程式執行的時間最壞的情況下不會超過 n2,因為

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

35

1. O(1) :常數時間 (constant time)

2. O(log n) :次線性時間 (sub-linear)

3. O(n) :線性時間 (linear)

4. O(n log n)

5. O(n2) :平方時間 (quadratic)

6. O(n3) :立方時間 (cubic)

7. O(2n) :指數時間 (exponential)

8. O(n!) :階乘時間 (factorial)

如果 n很大時 →

1< log n < n < n log n < n2 < n3 < 2n

< n!

Big-O  等級

36

Big-O  之效率

37

Example

1. 若ㄧ個程式執行時間是 1000n^2+nlogn,求其 big-O

38

複雜度分析以循序搜尋為例: int search (int data[ ], int target, int n) { int i; for (i=0; i < n; i++) if ( target == data[i]) return[i]; }

最佳次數:當資料在第一筆時,第一次就找到。

最差次數:當資料不存在或資料在最後一筆時,需要 N次。

平均次數:

O(n)

通常比較最差次數。

2

1

2

)1(11

1

nnn

nk

n

n

k

39

二元搜尋— O(?)

binsrch(int A[], int n, int x, int j){ lower = 1; upper = n; while (lower <= upper) { mid = (lower + upper) / 2; if (x > A[mid]) lower = mid + 1; else if (x < A[mid]) upper = mid – 1; else { j = mid; return; } } }

40

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

41

二元搜尋

42

二元搜尋 搜尋的次數為 log32+1=6 ,此處的 log 表示 log2。資料量為 128

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

43

二元搜尋 Big-O

二元搜尋比循序搜尋好得太多了,其執行敘率為 O(logn) 。