資料結構 data structure

42
德德德德德德德德德德德 1 德德德德 Data Structure chapter 1

Upload: dai-chan

Post on 04-Jan-2016

67 views

Category:

Documents


0 download

DESCRIPTION

資料結構 Data Structure. chapter 1. 課程資訊. Lecturer: 江政杰 Office: 四合院 301 URL: nas.takming.edu.tw/pluto Mail: [email protected] 課程網頁 URL: nas.takming.edu.tw/pluto/ds/ds.html 教材、補充資訊 作業 相關連結. 課程資訊. Text Book : 資料結構 – 使用 C 語言 李春雄著 上奇出版社 成績評量 期中、期末各佔 30% 、平時成績佔 40%. 課程內容. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 資料結構 Data Structure

德明科技大學資訊科技系 1

資料結構Data Structure

chapter 1

Page 2: 資料結構 Data Structure

德明科技大學資訊科技系 2

課程資訊• Lecturer: 江政杰

– Office: 四合院 301– URL: nas.takming.edu.tw/pluto– Mail: [email protected]

• 課程網頁– URL: nas.takming.edu.tw/pluto/ds/ds.html– 教材、補充資訊– 作業– 相關連結

Page 3: 資料結構 Data Structure

德明科技大學資訊科技系 3

課程資訊• Text Book :

– 資料結構 – 使用 C 語言李春雄著 上奇出版社

• 成績評量– 期中、期末各佔 30% 、平時成績佔 40%

Page 4: 資料結構 Data Structure

德明科技大學資訊科技系 4

課程內容• 資料結構與演算法• 遞迴 Recursion• 陣列 Array• 堆疊 Stack• 佇列 Queue• 鏈結串列 Linked List• 樹狀結構 Tree Structure• 圖形 Graph Structure• 排序 Sorting• 搜尋 Search

Page 5: 資料結構 Data Structure

德明科技大學資訊科技系 5

修課基礎• 程式撰寫

– 對於變數、函數、陣列等基本程式語言的使用與掌握– 對於一個問題,可以在找出解決方法之後,撰寫出程

式碼• 具備邏輯概念

– 學習程式除了語法的熟悉外,最重要的是邏輯概念的訓練,才有能力學習其他語言

• 還無法順利掌握程式撰寫 ??– 以資料結構這門課程為程式設計的進階訓練– 程式設計能力的再次訓練

Page 6: 資料結構 Data Structure

德明科技大學資訊科技系 6

上課方式• 投影片展示,請自行搭配課本閱讀• 實例練習

– 在課程中會搭配一些程式範例,讓同學實際操作程式之撰寫,以掌握程式撰寫的能力

• 作業練習– 每一段時間,會有一完整的題目要求撰寫程

式,計入平時成績內• 期中、期末考試

Page 7: 資料結構 Data Structure

德明科技大學資訊科技系 7

學習程式• 入門

– 學習 VB 、 Dev C++ 等軟體的使用– 熟悉 VB 、 C 的語法撰寫

• 進階– 學習資料結構與演算法

• 深入– 最好的練習就是實際克服困難的題目

這學期的範圍

Page 8: 資料結構 Data Structure

德明科技大學資訊科技系 8

程式的組成• 資料:在程式中以變數的型態出現,每

個變數都在記憶體有一席之地,包含– 變數型態:決定所佔記憶體的長度– 變數值:實際的變數資料值– 變數位址:系統處理

• 程序:即 if 、 loop 等程式語法與流程• I/O :輸入與輸出,如 scanf 與 printf

輸入 處理 輸出

Page 9: 資料結構 Data Structure

德明科技大學資訊科技系 9

練習• 請撰寫一個程式,可以顯示九九乘法表

– 以兩層迴圈方式處理– 先能夠顯示正確結果,才思考如何排的漂亮

• 先示範…

Page 10: 資料結構 Data Structure

德明科技大學資訊科技系 10

資料與資訊• 資料

– 是客觀存在的、具體的、事實的記錄• 資訊

– 經過資料處理之後的結果即為資訊

資料

資訊

p1-2

Page 11: 資料結構 Data Structure

德明科技大學資訊科技系 11

資料結構的概念• 當我們解決問題時,還沒開始實際寫程

式,必須先規劃程式如何撰寫– I/O :輸入輸出的格式與資料內容– 程序:處理的方法 ( 演算法 )– 資料:決定此問題會用到那些類型的資料

• 有效率的程式 = 資料結構 + 演算法• 所謂的資料結構,就是針對一個問題,

決定如何設計資料部份,尤其是適合此問題的特殊資料類型– 資料在記憶體中的儲存方式

Page 12: 資料結構 Data Structure

德明科技大學資訊科技系 12

