65
第 第 第 第 第 第 第第 第第 (Array) (Array) 第第第第第第第第第第第第 第第第第 第第第第第第第第_____________ _____________

第 二 章 陣列 (Array)

Embed Size (px)

DESCRIPTION

第 二 章 陣列 (Array). 課程名稱: 資料結構 授課老師: _____________. 本章學習目標. 1. 讓讀者了解 一維、二維及多維陣列的結構 及 表示方法 。 2. 讓讀者了解 矩陣 中常見的 各種運算 < 轉置、相加、相乘及稀疏矩陣 >. 本章內容. 2-1 陣列的觀念 2-2 一維陣列的觀念 2-3 二維陣列的觀念 2-4 多維陣列的觀念 2-5 陣列在記憶體中的表示法 2-6 多項式 (polynomials) 2-7 矩陣 (Matrices) 2-8 特殊矩陣. 2-1 陣列的觀念. - PowerPoint PPT Presentation

Citation preview

Page 1: 第 二 章 陣列 (Array)

第 二 章第 二 章陣列陣列 (Array)(Array)

課程名稱:課程名稱:資料結構資料結構授課老師:授課老師: __________________________

Page 2: 第 二 章 陣列 (Array)

本章學習目標 本章學習目標

1.1. 讓讀者了解讓讀者了解一維、二維及多維陣列的結構一維、二維及多維陣列的結構及及表示表示

方法方法。。

2.2. 讓讀者了解讓讀者了解矩陣矩陣中常見的中常見的各種運算各種運算 << 轉置、相轉置、相

加、相乘及稀疏矩陣加、相乘及稀疏矩陣 >>

Page 3: 第 二 章 陣列 (Array)

本章內容 本章內容

2-1 2-1 陣列的觀念陣列的觀念

2-2 2-2 一維陣列的觀念一維陣列的觀念

2-3 2-3 二維陣列的觀念二維陣列的觀念

2-4 2-4 多維陣列的觀念多維陣列的觀念

2-5 2-5 陣列在記憶體中的表示法 陣列在記憶體中的表示法

2-6 2-6 多項式多項式 (polynomials)(polynomials)

2-7 2-7 矩陣矩陣 (Matrices)(Matrices)

2-8 2-8 特殊矩陣特殊矩陣

Page 4: 第 二 章 陣列 (Array)

2-1 2-1 陣列的觀念陣列的觀念

【【定義定義】】陣列陣列是指是指一群一群具有具有相同名稱相同名稱及及資料型態資料型態的的變數之集合變數之集合。。

【【特性特性】】

1.1. 佔用佔用連續記憶體空間連續記憶體空間。。

2.2. 用來表示用來表示有序串列有序串列之一種方式。之一種方式。

3.3. 各元素各元素的的資料型態皆相同資料型態皆相同。。

4.4. 支援支援隨機存取隨機存取 (Random Access)(Random Access) 與與循序存取循序存取 (Sequential (Sequential

Access)Access) 。。

5.5. 插入插入或或刪除刪除元素時元素時較為麻煩較為麻煩。因為。因為須挪移其他元素須挪移其他元素。。

Page 5: 第 二 章 陣列 (Array)

【【例如例如】】

假設我們需要假設我們需要 55 個整數變數個整數變數來存放資料時,那就必須要來存放資料時,那就必須要宣告一個宣告一個 AA

陣列陣列

為為整數型態整數型態,其,其註標註標是按照順序排列是按照順序排列從從 0~40~4 共有共有 55 項項,其含義如下:,其含義如下:

【【說明說明】】

(1)(1)AA 陣列陣列表示內表示內共有共有 55 個陣列元素個陣列元素,也就是有,也就是有 55 個變數,分別為個變數,分別為

A[0]A[0] 、、 A[1]A[1] 、、 A[2]……A[4]A[2]……A[4] 。 。

(2)(2) 每一個陣列元素每一個陣列元素可以存放可以存放一筆資料一筆資料。 。

Page 6: 第 二 章 陣列 (Array)

【【優點優點】】

(1)(1) 利用註標(利用註標( IndexIndex )可以)可以快速的輸入資料快速的輸入資料。。

輸入:輸入: for(i=0;i<5;i++) for(i=0;i<5;i++) //// 利用「迴圈結構」利用「迴圈結構」

A[i]=i*2+1; A[i]=i*2+1; //// 快速「輸入資料」到「陣列」快速「輸入資料」到「陣列」

中中

(2) (2) 利用註標(利用註標( IndexIndex ))一次一次可以可以輸出大批的資料輸出大批的資料。。

輸出:輸出: for(i=0;i<5;i++)for(i=0;i<5;i++) // // 利用「迴圈結構」利用「迴圈結構」

Print(A[i]); Print(A[i]); //// 從「陣列」一次「輸出大從「陣列」一次「輸出大

