330 likes | 548 Views
Chapter 3. 陣列 (Arrays). 陣列. 陣列 (Array) 可分成一維陣列、二維陣列及多維陣列 ( 三維以上的陣列 ) 。 Java int ko[ ]=new int[5] ; int ko [ ] [ ] = new int[80] [50 ] ; int ko[ ] [ ] [ ] = new int[80] [50 ] [50 ] ;. 資料型態. 一維陣列. 一維陣列的宣告法: int ko[ ]=new int[5] ; int [ ]ko=new int[5] ;
E N D
Chapter 3 陣列(Arrays)
陣列 • 陣列(Array)可分成一維陣列、二維陣列及多維陣列(三維以上的陣列)。 • Java int ko[ ]=new int[5]; int ko [ ] [ ] = new int[80] [50 ] ; int ko[ ] [ ] [ ] = new int[80] [50 ] [50 ] ;
一維陣列 • 一維陣列的宣告法: int ko[ ]=new int[5]; int [ ]ko=new int[5]; int ko[ ]={1,2,3,4,5}; int [ ]ko={1,2,3,4,5};
一維陣列位址的配置 • 若陣列 ko[n],假設每一個變數佔了 d 個位元組的空間: 變數 ko[0] ko[1] ko[2] ‧‧‧ko[n-1] 位址 m m+d m+2*d‧‧‧m+(n-1)*d d值代表資料型態所佔記憶體空間的大小,則: Loc(ko[n-1])=m+(n-1)*d..(公式3-1) 其中 m=Loc(ko[0]) ,d 為資料型態所佔記憶體的大小,n-1 代表 ko[0] 與 ko[n-1] 間隔。 Loc 代表 Location 記憶體位置。 例題 ko3_1使用一維陣列,計算小學生成績
一維陣列位址的配置 • P.74例題1: 假設在 Java 語言中有一陣列 A[ ] 儲存了 float 的資料,若 A[100] 的位址是 4413,則 A[200] 的位址為若干?
一維陣列位址的配置 • 解答: 已知 Loc(A[100])=4413=m+(n-1)*d=m+100*d,根據公式 3-1 Loc(ko[n-1])=m+(n-1)*d, 得知 Loc(ko[0])=m,d=4, Loc(A[100])=4413=m+100*4,得 m=4013 Loc(A[200])=m+(n-1)*d =4013+200*4 =4813
一維陣列位址的配置 • P.74例題 2 • 例題 ko3_2使用一維陣列,將一組字串之大寫變小寫,小寫變大寫 • 例題 ko3_3使用一維陣列,將一組數字,依大小順序排列
二維陣列 • 二維陣列宣告方式: int ko[ ][ ]=new int[5][3]; int [ ][ ]ko=new int[5][3]; int ko[ ][ ]={{1,2},{3,4}}; int [ ][ ]ko={{1,2},{3,4}}; 二維陣列包含列(Row)及行(Column):
二維陣列 • 例題 ko3_4使用二維陣列,求陣列中最大值及最小值 • 例題 ko3_5使用二維陣列,列出二維陣列,並求各列數字的和 • 例題 ko3_6使用二維陣列,計算二個陣列之乘積 • 先介紹二個陣列乘積之算法
二維陣列位址的配置 • 二維陣列位置的配置可分為 • 以列為主陣列位置的配置 • 以行為主陣列位置的配置 通常都是以列為主陣列位置的配置
以列為主陣列位址配置 • 假設每一個變數佔了2個位元組的空間,y行內有δ個元素
以列為主陣列位址配置 • 若 Loc(A[0][0])=m,而且以列為主陣列位置的配置方式,則A[x][y]記憶體位置的公式如下: Loc(A[x][y])=m+d(xδ+y)…………(公式3-2) 其中δ代表 y 行內有δ個元素,d 代表每一個變數佔了 d 個位元組的空間。
P.81例:有一個二維陣列A,假設A[1][1]與A[3][3]的位址分別為644與676,求A[4][4]的位址為若干?P.81例:有一個二維陣列A,假設A[1][1]與A[3][3]的位址分別為644與676,求A[4][4]的位址為若干? • Loc(A[1][1])=644=m+d(δ+1)……………………….(1) Loc(A[3][3])=676=m+d(3 δ+3)……………………..(2) (1)x3-(2)得 2m=1256 m=628……………………………..(3) d(δ+1)=16……………………….(4) 將(3)(4)代入 Loc(A[4][4])=m+d(4 δ+4) =m+4d(δ+1) =628+4x16 =692
以行為主陣列位址配置 • 假設每一個變數佔了2個位元組的空間,x列內有δ個元素
以行為主陣列位址配置 • 若Loc(A[0][0])=m,而且以行為主陣列位址的配置方式,則 A[x][y]記憶體位址的公式如下: Loc(A[x][y])=m+d(yδ+x)………......(公式3-3) 其中δ代表x列內有δ個元素,d代表每一個變數佔了d個位元組的空間。
P.83例:有一個以行為主的二維陣列 A[x][y],A[3][2]的位址是 1111,A[2][3]的位址為 1116。若每一個元素佔了1個位元組,求A[1][4]的位址為若干? • 已知d=1根據公式3-3 Loc(A[x][y])=m+d(yδ+x)得知: Loc(A[3][2])=1111=m+(2‧δ+3)…………………..(1) Loc(A[2][3])=1116=m+(3‧δ+2)…………………..(2) (2)-(1)得 5=δ-1,求得δ=6……………………….(3) (3)代入(1)求得 m=1096 Loc(A[1][4])=m+d(yδ+x) =1096(4‧6+1) =1121
多維陣列位址的配置 • 以列為主陣列位址的配置 加設有一三維陣列 A[z][y][x],A[0][0][0]的位址為m,每一個元素佔了d個位元組,則 A[a][b][c]的位址為: Loc(A[a][b][c])=m+d(ayx+bx+c)……(公式3-4)
P.85例:設有一三維陣列A[2][3][4]中,陣列元素A[1][1][1]在主記憶體中之位址為3000,且一個元素佔一個位元組,以列為主排列時,陣列元素A[2][1][3]之位址為何?P.85例:設有一三維陣列A[2][3][4]中,陣列元素A[1][1][1]在主記憶體中之位址為3000,且一個元素佔一個位元組,以列為主排列時,陣列元素A[2][1][3]之位址為何? • 已知三維陣列A[2][3][4](z=2,y=3,x=4),每一個元素佔一個位元組,d=1。根據公式 3-4 知 Loc(A[1][1][1])=m+d(ayx+bx+c)=m+1(1‧3‧4+1‧4+1)=m+17=3000,得m=2983 Loc(A[2][1][3])=m+d(ayx+bx+c) =2983+1(2‧3‧4+1‧4+3) =2983+24+4+3 =3041
多維陣列位址的配置 • 以行為主陣列位址的配置 假設有一三維陣列A[z][y][x],A[0][0][0]的位址為m,每一個元素佔了d個位元組,則A[a][b][c]的位址為: Loc(A[a][b][c])=m+d(czy+bz+a)……(公式3-5)
P.85例:設有一三維陣列A[2][3][4]中,陣列元素A[1][1][1]在主記憶體中之位址為3000,且一個元素佔一個位元組,以行為主排列時,陣列元素A[2][1][3]之位址為何?P.85例:設有一三維陣列A[2][3][4]中,陣列元素A[1][1][1]在主記憶體中之位址為3000,且一個元素佔一個位元組,以行為主排列時,陣列元素A[2][1][3]之位址為何? • 已知三維陣列A[2][3][4](z=2,y=3,z=4),每一個元素佔一個位元組,d=1。 根據公式3-5知Loc(A[1][1][1])=m+d(czy+bz+a)=m+1(1‧2‧3+1‧2+1)=m+9=3000,得 m=2991 Loc(A[2][1][3])=m+d[czy+bz+a] =2991+1(3‧2‧3+1‧2+2) =2991+18+2+2 =3013
特殊矩陣 • 稀疏矩陣 • 所謂稀疏矩陣是指矩陣中的元素大多數為0。擁有多少個零元素才稱得上「稀疏矩陣」,並沒有明確的定義。
以二維陣列來儲存此稀疏陣列,地以列用來儲存稀疏矩陣的列數、行數以及非零元素數,第二列一後用來儲存稀疏矩陣的非零元素所在的位址及其值,此法稱為行列索引表示法以二維陣列來儲存此稀疏陣列,地以列用來儲存稀疏矩陣的列數、行數以及非零元素數,第二列一後用來儲存稀疏矩陣的非零元素所在的位址及其值,此法稱為行列索引表示法
P.90例:一個mxn的整數矩陣(Matrix),其中有k個非零的值。如果用陣列儲存這個Sparse Matrix的k值。需要多少個記憶體?(A)k(B)2k+1(C)3(k+1)(D)4k • 依據圖3-6,總共非零元素有8個,存放稀疏矩陣的記憶體空間=3*(8+1)=27 因此,答案應為(C)3(k+1)
下三角形矩陣 • 正方形矩陣A[x][y]其對角線以上的元素均為0。x≦y,A[x][y]=0
下三角形矩陣位置配置 • 以列為主 • Loc (A[x][y])= Loc (A[0][0])+(1+x)x/2+y. ..(公式3-8) 例題 ko3_7 (下三角型以列為主的位址配置,二維陣列轉換成一維陣列)
下三角形矩陣以行為主 • Loc (A[x][y])= Loc (A[0][0])+n(y-1)-y(y-1)/2+x (公式3-9) 例題 ko3_8 (下三角型以行為主的位址配置,二維陣列轉換成一維陣列)
上三角形矩陣 • x≧y,A[x][y]=0
上三角形矩陣以列為主 • Loc (A[x][y])= Loc (A[0][0])+n(x-1)-x(x-1)/2+y (公式3-10) 例題 ko3_9 (以上三角型矩陣以列為主的位址配置,二維陣列轉換成一維陣列)
上三角形矩陣以行為主 • Loc (A[x][y])= Loc (A[0][0])+y(y-1)/2+x (公式3-11) 例題 ko3_10 (以上三角型以行為主的位址配置,二維陣列轉換成一維陣列)
多項式陣列 • 使用n+2長度的陣列a儲存多項式f(x)。 • f(x)=7x3+4x+13 。 • A[5]={3,7,0,4,13} 。
多項式陣列 • 以a[2p+1]儲存多項式f(x)。 • f(x)=7x3+4x+13 。 • A[7]={3,3,7,1,4,0,13} 。
類別 • Java語言的類別與陣列類似,可將一些資料組在一起。但是資料陣列的每一元素的資料型態必須一致;類別的每一元素的資料型態不必一致。 • 因此,陣列記憶體的空間也較類別記憶體的空間容易掌握。 • 例題ko3_11使用類別宣告各種資料型態