470 likes | 978 Views
資料結構與演算法. 課程教學投影片. 第二章–陣列. 2-1 何謂陣列 2-2 陣列型式和計量 2-3 陣列的走訪 2-4 矩陣運算. 2-1 何謂陣列 2-1-1 陣列概觀. 陣列的結構: 使用陣列( Array )來宣告變數時,則可以一次產生多個型態相同的資料,且可以利用迴圈結構中的註標( index )方便地指定到陣列中的位置取得資料,簡化程式的流程 程式範例: CH02-01 輸出: 1!+2!+3!+4!+5! 的加總值. 2-1-2 陣列結構. 陣列的定義:
E N D
資料結構與演算法 課程教學投影片
第二章–陣列 • 2-1 何謂陣列 • 2-2 陣列型式和計量 • 2-3 陣列的走訪 • 2-4 矩陣運算
2-1 何謂陣列2-1-1 陣列概觀 • 陣列的結構:使用陣列(Array)來宣告變數時,則可以一次產生多個型態相同的資料,且可以利用迴圈結構中的註標(index)方便地指定到陣列中的位置取得資料,簡化程式的流程 • 程式範例:CH02-01輸出:1!+2!+3!+4!+5!的加總值
2-1-2 陣列結構 • 陣列的定義: 一組具有相同資料型態(data type)的元素所組成的有序集合(ordered set)。在電腦中的實體配置空間時,陣列通常儲存在一塊連續的記憶體中。陣列包含名稱和註標,註標只有一個時稱為一維陣列,註標有二個時稱為二維陣列,以此類推,有n個註標稱為n維陣列。
2-1-2 陣列結構 • 陣列的特性: • 連續的記憶體空間 • 搭配一個以上的註標(index)可以方便存取陣列中的資料 • 有一維陣列,二維陣列..可擴充至n維陣列 • 在生活上的應用很多,比如使用電腦系統中符號表和記憶體的對應,可以快速的存取記憶體中的資料
2-1-2 陣列結構 • 陣列的宣告
2-1-2 陣列結構 • 陣列通常儲存在一塊連續的記憶體中 • 符號表中主要有三個項目:名稱、長度及位址 • 陣列名稱所包含的長度則是「資料型態的長度×陣列的空間個數」
2-2 陣列型式和計量 • 陣列形式是指在陣列中所存放元素的資料型態,例如整數,字元等等。 • 陣列計量是指計算陣列的儲放空間數,(或稱個數)或所佔位元組數。
2-2-1 一維陣列 • 一維陣列的宣告範例: int A[]=new int[10] — Java語言,範圍從0到9 int A[10] — C語言,範圍從0到9 Dim A(10) As Integer — VB ,範圍從0到10 • 如果是Visual Basic 6.0版本,則其註標範圍可能是從0到10,也可能是從1到10,則陣列的空間個數可能為11或10個。 • VB.NET、VB 2005版本,其註標範圍是從0到10,因為已捨去Option Base敘述,且內定起始註標是0,所以陣列的空間個數為11。 • 一個陣列存放1、3、5、7、9的奇數為例: Sub odd_array2 Dim i , odd2(5) as integer For i = 1 to 5 odd2(i) = 2 * i - 1 Next i End Sub
2-2-1 一維陣列 • 一維陣列位址計算:odd2[0]的位址= kodd2[1]的位址= k + 1*2 = k + 2odd2[2]的位址= k + 2*2 = k + 4odd2[3]的位址= k + 3*2 = k + 6
2-2-2 二維陣列 • 二維陣列的宣告範例: int A[][]=new int[10][10] — Java語言 int A[10][10] — C語言 Dim A(10,10) As Integer — VB
2-2-2 二維陣列 • 轉換二維空間為一維空間時,其編號方式有兩種: • 以列為主(row major):由i列要跳至(i+1)列時,必須先走訪完i列,即列先走訪,由左而右,再由上而下。 • 以行為主(column major):由上而下,再由左而右。
2-2-2 二維陣列 • 範例1 Java語言宣告short NO[][]=new short[2][4](以列為主);如果起始位址182010,則陣列NO存放在記憶體中的情形如何?又NO[i][j]的序號為何?位址為何?
2-2-3 三維陣列 • 三維陣列的宣告範例: int A[][][]=new int[10][10][10] — Java語言 int A[10][10][10] — C語言 Dim A(10,10,10) As Integer — VB • 如果Java語言宣告一陣列為byte sym[][][]=new byte[m][n][p],且sym的起始位址是a,資料型態的位元組數是b時,則序號可用f(i,j,k)、位址可用addr(i,j,k)來表示,則f(i,j,k)與addr(i,j,k)的關係如下:
2-2-3 三維陣列 • 三維陣列sym [m][n][p]是先走訪p,再走訪n,最後走訪m,如圖2-8所示,所以由(0,0,0)到(0,0,p-1)時,走訪過p個陣列,由(0,0,0)到(0,n-1,p-1)時走訪過n*p個,從(0,0,0)到(i-1,n-1,p-1)時走訪過i*n*p個(即圖2-8所示的體積)
2-2-3 三維陣列 • 範例2: 宣告一個陣列byte A[][][]=new byte[2][3][4],且A的起始位址是1234,則A[0][2][3]的位址為何?A[i][j][k]的位址為何?
2-2-3 三維陣列 • 範例2:(程式範例2-2)在VB程式設計中,示範宣告陣列的方式,且用陣列的成員函數取得陣列的維數、個數、下限值、上限值等。
2-2-4 對角線陣列 • 對角線陣列
2-2-5 上下三角形陣列 • 當一個陣列的所有元素皆放在對角線的上方時,其餘者放0,則此陣列稱為上三角形(upper triangular)陣列 • 下三角形陣列同理
2-2-5 上下三角形陣列 • 一個上下三角形矩陣n×n,其總個數為n2個,存放資料的個數可由數學公式推演得知1+2+3+...+n=
2-2-6 三對角線陣列 • 三對角線陣列(tridiagonal array)是一個方形陣列,且其中只在主對角線及其相鄰的上下二條對角線存在資料,其餘者皆是0,則此陣列共可存放n+(n-1)+(n-1)=3n-2個資料
2-2-6 三對角線陣列 • 如果[0][0]位置的編號是0,則 | i - j | ≤ 1,[i][j]位置的編號f(i,j)=2i+j,如圖2-14。
2-2-7 方形帶狀陣列 • 方形帶狀陣列(square band array)是一個n×n的方形矩陣,其中對角線和上下距離a的對角線皆可存放資料,其餘皆為0,則此陣列共可存放(2an+n-a2–a)個
2-3 陣列的走訪2-3-1 一維陣列的走訪 • 一維陣列走訪:一維陣列的走訪只要是利用一個迴圈,走訪方法有由小到大,由大到0、奇數、偶數和索引表走訪 • 範例5:【由小到大走訪】設計一個陣列NO[10],陣列分別存入 的值,0≦i≦9,即NO[i]= ,NO[0]=0 '計算陣列的值 iSum(0) = 0 For i = 1 To 10 iSum(i) = iSum(i - 1) + i Next '循序走訪陣列 0~10 For i = 0 To 10 Console.WriteLine("iSum(" & i & ") = " & iSum(i)) Next
2-3-1 一維陣列的走訪 • 範例6:設計一個陣列iExp(10),由小而大分別放入20,21………..,27,28,29的值。 '計算陣列的值 iExp(0) = 1 For i = 1 To 10 iExp(i) = iExp(i - 1) * 2 Next '循序走訪陣列 0~10 For i = 0 To 10 Console.WriteLine("iExp(" & i & ") = " & iExp(i)) Next
2-3-1 一維陣列的走訪 • 範例7:【偶數順序、奇數順序走訪】設計一陣列iNo(10),在其偶數註標(含0)放入1、11、21、31、41,在奇數註標放入0、-10、-20、-30、-40。 • ‘計算奇數陣列的值For i = 0 To 9 Step 2 iNo(i) = i/2 * 10 + 1Next‘計算偶數陣列的值For i = 1 To 9 Step 2iNo(i) = -(i - 1) / 2 * 10Next
2-3-1 一維陣列的走訪 • 範例7中的偶數註標位置放入1、11、21、31、41的運算式是i/2*10+1(或i*5+1),這個式子如何得到呢?
2-3-1 一維陣列的走訪 • 範例8:【依索引表走訪】假設有一個資料陣列data(7)如右(VB宣告方式): • 另一個索引陣列index(7)存放陣列data被走訪的順序,如右: • 則依據索引陣列index 的順序走訪4 2 6 7 0 3 1 5走訪,以index陣列的值當成data陣列的走訪註標,則讀取陣列data值的順序為10 20 30 40 50 60 70 80。
2-3-1 一維陣列的走訪 • Private Sub Form1_Load(ByVal sender As System.Object, ByVal e _ • As System.EventArgs) Handles MyBase.Load • Dim i As Integer • Dim head As Integer = 4 • ' 宣告陣列資料且給予值 • Dim data() As Integer = {50, 70, 20, 60, 10, 80, 30, 40} • Dim index() As Integer = {3, 5, 6, 1, 2, -1, 7, 0} • ' 先輸出資料表頭 • Console.WriteLine("資料個數 => " & index.GetUpperBound(0) + 1) • Console.WriteLine(" index data") • ' 依index陣列個數來索引走訪 • For i = 0 To index.GetUpperBound(0) • ' 輸出目前head索引所指到的data陣列值 • Console.WriteLine("順序 " & i & " => " & head & " ==> " & data(head)) • ' head索引依index陣列指到下一個索引值 • head = index(head) • Next • End Sub
2-3-2 二維陣列的走訪 • 二維陣列的走訪: • 對角線走訪 • 由左而右,再由上而下走 • 由上而下,再由左而右走 • 上下三角形走訪 • 範列9:[對角線走訪]只走訪對角線元素,例如在一個5×5的陣列中,(0,0)、(1,1)、(2,2)、(3,3)、(4,4)位置分別放入20 、21 、23 、24的值 (程式範例02-07) 。 • ‘ 建立陣列資料For i = 0 To 4 For j = 0 To 4 If i = j Then data(i, j) = 2 ^ I Else data(i, j) = 0 End If Next Next
2-3-2 二維陣列的走訪 • 範例10:[由左而右,由上而下走訪]設計一個4×6的陣列,以行為主的方式,分別放入0、1、..........、23的數值 (程式範例02-08 ) 。 • ‘ 建立陣列資料count = 0 For i = 1 To 4 For j = 1 To 6 data(i, j) = count count += 1 Next Next
2-3-2 二維陣列的走訪 • 範例11:[由上而下,由左而右走訪]設計一個4×6的陣列,以列為主的方式,分別放入0、1、2、3………..、23的數值(程式範例02-09 ) 。 • ‘ 建立陣列資料count = 0 For j = 1 To 6 For i = 1 To 4 data(i, j) = count count += 1 Next Next
2-3-2 二維陣列的走訪 • 範例12:[上三角形走訪]設計一個5×5的陣列,走訪上三角形放入數值1、2、3…..、14、15 (程式範例02-10) 。 • ‘ 建立陣列資料count = 1 For i = 1 To 5 For j = i To 5 data(i, j) = count count += 1 Next Next
2-3-2 二維陣列的走訪 • 範例13:[下三角形走訪]設計一個5×5的陣列,走訪下三角形放入數值1、2、3………..15(程式範例02-11) 。 • ‘ 建立陣列資料count = 1 For i = 1 To 5 For j = 1 To I data(i, j) = count count += 1 Next Next
2-4 矩陣運算2-4-1 概觀 • 矩陣的註標是從1開始,而程式語言的註標一般是從0開始 矩陣A2×3,C、Java語言宣告陣列為A[3][4]如下: • 宣告陣列的維數和矩陣相同矩陣A2×3,C、Java語言宣告陣列為A[2][3],如下:
2-4-2 矩陣加法、減法 • 假設二矩陣Am×n、Bm×n,如果矩陣C=A+B,則 ,1≦i≦m,1≦j≦n • 範例14:A、B陣列如下(註標0者不處理),計算矩陣C=A+B(程式範例02-12) • ' 矩陣加法 For i = 1 To 3 For j = 1 To 2 C(i, j) = A(i, j) + B(i, j) Next Next
2-4-3 矩陣乘法 • 矩陣相乘是兩個矩陣A、B,A的維數是m×n,B的維數是n×p,則C = A×B,可得到C的維數是m×p,其運算公式如下:
2-4-3 矩陣乘法 • ' 矩陣加法 A矩陣是 m x n,B矩陣是 n x p,C矩陣是 m x p For i = 1 To m For j = 1 To n For k = 1 To p C(i, k) = C(i, k) + A(i, j) * B(j, k) Next Next Next
2-4-4 矩陣轉置 • 如果有一矩陣Am×n,若把矩陣A的列(row)轉成行(column),把行轉成列所成的矩陣B,稱為A的轉置矩陣,可用 表示,且維度變成n×m,且符合 ,如下:
2-4-4 矩陣轉置 • 程式範例02-14‘ 矩陣轉置For i = 1 To m For j = 1 To n B(j, i) = A(i, j) Next Next