批」的資料批」的資料

Page 7: 第 二 章 陣列 (Array)

2-2 2-2 一維陣列一維陣列【【定義定義】】宣告陣列時,其括弧內的宣告陣列時,其括弧內的「註標」個數「註標」個數,只有,只有一個一個時稱為時稱為

「「一維陣列一維陣列」。」。

在一維陣列中,常使用的在一維陣列中,常使用的運算指令運算指令有有五種五種。。

1.1. 讀取讀取 (Read)(Read)

2.2. 寫入寫入 (Write)(Write)

3.3. 插入插入 (Insert)(Insert)

4.4. 刪除刪除 (Delete)(Delete)

5.5. 複製複製 (Copy)(Copy)

Page 8: 第 二 章 陣列 (Array)

1.1. 讀取讀取 (Read)(Read)【【定義定義】】利用利用註標註標(( IndexIndex )來)來「讀取」資料「讀取」資料。。

【【例如例如】】將將 AA 陣列的第二個元素陣列的第二個元素放到放到 XX 目的變數目的變數中。中。

【【寫法寫法】】 X= A[1]; X= A[1]; //// 陣列的註標是從陣列的註標是從 00 開始開始

【【圖解圖解】】

Page 9: 第 二 章 陣列 (Array)

2.2. 寫入寫入 (Write)(Write)【【定義定義】】利用利用註標註標(( IndexIndex )來)來「寫入」資料「寫入」資料。。

【【例如例如】】將將數值數值 5050 寫入寫入到到陣列的第二個索引位置陣列的第二個索引位置中。中。

【【寫法寫法】】 A[1]=50;A[1]=50; // // 陣列的註標是從陣列的註標是從 00 開始開始

【【圖解圖解】】

Page 10: 第 二 章 陣列 (Array)

3.3. 插入插入 (Insert)(Insert)【【定義定義】】在指定的在指定的註標註標 i i 的位置的位置插入插入一項新元素一項新元素,,原來註標原來註標 i i 和和

之後的元素之後的元素都必須要再都必須要再往後挪移一個位置往後挪移一個位置。。

【【例如例如】】將在將在註標註標 11 的位置的位置插入插入一項新元素一項新元素 (15)(15) 。。【【演算法演算法】】

01

02

03

04

05

06

07

08

09

10

11

12

Procedure ArrayInsert(int A[],int Max,int i ,int value)

Begin

If(i>0 && i<=Max) // 判斷欲插入位置 i 是否存在,如果有,則{

for(count=Max-1;count>i;count--) //i 位置及後面的元素逐一往後挪 A[count]=A[count-1];

A[i]=value; // 最後再將新元素插入到第 i 位置}

Else // 如果欲插入位置 i 不存在,則 Return 0; // 傳回 0

End

End Procedure

Page 11: 第 二 章 陣列 (Array)

3.3. 插入插入 (Insert)(Insert)(( 續續 ))

【【圖解圖解】】

【【說明說明 】 】

首先將首先將 3030 往後挪移一個位置,再將往後挪移一個位置,再將 A[1]A[1] 的元素的元素 2020 ,往後挪移,往後挪移

放到放到 A[2]A[2] 位置中,最後再插入位置中,最後再插入 1515 到到 A[1]A[1] 中。中。

Page 12: 第 二 章 陣列 (Array)

4.4. 刪除刪除 (Delete)(Delete)【【定義定義】】指指刪除刪除指定的指定的註標註標 i i 位置的元素位置的元素,,原來註標原來註標 ii 的元素被刪的元素被刪

除除,,

為了避免浪費記憶體空間,因此,為了避免浪費記憶體空間,因此,之後的元素之後的元素都必須要都必須要

再往再往

前挪一個位置前挪一個位置。。

【【例如例如】】將在將在註標註標 11 的位置的位置刪除一項刪除一項舊元素舊元素 (20)(20) 。。

【【演算法演算法】】

010203040506070809101112

Procedure ArrayDelete(int A[],int Max,int i) Begin If(i>0 && i<=Max) // 判斷欲刪除元素位置 i 是否存在,如果有,則{ for(count=i;count<Max-1;count++) //i 位置後面的元素逐一往前挪 A[count]=A[count+1]; A[Max-1]=0; // 最後再將 0 放到最後一個位置} Else // 如果欲插入位置 i 不存在,則 Return 0; // 傳回 0End End Procedure

Page 13: 第 二 章 陣列 (Array)

4.4. 刪除刪除 (Delete) (Delete) (( 續續 ))

【【圖解圖解】】

【【說明說明】】

首先將首先將 A[1]A[1] 的元素的元素 2020 刪除,再將刪除,再將 A[2]A[2] 的元素的元素 3030 往前挪移一個往前挪移一個

位置,位置,

最後再寫入最後再寫入 00 到到 A[2]A[2] 中。中。

