Presentation is loading. Please wait.

Presentation is loading. Please wait.

Implementing Data Structures

Similar presentations


Presentation on theme: "Implementing Data Structures"— Presentation transcript:

1 Implementing Data Structures
資料結構實做

2 Storing Arrays 儲存陣列 有點類似「表格」概念,每一格儲存我們要的資訊

3 Homogeneous Arrays 同質陣列 長方形的資料區塊每一項有相同性質

4 Homogeneous Arrays Row-major order versus column major order
Address polynomial for each of them is continuous 由列與行來儲存的,例如:4列*4行= 16個儲存空間,並且編號是連續的。

5 Figure 8.5 int Readings[24]; // 宣告一個可存24個整數的空間(陣列)
The array of temperature readings stored in memory starting at address x int Readings[24]; // 宣告一個可存24個整數的空間(陣列) 位址 記憶單位

6 Figure 8.5 67 int Readings[24]; // 宣告一個可存24個整數的空間(陣列) Readings[4]67;
The array of temperature readings stored in memory starting at address x int Readings[24]; // 宣告一個可存24個整數的空間(陣列) Readings[4]67; 位址 67 記憶單位

7 多維陣列

8 多維陣列 int a[5]; 一維陣列

9 多維陣列 int a[5]; 一維陣列 int b[5][5]; 二維陣列

10 多維陣列 int a[5]; 一維陣列 int b[5][5]; 二維陣列 int c[5][5][5]; 三維陣列

11 多維陣列 int a[5]; 一維陣列 int b[5][5]; 二維陣列 int c[5][5][5]; 三維陣列
int d[5][5][5][5]; int e[5][5][5][5][5]; ...... 那這些多維的你能想像嗎! ?

12 Row-major (row by row) Column major (column by column) 個整數的空間(陣列)

13 Row-major (row by row) Column major (column by column) 個整數的空間(陣列)

14 ex:FORTRAN Row-major (row by row)
Column major (column by column) 個整數的空間(陣列) ex:Pascal, C/C++, Java, C# ex:FORTRAN

15 ex:FORTRAN Row-major (row by row) Column major (column by column)
ex:Pascal, C/C++, Java, C# ex:FORTRAN x x+1 x+2 x+3 x+4 x+5 x+6 x+7 x+8 x+9 x+10 x+11 x+12 x+13 x+14 x+15 1 2 x x+4 x+8 x+12 x+1 x+5 x+9 x+13 x+2 x+6 x+10 x+14 x+3 X+7 x+11 x+15 1 2 3

16 Address polynomial int a[r][c] //宣告一個r(row行) *c(column列) 的二維陣列 1
...... c a[1][1] a[1][c] 2 a[2][1] a[2][c] 3 a[3][1] a[3][c] r a[r][1] a[r][c]

17 Address polynomial int a[r][c] //宣告一個r(row行) *c(column列) 的二維陣列 1
我的位址是x 1 ...... c a[1][1] a[1][c] 2 a[2][1] a[2][c] 3 a[3][1] a[3][c] r a[r][1] a[r][c]

18 Address polynomial int a[r][c] //宣告一個r(row行) *c(column列) 的二維陣列 1
我的位址是x 1 ...... c a[1][1] a[1][c] 2 a[2][1] a[2][c] 3 a[3][1] a[3][m] a[i][j] r a[r][1] a[r][c] 那我呢???

19 Address polynomial int a[r][c] //宣告一個r(row行) *c(column列) 的二維陣列
1 ...... c a[1][1] a[1][c] 2 a[2][1] a[2][c] 3 a[3][1] a[3][c] a[i][j] r a[r][1] a[r][c] x (row major order) a[i][j]的位址 :  x+c*(i-1)+(j-1)

20 Address polynomial int a[r][c] //宣告一個r(row行) *c(column列) 的二維陣列
1 ...... c a[1][1] a[1][c] 2 a[2][1] a[2][c] 3 a[3][1] a[3][c] a[i][j] r a[r][1] a[r][c] x (row major order) a[i][j]的位址 :  x+c*(i-1)+(j-1) Address polynomial 位址多項式

21 Example int a[3][4] 1 2 3 4 target x

22 Example Row-major order x+4*(2-1)+(3-1)=x+6 int a[3][4] x 1 2 3 4
target x

23 Example Row-major order x+4*(2-1)+(3-1)=x+6 Column-major order
int a[3][4] Row-major order x+4*(2-1)+(3-1)=x+6 Column-major order x+3*(3-1)+(2-1) =x+7 1 2 3 4 target x

24 Figure 8.6 int Readings[4][5]; // 宣告一個可存4*5個整數的空間(陣列)
A two-dimensional array with four rows and five columns stored in row major order int Readings[4][5]; // 宣告一個可存4*5個整數的空間(陣列) 概念性陣列 機器之記憶體 第3列第4行之值

25 Figure 8.6 int Readings[4][5]; // 宣告一個可存4*5個整數的空間(陣列)
A two-dimensional array with four rows and five columns stored in row major order int Readings[4][5]; // 宣告一個可存4*5個整數的空間(陣列) x+1 x+2 x+3 x+4 x+5 x+6 x+7 x+8 x+9 x+10 x+11 x+12 x+13 x+14 x+15 x+16 x+17 x+18 x+19 x+20 位址 概念性陣列 機器之記憶體 第3列第4行之值

26 Heterogeneous arrays 異質陣列 每一項可能不同類型稱作文件

27 Heterogeneous arrays Components can be stored one after the other in a contiguous block Components can be stored in separate locations identified by pointers 它儲存在連續的空間,他也可以用指標分開來儲存在不同的位置,應用在struct/class

