You are on page 1of 12

第3講 Arrays and Structures

§ ADT 的觀念 Abstract Data Type


抽象資料型態
使用電腦來解決問題意謂著需要處理資料。我們必須要定義資料型態與在這些
資料上所要執行的運算。抽象資料型態(abstract data type;ADT)的使用者
只需瞭解可運用在資料型態上的運算有哪些即可,而不必知道它們如何被套用
的。
簡單抽象資料型態
-許多程式語言已經定義了一些簡單抽象資料型態(simple ADTs)來做為語言
完整的一部分。這個抽象資料型態的型態是事先定義好範圍的整數,C 也定義
了幾個可以被套用在這個資料型態上的運算,C 明確地定義這些整數的運算以
及可預期的結果是什麼。程式設計師不需要知道這些運算實際上是如何被實作
出來的。
複雜抽象資料型態
-串列複雜抽象資料型態、堆疊複雜抽象資料型態、佇列複雜抽象資料型態,
為了有效率,這些複雜抽象資料型態應該被建立與儲存在電腦的函式庫中來被
使用。
-對於抽象資料型態,使用者關心的不是工作如何被完成,反而是它能做什麼。
抽象資料型態是由一個允許程式設計師使用、而實作方式被隱藏的運算之定義
集合所組成的。這種未特別指明實作過程之運算的概念稱為 抽象
(abstraction)。我們抽取處理程序之本質而隱藏其實作細節。

一、自然數 Structure Natural Number is


.Objects:
An ordered subrange of the integers starting at 0 and ending at the
Max integer (INT_MAX) on the computer.
.functions:
Boolean Equal(x,y)
If ( x == y) else return
Boolean Is_Zero(x)
If (x) return False else return True
二、 陣列 Array
Structure Array is
.Object:
A set of pair <index, value>
.functions:
Array Create (j, list) 建立
int a[5]; //a[0]→a[4]

1
int a[5]={0,1,2,3,4};
Item Retrieval (A, i) 取出
b=a[0];
Array Store (A, i, x) 存入 a[0]=1;

電腦的記憶體可視為一維陣列,依序排列
Variable Memory Address
A[0] Base addr. = α
A[1] α+ sizeof(int)
A[2] α+ 2*sizeof(int)

例:α=1234,int 的長度為 4 Bytes,a[0-99] 試問 a[4]的位址=???


Ans:1234+4*4=1250
§ 二維陣列
Row-Major: A[0-2,0-6] 3列 7行
A[0,0 A[0,1] A[0,2] A[0,3] A[0,4] A[0,5] A[0,6]
]
A[1,0 A[1,1] A[1,2] A[1,3] A[1,4] A[1,5] A[1,6]
]
A[2,0 A[2,1] A[2,2] A[2,3] A[2,4] A[2,5] A[2,6]
]
假如 起始位置 α,每一個元素佔用 1byte
α α+1 α+2 α+3 α+4 α+5 α+6
α+7 α+8 α+9 α+10 α+11 α+12 α+13
α+14 α+15 α+16 α+17 α+18 α+19 α+20
Column-Major:
A[0,0 A[0,1] A[0,2] A[0,3] A[0,4] A[0,5] A[0,6]
]
A[1,0 A[1,1] A[1,2] A[1,3] A[1,4] A[1,5] A[1,6]
]
A[2,0 A[2,1] A[2,2] A[2,3] A[2,4] A[2,5] A[2,6]
]
假如 起始位置 α,每一個元素佔用 1byte
α α+3 α+6 α+9 α+12 α+15 α+18
α+1 α+4 α+7 α+10 α+13 α+16 α+19
α+2 α+5 α+8 α+11 α+14 α+17 α+20

2
練習題: 若 a[0-2,0-6],a[0,0]=α,int 長度為 4 Bytes,則 a[1][2]所在的記憶體位
置為何?
Row-major a[1][2]=α+1(列)*7*4+2(行)*4=α+36
Column-major a[1][2]=α+1(行)*3*4+2*4=α+28
技巧:
1. 月曆是以 row-major(列為主)方式安排水平掃描
2. 列長 = 7 (每周 7 天)
3. 不同列中,相同位置元素,記憶體位址會相差 n × 7

1. row-major or column major?


2. element size and row/column length?
3. which element address? related location?

(0,0)= α (0,1) (0,2) (0,3) (0,4) (0,5) (0,6)


(1,0) (1,1) (1,2)=? (1,3) (1,4) (1,5) (1,6)