Page 14: 第 二 章 陣列 (Array)

5.5. 複製複製 (Copy)(Copy)【【定義定義】】指將「指將「來源陣列」的元素內含值來源陣列」的元素內含值全部全部逐一逐一 copycopy 到到

「「目的陣列目的陣列」。」。

【【例如例如】】將將 AA 陣列的元素內含值陣列的元素內含值全部全部逐一逐一 copycopy 到到 BB 陣列陣列中。中。

【【演算法演算法】】0102030405060708091011

Procedure ArrayCopy(int A[],int B[], int Max) Begin If(Max>0) // 判斷陣列是否有元素內含值,如果有,則{ for(count=0;count<Max-1;count++) //A 陣列全部逐一 copy 到 B 陣列 B[count]=A[count];} Else // 如果陣列沒有元素,則 Return 0; // 傳回 0End End Procedure

Page 15: 第 二 章 陣列 (Array)

5.5. 複製複製 (Copy)(Copy) ( ( 續續 ))

【【圖解圖解】】

【【說明說明】】

AA 陣列的元素內含值全部逐一陣列的元素內含值全部逐一 copycopy 到到 BB 陣列中,例如陣列中,例如 A[0]A[0] 元元

素會被素會被 copycopy 到到 B[0]B[0] 中,中, A[1]A[1] 元素放到元素放到 B[1]B[1] 中,以此類推。中,以此類推。

Page 16: 第 二 章 陣列 (Array)

2-2.1 2-2.1 陣列的宣告陣列的宣告

(1) (1) 變數宣告變數宣告 intint A, B, C; A, B, C; //// 宣告三個變數宣告三個變數 (A,B,C)(A,B,C) 為整數型態為整數型態

圖圖 2-1 2-1 不連續的記憶體空間的配置不連續的記憶體空間的配置

說明:以上說明:以上三個變數三個變數與與變數變數之間都是之間都是個別獨立個別獨立的的記憶體空間記憶體空間。。

Page 17: 第 二 章 陣列 (Array)

2-2.1 2-2.1 陣列的宣告陣列的宣告 (( 續續 ))

(2) (2) 陣列宣告陣列宣告

int A[3]; int A[3]; //// 宣告一維陣列宣告一維陣列 AA ,共有,共有 A[0]A[0] 、、 A[1]A[1] 、、 A[2]A[2] 三三

個元素個元素

圖圖 2-2 2-2 連續的記憶體空間的配置連續的記憶體空間的配置

說明:說明:

以上以上三個記憶體空間三個記憶體空間,可以讓我們,可以讓我們連續儲存多項資料連續儲存多項資料

,並且,並且資料資料與與資料資料之間都是之間都是按照順序排列按照順序排列的記憶體空間。 的記憶體空間。

Page 18: 第 二 章 陣列 (Array)

2-2.2 2-2.2 陣列的儲存方式陣列的儲存方式【【定義定義】】陣列名稱陣列名稱之後加上之後加上“註標”“註標”即可即可存取陣列元素存取陣列元素。。

【【舉例舉例】】宣告一個宣告一個 A[3]A[3] 的陣列,並分別儲存的陣列,並分別儲存 10,20,3010,20,30

int A[3];int A[3];

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

A[i]=(i+1)*10; A[i]=(i+1)*10; //// 指把指把 1010 指定給指定給 AA 陣列中的第陣列中的第 00 項項

的資料中的資料中

Page 19: 第 二 章 陣列 (Array)

【【實例實例】】請依序輸入六位同學的成績到陣列中,並計算及輸出「總和」請依序輸入六位同學的成績到陣列中,並計算及輸出「總和」

第一種寫法:第一種寫法:使用陣列,但未使用使用陣列,但未使用 forfor 迴圈演算法 迴圈演算法 未使用 for迴圈演算法

Page 20: 第 二 章 陣列 (Array)

第二種寫法第二種寫法::使用陣列,並且使用使用陣列,並且使用 forfor 迴圈演算法 迴圈演算法 (( 最佳最佳 ) )

使用 for迴圈演算

Page 21: 第 二 章 陣列 (Array)

2-3 2-3 二維陣列的觀念二維陣列的觀念

在前面所介紹在前面所介紹一維陣列一維陣列,可以視為,可以視為直線方式直線方式來存取資料,這對於來存取資料,這對於

一般的問題都可以順利的處理,但是對於一般的問題都可以順利的處理,但是對於比較複雜的問題比較複雜的問題時,那就必時,那就必

須要須要使用二維陣列使用二維陣列來處理。來處理。否則否則會會增加程式的複雜度增加程式的複雜度。。

例如:計算例如:計算 44 位同學位同學的的 55 科成績科成績之總分與平均的問題。 之總分與平均的問題。

Page 22: 第 二 章 陣列 (Array)