資料結構的概念• 在任何問題中,資料元素都不是孤立存

在,彼此之間存在某些邏輯關係,這種關係可稱為結構 (structure) ,種類有– 集合:元素間沒有次序性– 線性結構:陣列、串列、佇列、堆疊– 樹狀結構– 圖形結構

Page 13: 資料結構 Data Structure

德明科技大學資訊科技系 13

範例說明• 寫一個程式計算五個同學的平均成績

p1-5

Page 14: 資料結構 Data Structure

德明科技大學資訊科技系 14

演算法的五原則• 演算法 (Algorithm): 解決問題的方法1.輸入 (Input)

• 不一定要有輸入。可能沒有,也可能是多個資料輸入。

p1-7

例如 (1) :取得系統目前的時間,不須要輸入,只要寫一行 now() 函數, 就可以輸出系統時間例如 (2) :求某數為奇偶數時,則必須先要有一個整數輸入,才能運算2.輸出 (Output)

• 至少要有一個輸出3.明確性 (Definiteness)

• 每一行指令都必須明確,不可模稜兩可• 「用功的學生才能領獎學金」就不具有明確性,因為每一個人對用功的定義可能不盡相同。而如果改為「成績 90 以上的學生才能領獎學金」就是具有明確性,因為 90 分是一個比較客觀的定義。

Page 15: 資料結構 Data Structure

德明科技大學資訊科技系 15

演算法的五原則4.有限性 (Finiteness)

• 演算法不能有無窮迴路,必須能終止執行•由於演算法並非是真正可以執行的程式,而是

設計者所推演出解決問題的步驟,因此,必須在有限的步驟內要完成解決問題的程序

•真正的程式是可以有無窮迴路的動作5.正確性 (Correctness)

•既然演算法是解決問題的方法,因此正確性是最基本的要求

Page 16: 資料結構 Data Structure

德明科技大學資訊科技系 16

演算法的範例• 演算法 :

– 一組可用來解決特定問題的有限指令或步驟– 依循這些指令或步驟,可以完成工作

• 案例 : 做蛋糕

Page 17: 資料結構 Data Structure

德明科技大學資訊科技系 17

演算法的範例• 好吃的蛋糕怎麼來 ?

輸 入輸 入

輸 出輸 出

明確性明確性

正確性 正確性

有限性有限性

Page 18: 資料結構 Data Structure

德明科技大學資訊科技系 18

描述演算法的三種方法• 文字

– 採用口語化的文字敘述來加以描述,容易冗長且較不精確,在撰寫、閱讀、會意時可能會有誤差,因此一般較不常用

p1-10

例如:請利用「文字敘述」使用者登入帳號與密碼時,系統檢查的過程。

步驟一:輸入使用者帳號與密碼

步驟二:判斷帳號與密碼是否正確

步驟三:如果正確時,則可以登入系統

否則,就無法登入!

Page 19: 資料結構 Data Structure

德明科技大學資訊科技系 19

描述演算法的三種方法• 流程圖

– 利用圖形方式來表達欲解決問題的步驟開始

結束

檢查帳號與密碼

顯示Pass 顯示NoPass

真(True) 假(False)

輸入帳號與密碼

輸入

處理

輸出(顯示)

Page 20: 資料結構 Data Structure

德明科技大學資訊科技系 20

描述演算法的三種方法• 虛擬碼

– 使用文字摻雜程式語言,來描述解題步驟與方法– 兼具文字描述及流程圖的優點

// 登錄帳號密碼的檢查(1)Input: UserName, Password(2)IF (UserName And Password) ALL True Output: You Can Pass! else Output: You Can not Pass!// 計算 1+2+3+…+10(1) 設 Count=1,Total=0;(2)Total=Total+Count;(3)Count=Count+1;(4) 若 Count > 10 則至步驟 (5) ,否則回步驟(2)(5) 印出 Total

不是可以執行的指令

只是說明程式處理的流程

Page 21: 資料結構 Data Structure

德明科技大學資訊科技系 21

程式設計概念p1-14

Page 22: 資料結構 Data Structure

德明科技大學資訊科技系 22

程式設計概念

Page 23: 資料結構 Data Structure

德明科技大學資訊科技系 23

程式設計概念

系統發展的生命週期與程式設計之步驟比較

Page 24: 資料結構 Data Structure

德明科技大學資訊科技系 24

程式設計範例• 題目

– 計算國文與英文的平均成績,並依照平均成績來求顯示「及格」與「不及格」

1. 分析及定義問題。 兩個等級分別如下: (1) 及格: 60( 含 ) 以上。 (2) 不及格: 60 以下。2. 畫出整合問題的流程圖或撰寫問題的演算法

Page 25: 資料結構 Data Structure

德明科技大學資訊科技系 25