28 Figure 8.7 Storing the heterogeneous array Employee a.陣列儲存在連續區間
b.陣列組件儲存在分開區間

29 Figure 8.7 Storing the heterogeneous array Employee a.陣列儲存在連續區間
個別項目通常被稱為元件(components) b.陣列組件儲存在分開區間

30 Storing Lists 儲存列表 例如儲存一串名字的list到電腦主記憶體之中

31 Contiguous list 連續串列 優點:靜態時為便利的儲存結構 缺點:動態下極存不便

32 Figure 8.8 Names stored in memory as a contiguous list 記憶單位連續區塊
第一名稱儲存區塊

33 linked list 鏈結串列 簡單說:將各list的入口用pointer連結起來 儲存在分散的記憶單元裡
- 頭指標(head pointer):指標指到串列的開端 - 空指標(NLT pointer):最後一項指標中放NIL

34 linked list 鏈結串列 簡單說:將各list的入口用pointer連結起來 儲存在分散的記憶單元裡
- 頭指標(head pointer):指標指到串列的開端 - 空指標(NLT pointer):最後一項指標中放NIL NIL

35 Figure 8.9 The structure of a linked list 頭指標 名稱 指標 空指標

36 linked list 可說是一系列node(節點)連結
A B C Head linked list 可說是一系列node(節點)連結 每個節點至少包含 data (資料) 指到下一個節點的指標 node A data pointer

37 Figure 8.10 Deleting an entry from a linked list 頭指標 刪除的項目 舊指標 名稱 指標
名稱 指標 新指標 空指標

38 B A C 將 A 節點的連結指標指向 C

39 Figure 8.11 Inserting an entry into a linked list 頭指標 新增的項目 新指標 新指標
新指標 新指標 名稱 指標 舊指標 空指標

40 將 B 節點的連結指標指向 C (node.next) 將 A (node)節點的連結指標指向 B

41 將 B 節點的連結指標指向 C (node.next) 將 A (node)節點的連結指標指向 B
步驟不能交換!!! Why?

42 Storing Stacks and Queues
儲存堆疊及佇列

43 Stack 堆疊 FILO : (First-In,Last-Out)先進後出

44 Stack 堆疊 FILO : (First-In,Last-Out)先進後出 記憶體需保留些連續區塊以供成長及縮小
頂端位置在保留記憶體區塊中前後移動,其單元稱 stack pointer

45 Figure 8.12 A stack in memory 保留區塊的記憶單元 堆積的基底 堆積項目 供成長的空間 堆積指標

46 Example

47 Example Push 紅球

48 Example Push 綠球

49 Example Push 藍球

50 Example Pop

51 Example

52 Example Pop

53 Example

54 Example Pop

55 Example

56 Queue 佇列 FIFO : (First-In,First-Out) 先進後出

57 Queue 佇列 FIFO : (First-In,First-Out) 先進後出 以連續記憶體區塊做保留二單元做指標
(head pointer頭指標 & tail pointer尾指標)

58 Figure 8.13 A queue implementation with head and tail pointers. Note how the queue crawls through memory as entries are inserted and removed. a.空佇列 b.插入項目A,B,C之後 c.移除項目A插入D之後 d.移除項目B插入E之後

59 缺點 queue若不作控制,記憶體緩慢移動,且經過地方所存的資料被摧毀 改善方法 環狀序列(circular queue)

60 Figure 8.14 A circular queue containing the letters P through V
(最後一個單元連到第一個單元) 實際的queue儲存結構

61 Figure 8.14 A circular queue containing the letters P through V A B C
Head 概念性的queue儲存結構 (最後一個單元連到第一個單元) 實際的queue儲存結構

62 Storing Binary Trees 儲存二元樹

63 Storing Binary Trees 儲存二元樹

64 Storing Binary Trees 儲存二元樹 每個節點=資料+左右孩子指標 Left child pointer
Right child pointer

65 Storing Binary Trees 儲存二元樹 每個節點=資料+左右孩子指標 通過根節點指標來做存取

66 Figure 8.15 The structure of a node in a binary tree
包含資料的記憶單元 左子指標 右子指標

67 Figure 8.16 概念性的樹 The conceptual and actual organization of a binary tree using a linked storage system 實際的儲存結構

68 Figure 8.16 概念性的樹 The conceptual and actual organization of a binary tree using a linked storage system 根節點 實際的儲存結構

69 Figure 8.16 A B C D E F NIL NIL NIL NIL NIL NIL

70 Figure 8.17 A tree stored without pointers 概念性的樹 實際的儲存結構 根節點
樹第二層中的節點 樹第三層中的節點

71 Figure 8.18 A sparse, unbalanced tree shown in its conceptual form and as it would be stored without pointers 概念性的樹 實際的儲存結構 根 第二層 第三層 第四層

72 Figure 8.18 A sparse, unbalanced tree shown in its conceptual form and as it would be stored without pointers 概念性的樹 實際的儲存結構 太浪費記憶體空間了!!! 根 第二層 第三層 第四層

73 靜態 vs 動態結構 靜態結構比動態結構易於管理, 且可直接存取(動態須由指標一個指一個)
靜態加入、刪除及合併時,必須做大量資料的移動;動態則只須要改變指標即可

74 Manipulating Data Structures
資料結構的操作 藉由事先已定義的程序(procedure)來完成資料結構的操作 Example : stack 堆疊最少需要 push(堆入)和 pop(移除) 兩個 procedures來完成操作

75 Figure 8.19 A procedure for printing a linked list

76 Figure 8.19 A procedure for printing a linked list 可以將鏈結串列的名單列出

77 The end


Download ppt "Implementing Data Structures"

Similar presentations


Ads by Google