【【定義定義】】宣告陣列時,其括弧內的宣告陣列時,其括弧內的「註標」個數「註標」個數,有,有兩個兩個時稱為時稱為

「「二維陣列二維陣列」。」。

【【語法語法】】資料型態 陣列名稱資料型態 陣列名稱 [[MM][][NN]; ];

【【說明說明】】 MM 代表代表列數列數,, NN 代表代表行數行數

【【存取方法存取方法】】利用二維陣列中的利用二維陣列中的兩個註標兩個註標來表示。來表示。

2-3 2-3 二維陣列的觀念二維陣列的觀念 (( 續續 ))

Page 23: 第 二 章 陣列 (Array)

【【宣告宣告】】 int Score[4][5]; int Score[4][5];

//// 列列註標表示範圍: 註標表示範圍: 0~3 0~3 共有共有 44 列列

//// 行行註標表示範圍: 註標表示範圍: 0~4 0~4 共有共有 55 行行

說明:利用二維陣列中的說明:利用二維陣列中的兩個註標兩個註標來表示。來表示。

2-3 2-3 二維陣列的觀念二維陣列的觀念 (( 續續 ))

44 列列

55 行行

Page 24: 第 二 章 陣列 (Array)

2-4 2-4 多維陣列的觀念多維陣列的觀念【【定義定義】】宣告陣列時,其括弧內的宣告陣列時,其括弧內的「註標」個數「註標」個數,是,是二個以上二個以上時,時,

就稱為「就稱為「多維陣列多維陣列」。其中」。其中最常見是三維陣列最常見是三維陣列,其圖形,其圖形

為為

三度空間三度空間的的立體圖形立體圖形,並且我們可以將,並且我們可以將三維陣列三維陣列視為視為多多

個個

二維陣列二維陣列的組合。的組合。

【【語法語法】】資料型態 陣列名稱資料型態 陣列名稱 [[LL][][MM][][NN]; ];

【【說明說明】】 LL 代表代表二維陣列個數二維陣列個數

MM 代表代表列數列數

NN 代表代表行數行數

Page 25: 第 二 章 陣列 (Array)

【【舉例舉例】】設計有某一個大學,設計有某一個大學, 33 次月考次月考,全班,全班 44 位同學位同學的的 55 科目成績科目成績

時。 時。

利用利用三維陣列三維陣列來存取每人學生的成績。來存取每人學生的成績。

【【說明說明】】

此例子中此例子中 ScoreScore 陣列陣列共有共有三個註標三個註標,故,故 ScoreScore 陣列是一個陣列是一個三維 陣列三維 陣列。。

//// 其中,其中,第一個註標第一個註標為:為:二維陣列的個數二維陣列的個數: : 0~2 0~2 共有共有 33 個二維陣列個二維陣列

第二個註標第二個註標為:為:列註標列註標表示範圍: 表示範圍: 0~3 0~3 共有共有 44 列列

第三個註標第三個註標為:為:行註標行註標表示範圍: 表示範圍: 0~4 0~4 共有共有 55 行行

Page 26: 第 二 章 陣列 (Array)

【【圖解圖解】】

【【說明說明】】宣告宣告 ScoreScore 是由是由 33 個個 (0~2)(0~2) 二維陣列二維陣列,每個二維陣列包含,每個二維陣列包含

44 列列

(0~3)(0~3) ,, 55 行行 (0~4)(0~4) 組合而成的整數三維陣列。並且共組合而成的整數三維陣列。並且共

計有計有

3×4×53×4×5 == 6060 元素。元素。

44 列列

55 行行

33 個二維個二維

Page 27: 第 二 章 陣列 (Array)

2-5 2-5 陣列在記憶體中的表示法陣列在記憶體中的表示法

陣列陣列是由是由一連串的記憶體一連串的記憶體組合而成,其組合而成,其陣列元素陣列元素之之儲存位址計算儲存位址計算,,大致上,可分為大致上,可分為一維陣列一維陣列與與二維陣列二維陣列來說明:來說明:ⅠⅠ. . 一維陣列一維陣列 [[ 題目題目 1]1] 若若陣列陣列 AA 有有 NN 個元素個元素,其陣列的,其陣列的起始位址為起始位址為 LoLo ,並且,並且索索

引值引值 從從 00 開始開始,, d d 為元素大小為元素大小,則,則 A[i]A[i] 的起始位置的起始位置為多少?為多少?

令:令: LoLo 為為起始位址起始位址 dd 為為元素大小元素大小 則則 A[i]A[i] 之位置計算之位置計算 ==Lo+i*dLo+i*d

LO+(2-0)*d

Page 28: 第 二 章 陣列 (Array)

【【舉例舉例】】假設假設每一個整數每一個整數佔用佔用 22 個個 bytebyte ,若,若 AA 陣列的起始位址陣列的起始位址是是

100100 開 開