3. 撰寫及建立程式模組

4. 對每一個程式模組進行測試及除錯,直到沒有錯誤為止當使用者輸入國文為 60 分,英文為 61 分時,是否可以計算出平均成績為 60.5 ,如果沒有則必須要進行除錯,亦即要將 Average 的資料型態改為 float( 浮點數 )

Page 26: 資料結構 Data Structure

德明科技大學資訊科技系 26

結構化程式設計• 利用「由上而下」的技巧,將程式分解成多個

具有獨立功能的模組• 強調任何程式邏輯均可由三種結構組成

• 循序 (Sequence) :簡單命令式的指令– 如 X=Y+Z

• 選擇 (Condition) :做決策使用– if-then-else– select case / switch

• 重複 (Repetition) :重複執行– do-while– do-until– for

p1-18

循序

選擇

重複

Page 27: 資料結構 Data Structure

德明科技大學資訊科技系 27

演算法、資料結構、程式• 演算法

– 整個問題的解決方法,以邏輯方式描述– 以文字、或虛擬碼方式,撰寫整個程式的流程– 可對應到程式的撰寫,但是與程式語言的選擇無關

• 資料結構– 要解決問題時所需要的資料,以及資料彼此之間的

關連與結構– 著重在資料的表現、資料之間的結構關係

• 程式– 實際可以執行– 真實的解決問題,以符合程式語言的規範完成– 不同程式語言有不同的撰寫方法,但是彼此的基本

概念卻很相似

Page 28: 資料結構 Data Structure

德明科技大學資訊科技系 28

演算法、資料結構、程式• 在討論問題的解決方案時,大多以演算

法搭配資料結構為溝通的工具– 直接以程式語言討論太過於瑣碎

• 程式撰寫是基本的技能,更進階的是– 針對特定問題採用適當的資料結構– 設計有效率的演算法解決所面對的問題

• 有效率的演算法– 用較少的記憶體空間完成處理同一個問題– 用較少的執行時間完成處理同一個問題

Page 29: 資料結構 Data Structure

德明科技大學資訊科技系 29

演算法的時間效率• 程式的執行速度受到哪些因素影響

– 程式需要執行的指令數量– CPU 的速度– 電腦架構例如記憶體大小等– 其他例如編譯程式的效率等

• 演算法的設計並不考慮程式語言與硬體架構,因此以指令數量為評估效率的主要依據

• Q: 怎麼計算一個演算法的指令數量– 基本上是無法精確計算需要之指令數量, why?

– 那該怎麼評估一個演算法所需的指令數量

p1-22

Page 30: 資料結構 Data Structure

德明科技大學資訊科技系 30

程式中指令數目的計算• 循序結構 ( 一般指令 )

– 例如 : x=x+1

– 每個指令執行一次• 決策分支結構 (if)

– 例如 : if (x>1) then ...

– 只有條件為正時才會執行• 重複結構 (loop)

– 例如 : for i=1 to 100

– 迴圈內的指令重複 100 次• 真正計算指令數量有困難,但是從以上三個結構來看,顯然迴圈

內的執行數量是重點

Q: 計算下列程式中變數 Count 被執行的次數為何

Page 31: 資料結構 Data Structure

德明科技大學資訊科技系 31

迴圈敘述的頻率計數1. 先根據「迴圈計數器」的範圍算出迴圈重複的次數2. 再乘上迴圈內的行數。下列的程式片段,計算 10 組整數除法的商數及餘數1. For i = 0 To 9 2. Q = m[i] / n[i] 3. R = m[i] Mod n[i] ;4. Console.WriteLine(“{0} / {1} = {2} … {3}”, m[i], n[i], Q, R)5. Next

迴圈重複的次數為 10 次,迴圈內有 3 個敘述,因此第 2 行到第 4 行(迴圈的主體)的頻率計數為 30 ( = 10 3 ) 。第 1 行 for 迴圈的頭會執行 11 次,前 10 次造成迴圈主體的重複執行,第 11次發現條件不符而離開迴圈。因此整個迴圈(迴圈的頭加上迴圈的主體)的頻率計數為 41 ( = 11 + 30 ) 。

Page 32: 資料結構 Data Structure

德明科技大學資訊科技系 32

• 【舉例 1 】– 假設有一陣列 a ,其陣列的大小為 n ,如果

要將陣列 a 的元素相加,請問程式的執行次數為何?

【解析】行號 04 會執行 n+1 次,而前 n 次會執行迴圈主體,但是在第 n+1 次時沒有符合迴圈的條件,故離開迴圈。

Page 33: 資料結構 Data Structure

德明科技大學資訊科技系 33

• 【舉例 2 】– 假設兩矩陣 a, b 相加,並且矩陣大小皆為 n*