3
(2,0) (2,1) (2,2)
[94 公務員三級特考] 假設陣列資料以行為主(column major)儲存於記憶體中,
且每份資料佔 1 個記憶體單位,若陣列 A 的第一個元素 A[0,0]位址是
2152,A[4,5]是 2196,則 A[5,4]的位址為何?
(A)2159 (B)2169 (C)2173 (D)2189
(0,0)2152 (0,1) (0,2) (0,3) (0,4) (0,5) …
(1,0)
(2,0)
(3,0)
(4,0)2156 (4,5)2196
(5,0) (5,4)=?

1. Column major (行為主)垂直掃描
2. Element size = 1, column length=? (2196-2156)/5=8

※若題目改為 row major,A[4,5]改為 2257,則 A[5,4]的位址為何?

考題: A(1,1)位址為 644,A(3,3)位址為 676,A(14,14)的位址為???


Ans:
A[0,0]

A[1,1]
644
A[2,2]
16 32
660
A[3,3]
676
A(14,14)=676+(14-3)*16=852

考題: 給予 2 個已知位址 A[3, 2]= 1110, A[2, 3]= 1115,每個元素長度為 1bytes


1, 求 A[1, 4] 的位址? Ans:1120
(題目沒寫, 先判斷 Row major or Column major)
A[3, 2]= 1110 A[2, 3]= 1115
→Column major

4
(1, 1) (1, 2) (1, 3) (1, 4)
(2, 1) (2, 2) (2, 3) (2, 4)
(3, 1) (3, 2) (3, 3) (3, 4)

1160-1110=6→表示一行有 6 個元素
練習題: A(5,3)位址為 5314,A(8,5)位址為 5422,每個元素長度為
4bytes,求 A(2,7)位址?
Ans:
Row-major(Error)
5314
A(5,3) A(5,4) …..
A(6,3) A(6,4) …..
100/3??
A(7,3) A(7,4) …..
A(8,3) A(8,4) A(8,5) …
5414 5422

Column-major(OK)
+12
5314 5326
A(5,3) A(6,3) A(7,3) A(8,3)
96/2=48
A(5,4) A(6,4) A(7,4) A(8,4) N=48/4=12
A(5,5) A(6,5) A(7,5) A(8,5)
5422
N=12
A(2,7)=5314+[(7-3)*12*4+(2-5)*4]=5494

例、某一個二維陣列 A,若 A(2,3)的位址為 1117,且 A(3,2)的位址為 1123,假


設陣列中每一元素大小為一個單元地址,且陣列 A 的宣告為 A(0:m, 0:n),則下
列敘述哪些是正確的: 10%
(A)陣列 A 的基底位址(base address)為 1093
(B) n 的值為 6
(C) A(1,4)的位址為 1104
(D)A(10,7)的位址為 1178
(E) m 的值無法求出

5
三、 矩陣 Matrix
三角矩陣是屬於特殊的二維陣列矩陣,同樣也用壓縮的儲存方式,能夠更好的
節約儲存空間,二維陣列的三角矩陣分為上三角矩陣(upper triangular
matrix)和下三角矩陣(lower triangular matrix)。

(1,1)

非零區

(10,10)

(1) 將 10 列下三角矩陣 A 的非零項用一維陣列 B 來存,B 所需陣列大小


為何?(下三角矩陣: i<j 時,A(i,j)=0 )
Ans:1+2+3+…..+9+10=(1+10)*10/2=55
(2) 若依照列的順序來
A(1,1)=B(1),A(2,1)=B(2),A(2,2)=B(3),A(7,7)=?
Ans:1+2+3+…+7=(1+7)*7/2=28
(3) A(5,6)=?
此為零項,不需存
(4) A(7,3)=?
Ans:(1+6)*6/2+3=24

6
例:有一個 A100×100 的下三角矩陣用一維陣列 B 來儲存,回答下列問題:
(A) 元素個數? (指的是非 0 的元素個數)
(B) A[65, 60]的資料以 Row-major 恰存入一維陣列 B[k] (B 的起始索引值為 1,即
A[1,1]B[1]),則 k = ?
(C) A[70, 50]以 Column-major 存入 B[k]中,則 k=? Ans:5050, 2140, 3745

7
§ 三角矩陣之一般化(利用梯形面積公式)
(1,1)

(1,1)
1+2+…+64=2080

60
(65,1) (65,60)
(i,j) )

Non-zero (n,n)

(n,n)

(1) A(n,n)=1+2+3+…..+n=n(n+1)/2
(2) A(i,j)=[1+(i-1)]*(i-1)/2+j=i(i-1)/2+j OR
A(i,j)=(i+1)*i/2-j

(1,1)
例1

(i,j)

Non-zero

(n,n)

A(i,j),1<=i<=n,,1<=j<=n
假設用一維陣列 B 來儲存非零元素,B 的指標由 1 開始計算,A 的非零元素以
列為主,由左到右,由上到下的次序存於 B
(1) B 有多少元素?
Ans:n(n+1)/2 個
(2) 非零元素 A(i,j)儲存於 B 的指標位置為何?
Ans:i*(i-1)/2+(i+j)-n OR i*(i+1)/2-(n-j)