始,則始,則 A[5]A[5] 的起始位址的起始位址為多少?為多少?

令:令:起始位址起始位址 Lo=100Lo=100

元素大小元素大小 d=2d=2

則則 A[5]A[5] 之位置計算之位置計算 =Lo+i*d =100+5*2=100+10=110=Lo+i*d =100+5*2=100+10=110

Page 29: 第 二 章 陣列 (Array)

[[ 題目題目 2]2] 若若陣列陣列 AA 的的索引從索引從 LL 到到 UU ,其陣列的,其陣列的起始位址為起始位址為 LoLo ,,

dd 為元素大小為元素大小,則,則 A[i]A[i] 的起始位置的起始位置為多少?為多少?

宣告方式:宣告方式: A[L…U]A[L…U]

令:令: LoLo 為為起始位址起始位址 dd 為為元素大小元素大小 則則 A[i]A[i] 之位置計算之位置計算 ==Lo+(i-L)*dLo+(i-L)*d

Page 30: 第 二 章 陣列 (Array)

【【舉例舉例】】假設假設每一個整數每一個整數佔用佔用 22 個個 bytebyte ,若,若 A[10]A[10] 起始位址起始位址是是 200200

開始, 開始,

則則 A[20]A[20] 的位址的位址為多少?為多少?

令:令: LoLo 起始位址起始位址 =200 =200

dd 元素大小元素大小 =2=2

則則 A[20]A[20] 之位置計算之位置計算 =Lo+(i-L)*d =200+(20-=Lo+(i-L)*d =200+(20-

10)*2=200+10*2=22010)*2=200+10*2=220

Page 31: 第 二 章 陣列 (Array)

ⅡⅡ. . 二維陣列二維陣列

宣告方式:宣告方式: A[A[0…M-10…M-1, , 0…N-10…N-1]]

其中:其中: MM 代表代表列數列數 (Row)(Row) ,,橫向橫向。。

NN 代表代表行數行數 (Column)(Column) ,,縱向縱向。。

所以,共有所以,共有 M*NM*N 格。格。

說明:說明:圖圖的儲存位置:的儲存位置: A[1,4]A[1,4] △ △ 圖圖的儲存位置:的儲存位置: A[2,1]A[2,1] 圖圖的儲存位置:的儲存位置: A[M-1,N-2]A[M-1,N-2]

Page 32: 第 二 章 陣列 (Array)

2-5.1 Row-major(2-5.1 Row-major( 以列為以列為主主 ))

【【定義定義】】以列為主以列為主的的二維陣列二維陣列要轉為要轉為一維陣列一維陣列時,是將時,是將二維陣列二維陣列

「由上往下」「由上往下」一列一列一列一列讀入讀入一維陣列一維陣列。亦即將二維陣列。亦即將二維陣列

儲存儲存

的的邏輯位置邏輯位置轉換成轉換成實際電腦中主記憶體的存儲方式實際電腦中主記憶體的存儲方式。。

【【圖解圖解】】

Page 33: 第 二 章 陣列 (Array)

【【以列為主以列為主的的儲存公式儲存公式】】

令令 LoLo 為為起始位址起始位址dd 為為元素大小元素大小 則則二維陣列二維陣列 A[i,j]A[i,j] 位置位置會儲存到會儲存到一維陣列一維陣列的那一個位置呢?的那一個位置呢? 公式公式 =Lo+[=Lo+[i*Ni*N+j]*d+j]*d

NN 行行

ii 列列

Page 34: 第 二 章 陣列 (Array)

2-5.2 Column-major(2-5.2 Column-major( 以行以行為主為主 ))

【【定義定義】】以行為主以行為主的的二維陣列二維陣列要轉為要轉為一維陣列一維陣列時,必須將時,必須將二維陣列二維陣列

「「由左往右由左往右」」一行一行一行一行讀入讀入一維陣列一維陣列。亦即將二維陣列。亦即將二維陣列

儲存的儲存的邏輯位置邏輯位置轉換成轉換成實際電腦中主記憶體的存儲方式實際電腦中主記憶體的存儲方式。。

【【圖解圖解】】

Page 35: 第 二 章 陣列 (Array)

【【以行為主以行為主的的儲存公式儲存公式】】

令令 LoLo 為為起始位址起始位址dd 為為元素大小元素大小 則則二維陣列二維陣列 A[i,j]A[i,j] 位置會儲存到位置會儲存到一維陣列一維陣列的那一個位置呢?的那一個位置呢? 公式公式 =Lo+[=Lo+[j*Mj*M+i]*d+i]*d

MM 列列

JJ行行

Page 36: 第 二 章 陣列 (Array)

2-6 2-6 多項式多項式(polynomials)(polynomials)

多項式多項式 (polynomial)(polynomial) 的的表示式為 表示式為

其中其中 AiAi 為為非零項非零項的的係數係數,且,且多項式多項式的的每一項每一項均使用均使用三個欄位來表示三個欄位來表示