n ,請計算出下列程式的執行次數?

【解析】行號 04 外層迴圈 (for) 的計數器 i 從 0~n-1 ,共會執行 n+1 次,而行號 05 內層迴圈 (for) 的計數器 j 從 0~n-1 ,也會執行 n+1 次。因此,當外層迴圈執行 1 次時,則內層迴圈要執行一回合,也就是j 從 0~n-1( 共有 n 次 )

Page 34: 資料結構 Data Structure

德明科技大學資訊科技系 34

• 【舉例 3 】– 假設兩矩陣 a, b 相乘,並且矩陣大小皆為 n*

n ,相加請計算出下列程式的執行次數

Page 35: 資料結構 Data Structure

德明科技大學資訊科技系 35

雙層迴圈、內圈不固定次數 1          For i = 1 To n

2 For j = i+1 To n

3 result += 1

4 Next

5 Next

由於內圈迴圈計數器 j 的範圍,是隨著外圈迴圈計數器 i 的範圍改變的,因此我們針對迴圈計數器 i 的變化來分析:

Page 36: 資料結構 Data Structure

德明科技大學資訊科技系 36

數學式:

總次數 =

i 的值 j 的範圍 第 3 行執行次數1 2 …… n n-12 3 …… n n-23 4 …… n n-3… …  n-1 n …… n 1n n+1 …… n 0

總次數 = (n-1) + (n-2) + … + 1 = n * ( n-1 ) / 2

n

i

n

ij1 1

1 =

n

i

in1

)1)1(( =

n

i

in1

)(

= n2 – 2

)1( nn =

2

)1( nn

Page 37: 資料結構 Data Structure

德明科技大學資訊科技系 37

範例:計算 n 階乘 ( n! ) 的函式 1 Function factor( ByVal n As Integer) As Integer

2 Dim i, result As Integer

3               result = 1

4               i = 1

5               Do while i < = n

6                 result = result * i ;

7                  i += 1 ;

8                Loop

9                Return result

10 End Function

Page 38: 資料結構 Data Structure

德明科技大學資訊科技系 38

我們計算每一行敘述被執行的次數:行號 n>0 時 n <= 0 時

1 1 1

2 1 1

3 n+1 1

5 n 0

6 n 0

8 1 1

總次數 3n+4 4 

如果 n>0 ,頻率計數為 3n+4 次,如果 n <= 0 ,頻率計數為 4 次

多 1 次為最後一次比較條件不成立

如果更複雜的程式,似乎很難真的計算出指令的數量仔細觀察, 3n+4 的值重點在 n 是多少,當 n 很大時, 4 其實不重要

一般計算時,主要依據 n 的狀況,也就是迴圈的層次

Page 39: 資料結構 Data Structure

德明科技大學資訊科技系 39

Big-OBig-O 符號的數學定義為:若且唯若 f(n) = O(g(n)) 則存在大於 0 的常數

c 和 n0 ,使得對所有的 n 值,當 n n≧ 0 時, f(n) c * g(n) ≦ 均成立。

用數學式表示為:

f(n) = O(g(n)) c, n0>0 n n≧ 0 , f (n) c * g(n)≦

用口語解釋為: f(n) 取 Big-O 符號為 O( g(n)) ,當 n 夠大的時候, g(n)相當 於是 f(n) 的上限

nn0

f(n)

c*g(n)

用圖示可表達為: 

Page 40: 資料結構 Data Structure

德明科技大學資訊科技系 40

◎ 5n2 + 6n + 9 = O( n2 )

→ f( n ) = 5n2 + 6n + 9, g( n ) = n2

→ f 函數取 Big-O 符號為 g 函數

→5n2 + 6n + 9 取 Big-O 符號為 O( n2 )

◎ 3n lgn + 9n + 10 = O( nlgn ) ,因為 n lgn 的次數比 n 大,取最高次項而不計係數時,自然取到 n lgn (lg n = log2n)

◎ 9 n2 + 6nlgn + 9 = O( n2 ) ,因為 n2 的次數最大,取最高次項而不計係數時,自然取到 n2

◎ 19n3 + 9 n2 + 6n+ 9 = O( n3 ) ,因為 n3 的次數最大,取最高次項而不計係數時,自然取到 n3

Page 41: 資料結構 Data Structure

德明科技大學資訊科技系 41

Page 42: 資料結構 Data Structure

德明科技大學資訊科技系 42

2n

n3

n2

nlgn

n

lgn

1 2 4 8 16 32 64 128

將各種複雜度隨 n值變化的結果繪成圖表,以便了解複雜度對程式效能的影響有多大: ( X 軸代表 n值的成長, Y 軸代表 g(n) 值的成長 )

25

210

215

220

225

230