8
[95 公務員警察特考]一個一般化帶狀矩陣(generalized band matrix) An,a,b 為一
個 nxn 矩陣 A(1-100,1-100),其中帶狀之項目為非零之數字如下圖(A)所示。圖
(B)為 A4,3,2 之範例,假設此帶狀陣列內元素依序存在一維陣列 B 中,而儲存方
式是由右下角開始存放。如圖(B)的存放方式如下
B(1) B(2) B(3) B(4) B(5) B(6) B(7) B(8) B(9) B(10) B(11) B(12)
7 6 5 4 2 4 2 3 9 1 5 8

n a
b
0 0 1 4
0 5 2 5
非零區 8 3 4 7
9 2 6 0

a
圖(B)
b
圖(A)

(一) An,a,b 帶狀內共有多少個元素? nxn-(n-a)(n-a+1)/2-(n-b)(n-b+1)/2


(二) A100,20,30 中,A(70,85)在陣列 B 中排在甚麼位置?X
(三) 假設在 A100,20,30 中 A(i, j)排在陣列 B 中 B(300),請問 i 和 j 值各為多少?
A(91,35)

觀察: 對角線與 i+j = C 的關係

[91 台北大學資管所]同上題
將對應關係修改成
B(1) B(2) B(3) B(4) B(5) B(6) B(7) B(8) B(9) B(10) B(11) B(12)
1 5 8 4 2 3 9 5 4 2 7 6
(一)A100,20,30 中,A(70,34)在陣列 B 中排在甚麼位置? 2074
(二)假設在 A100,20,30 中 A(i, j)排在陣列 B 中 B(300),請問 i 和 j 值各為多少?
A(54,31)

9
§ The Sparse Matrix 稀疏矩陣
稀疏矩陣(sparse matrix),在數值分析中,是其元素大部分為零的矩陣。在科
學與工程領域中求解線性模型時經常出現大型的稀疏矩陣。

row0 15 0 0 22 0 -15
0 11 3 0 0 0
row1 0 0 0 -6 0 0
row2 0 0 0 0 0 0
91 0 0 0 0 0
row3 0 0 28 0 0 0
row4
row5

.m=n→square 方陣
.using the triple < row, column, value > to characterize the matrix
row column value
b[0] ← 0 0 15
b[1] ← 0 3 22
b[2] ← 0 5 -15
B b[3] ← 1 1 11
b[4] ← 1 2 3
b[5] ← 2 3 -6
b[6] ← 4 0 91
b[7] ← 5 2 28

10
例1
Give two polynomials as follows:
K(x)=X5+8X3+X2+2
M(x)=X100+3X10+1
Write an array representation of two polynomials.
Ans:
K(x)因為非零項次較少,故採用下列格式(n 代表非 0 係數最高項次)
0 1 2 n+1
n
Xn Xn-1
∴ K(x)= 0 1 2 3 4 5 6
5 1 0 8 1 0 2

次方數

M(x) 因為零項次較多,故採用下列格式
假設有 m 個非 0 項次
0 1 2 2m-1 2m

非 m
零 係數 指數 係數 指數


∴ M(x)= 0 1 2 3 4 5 6
3 1 100 3 10 1 0
總項數 係數 指數 係數 指數

目的→節省記憶體空間

鋼琴家大衛托利:機會是留給準備好的人
https://www.youtube.com/watch?time_continue=110&v=IikaDKvC1as

「機會是留給準備好的人」這句話對美國鋼琴家大衛托利(David Tolley)是對的,他曾為百
老匯寫曲,並為四任美國總統演出。而最讓人津津樂道的是他的成名過程,除了幸運,他在機
會面前毫無畏懼的自信。

1985 年,還是素人的大衛出現在脫口秀《The Tonight Show》的節目現場。當時原本要邀請


的鋼琴家 Horatio Gutierrez 因為關車門時手指不小心被夾傷而無法表演,此時主持人問現場觀
眾有沒有人願意上台彈奏,此時大衛將手舉高毛遂自薦。

11
當時大衛只穿著簡單的 T 恤、牛仔褲和拖鞋,還被主持人調侃,但這都不影響大衛的心情。在
他坐上鋼琴椅並開始演奏歌舞劇《貓》的主題曲《Memory》後,他精湛的琴藝以及幽默感讓
觀眾驚訝鼓掌。 (refer to 大紀元報:美國著名鋼琴家的成名之路)。當機會來臨時,你會舉手抓
住、還是等著別人推你一把,抑或是被強迫拱上台?

12

You might also like