(( 分別為 分別為 coef, exp, link) coef, exp, link) 。其節點的資料結構如下所示: 。其節點的資料結構如下所示:

其中:其中: CoefCoef :表示:表示該變數該變數的的係數係數

ExpExp :表示:表示該變數該變數的的指數指數

LinkLink :表示:表示指向下一個節點指向下一個節點的的指標指標

Page 37: 第 二 章 陣列 (Array)

【【表示方法表示方法】】

【【方法一方法一】】依照依照指數高低指數高低依序儲存依序儲存係數係數

【【方法二方法二】】只儲存只儲存非零項次非零項次的的係數係數與與指數指數

Page 38: 第 二 章 陣列 (Array)

【【方法一方法一】】依照依照指數高低指數高低依序儲存依序儲存係數係數

【【作法作法】】假設假設最高指數最高指數為為 nn ,則準備一個,則準備一個一維陣列一維陣列 A[1..n+2]A[1..n+2] ,,

其內容如下:其內容如下:

Page 39: 第 二 章 陣列 (Array)

【【練習練習】】假設假設 f(x)=7Xf(x)=7X44+5X+5X22+3X+3X

因為因為最高指數最高指數為為 44 ,則準備一個,則準備一個一維陣列一維陣列 A[1..6]A[1..6] ,,

【【解答解答】】

步驟一步驟一:準備一個:準備一個一維陣列一維陣列 A[1..6]A[1..6]

步驟二步驟二:存入最高指數存入最高指數及及分別存入分別存入 Xn, Xn-1,…,X0 之係數之係數

沒有 X3 沒有 X0 ,亦常數項

Page 40: 第 二 章 陣列 (Array)

【【優點優點】】

(1)(1) 只要只要儲存係數儲存係數,比較,比較節省儲存指數空間節省儲存指數空間。。

(2)(2) 適用適用於於零項次零項次較少較少的多項式。的多項式。

【【缺點缺點】】

不適用不適用於於零項次零項次極多極多的多項式,的多項式,儲存時非常浪費空間儲存時非常浪費空間。。

Ex: f(X)=5XEx: f(X)=5X100100+1 +1

則必須要準備一個則必須要準備一個一維陣列一維陣列 A[1..102]A[1..102] ,在實際使用上只用了,在實際使用上只用了

33 格格,因此,會,因此,會浪費浪費 9999 格格。。

Page 41: 第 二 章 陣列 (Array)

【【方法二方法二】】只儲存只儲存非零項次非零項次的的係數與指數係數與指數

【【作法作法】】假設多項式有假設多項式有 KK 個非零項次個非零項次,則準備一個,則準備一個一維陣列 一維陣列

A[1..2K+1]A[1..2K+1] ,其內容如下:,其內容如下:

Page 42: 第 二 章 陣列 (Array)

【【練習練習】】假設假設 f(X)=5Xf(X)=5X100100+1+1

因為有因為有 22 個非零項次個非零項次,則準備一個,則準備一個一維陣列一維陣列 A[1..5]A[1..5]

【【解答解答】】

步驟一步驟一:準備一個:準備一個一維陣列一維陣列 AA

步驟二步驟二:存入:存入 KK 、、係數係數及及指數指數

【【優點優點】】適用適用於於零項次零項次極多極多的多項式。的多項式。

【【缺點缺點】】當當非非零項次零項次極多時,極多時,不適用不適用。。

22 個非零項次個非零項次

Page 43: 第 二 章 陣列 (Array)

2-7 2-7 矩陣矩陣 (Matrices)(Matrices)

【【定義定義】】

類似類似二維陣列二維陣列,它是利用一個,它是利用一個 m m ×× n n 矩陣矩陣來表示這個來表示這個矩陣矩陣擁有擁有

mm 列(列( RowsRows )和)和 nn 行(行( ColumnsColumns )。)。

一般而言,一般而言,資料結構資料結構上常用到的上常用到的矩陣有四種矩陣有四種::

1. 1. 矩陣轉置矩陣轉置 (Matrix Transposition)(Matrix Transposition)

2. 2. 矩陣相加矩陣相加 (Matrix Addition)(Matrix Addition)

3. 3. 矩陣相乘矩陣相乘 (Matrix Multiplication)(Matrix Multiplication)

4. 4. 稀疏矩陣稀疏矩陣 (Sparse Matrix)(Sparse Matrix)

Page 44: 第 二 章 陣列 (Array)

2-7.1 2-7.1 矩陣轉置矩陣轉置 (Matrix (Matrix Transposition)Transposition)

【【定義定義】】

假設有一個假設有一個 (m × n)(m × n) 矩陣矩陣 AA ,則我們可以將,則我們可以將 AA 矩陣矩陣轉置轉置為為 (n × m)(n × m)

的的 BB 矩矩

陣陣,並且,並且 BB 矩陣矩陣的的第第 jj 列第列第 ii 行的元素行的元素等於等於 AA 矩陣矩陣的的第第 ii 列第列第 jj 行的元行的元

素素,,

以數學式來表示為:以數學式來表示為: Bji=Aij

Page 45: 第 二 章 陣列 (Array)

【【假設假設】】 AA 矩陣與矩陣與 BB 矩陣的矩陣的 mm 與與 nn 都是從都是從 11 開始計算,因開始計算,因

此,此, A,BA,B 矩陣矩陣

的表示如下:的表示如下:

說明:說明: AA 矩陣矩陣的的第第 ii 列第列第 jj 行的元素行的元素等於等於 BB 矩陣矩陣的的第第 jj 列第列第 ii 行的元行的元

素素

Page 46: 第 二 章 陣列 (Array)

【【演算法演算法】】

「矩陣轉置」之演算法01

02

03

04

05

06

07

08

Procedure Matrix_Transpose(int m, int n, int A[m][n],

int B[n][m])

Begin

for(i = 1; i <= m; i++) //外迴圈,先掃瞄第 1 列到第m 列 for(j = 1; j <= n; j++) // 內迴圈,再掃瞄第 1 行到第 n 行// 將 A 陣列的第 i 列第 j 行的元素放到 B 陣列的第 j 列第 i 行的元素中 B[j][i] = A[i][j];

End

End Procedure

Page 47: 第 二 章 陣列 (Array)

2-7.2 2-7.2 矩陣相加矩陣相加 (Matrix Addition)(Matrix Addition)

【【定義定義】】

假設假設 A,BA,B 都是都是 (m × n)(m × n) 矩陣矩陣,則我們可以將,則我們可以將 AA 矩陣矩陣加上加上 BB 矩陣矩陣以以

得到得到

一個一個 CC 矩陣矩陣,並且此,並且此 CC 矩陣矩陣亦為亦為 (m × n)(m × n) 矩陣矩陣。因此:。因此:

在在 CC 矩陣矩陣上的上的第第 ii 列第列第 jj 行的元素行的元素必定等於必定等於 AA 矩陣矩陣的的第第 ii 列第列第 jj 行的元行的元

素素加上加上

BB 矩陣矩陣的的第第 ii 列第列第 jj 行的元素行的元素。。

以數學式來表示為:以數學式來表示為: Cij== Aij++Bij

Page 48: 第 二 章 陣列 (Array)

【【假設假設】】 AA 、、 BB 、、 CC 矩陣的矩陣的 mm 與與 nn 都是從都是從 11 開始計算,因開始計算,因

此,此, A,BA,B 兩個矩 兩個矩

陣相加等於陣相加等於 CC 矩陣,其表示如下: 矩陣,其表示如下:

+

Page 49: 第 二 章 陣列 (Array)

+

Page 50: 第 二 章 陣列 (Array)

【【演算法演算法】】

「矩陣相加」之演算法01

02

03

04

05

06

07

08

09

Procedure Matrix_Add(int m, int n, int A[m][n], int B[m][n],

int C[m][n])

Begin

for(i = 1; i <= m; i++) //外迴圈,先掃瞄第 1 列到第m 列 for(j = 1; j <= n; j++) // 內迴圈,再掃瞄第 1 行到第 n 行 /*將 A 陣列的第 i 列第 j 行的元素加上 B 陣列的第 i 列第 j 行的元素之後, 放到 C 陣列的第 i 列第 j 行的元素中 */

C[i][j] = A[i][j] + B[i][j];

End

End Procedure

Page 51: 第 二 章 陣列 (Array)

2-7.3 2-7.3 矩陣相乘矩陣相乘 (Matrix (Matrix Multiplication)Multiplication)

【【定義定義】】

假設假設 AA 為為 (m × n)(m × n) 矩陣矩陣,而,而 BB 為為 (n × p)(n × p) 矩陣矩陣,則我們可以將,則我們可以將 AA 矩矩

陣陣乘上乘上

BB 矩陣矩陣以得到一個以得到一個 (m × p)(m × p) 的的 CC 矩陣矩陣,因此,在,因此,在 CC 矩陣矩陣上的上的第第 ii 列第列第

jj 行的元行的元

素素必定等於必定等於 AA 矩陣的第矩陣的第 ii 列列乘上乘上 BB 矩陣的第矩陣的第 jj 行行 (( 兩個向量的內積兩個向量的內積 )) ,,

以數以數

學式來表示為: 學式來表示為:

n

kkjikij BAC

1

Page 52: 第 二 章 陣列 (Array)

【【假設假設】】 AA 、、 BB 、、 CC 矩陣的矩陣的 mm 與與 nn 都是從都是從 11 開始計算,因開始計算,因

此,此, A,BA,B 兩個矩兩個矩

陣相乘等於陣相乘等於 CC 矩陣,其表示如下:矩陣,其表示如下:×

Page 53: 第 二 章 陣列 (Array)

×

1*1+2*1+3*0=3

Page 54: 第 二 章 陣列 (Array)

【【演算法演算法】】

「矩陣相乘」之演算法

01

02

03

04

05

06

07

08

09

10

11

12

13

Procedure Matrix_Mul(int m, int n, int p, int A[m][n], int B[n][p], int C[m][p])

Begin

for(i = 0; i < m; i++) //外迴圈,先掃瞄第 1 列到第m 列 for(j = 0; j < n; j++) // 內迴圈,再掃瞄第 1 行到第 n 行 {

C[i][j]=0;

/* 將 A 矩陣的第 i 列第 j 行的元素加上 B 矩陣的第 i 列第 j 行的元素的結果放到 C 矩陣上的第 i 列第 j 行的元素中 */

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

C[i][j] = C[i][j] + A[i][k] * B[k][j];

}

End

End Procedure

Page 55: 第 二 章 陣列 (Array)

2-7.4 2-7.4 稀疏矩陣稀疏矩陣 (Sparse (Sparse Matrix)Matrix)

【【定義定義 】 】 是指是指矩陣矩陣中中大部份元素大部份元素都都沒有使用沒有使用,,元素稀稀落落元素稀稀落落,,

所以稱為所以稱為稀疏矩陣稀疏矩陣。。

【【概念概念】】在在 M × N M × N 的矩陣中,的矩陣中,多數的資料值多數的資料值為為00。。

【【處理方法處理方法】】

【【方法一方法一】】直接利用直接利用 M × NM × N 的二維陣列的二維陣列來來一一對應儲存一一對應儲存。。

【【方法二方法二】】利用利用 3-tuple3-tuple 結構結構來儲存來儲存非零元素非零元素

Page 56: 第 二 章 陣列 (Array)

【【方法一方法一】】直接利用直接利用 M × NM × N 的二維陣列的二維陣列來來一一對應儲存一一對應儲存。。

【【缺點缺點】】

1. 1. 浪費空間浪費空間:因為:因為多數為0多數為0。。

2. 2. 浪費時間浪費時間:因為要處理一些:因為要處理一些不必要的計算不必要的計算。。

55 個非零元個非零元素素

多數為0,所以浪費「空間」與「時間」多數為0,所以浪費「空間」與「時間」

Page 57: 第 二 章 陣列 (Array)

【【方法二方法二】】利用利用 3-tuple3-tuple 結構結構來儲存來儲存非零元素非零元素

【【作法作法】】假設有一個假設有一個 M*NM*N 的稀疏矩陣的稀疏矩陣中共有中共有 KK 個非零元素個非零元素,則必須,則必須

要要

準備一個二維陣列準備一個二維陣列 A[0..K,0..2]A[0..K,0..2]

【【優點優點】】只儲存非0只儲存非0之資料,因此,可以之資料,因此,可以減少記憶體空間減少記憶體空間的的浪費浪費。。

(K+1)(K+1) 列列

33 行行

Page 58: 第 二 章 陣列 (Array)

44 列列

33 行行

55 個非零元素個非零元素

Page 59: 第 二 章 陣列 (Array)

2-8 2-8 特殊矩陣特殊矩陣

在前面已經介紹資料結構中,在前面已經介紹資料結構中,常用常用的的四種矩陣四種矩陣之外,我們在本單元之外,我們在本單元

中,將介紹比較中,將介紹比較特殊的矩陣特殊的矩陣,例如:,例如:上、下三角矩陣上、下三角矩陣。。

Page 60: 第 二 章 陣列 (Array)

2-8.1 2-8.1 上三角矩陣上三角矩陣 (Upper-Triangular (Upper-Triangular Matrix)Matrix)

(( 一一 )) 定義:定義:

上三角矩陣上三角矩陣是矩陣在是矩陣在對角線以下對角線以下的的元素均為元素均為 00 ,即,即 Aij = 0 , i > j。

Page 61: 第 二 章 陣列 (Array)
Page 62: 第 二 章 陣列 (Array)

(( 三三 )) 上三角上三角矩陣的儲存矩陣的儲存

Page 63: 第 二 章 陣列 (Array)

2-8.2 2-8.2 下三角矩陣下三角矩陣 (Lower-Triangular (Lower-Triangular Matrix)Matrix)

(( 一一 )) 定義:下三角矩陣是矩陣在對角線以上的元素均為定義:下三角矩陣是矩陣在對角線以上的元素均為 00 ,,

即即 Aij = 0 , i < j。

Page 64: 第 二 章 陣列 (Array)
Page 65: 第 二 章 陣列 (Array)

(( 三三 )) 下三角下三角矩陣的儲存矩陣的儲存