1、1,第2章 数组,2.1 数组表示法 2.2 Java语言的数组表示方法 2.3 矩阵 2.4 多项式表示法 2.5 上三角形和下三角形表示法 2.6 幻方 2.7 生命游戏 2.8 程序集锦 2.9 思考题,2,2.1 数组表示法,2.1.1 一维数组 2.1.2 二维数组 2.1.3 三维数组 2.1.4 n维数组,3,2.1 数组表示法,在Java程序语言中常利用数组实现线性表,以线性的对应方式将元素ai置于数组的第i个位置上,若要读取ai,可利用ai = a0 + id来求得。其中ai为相对地址,a0为数组的起始地址,d为每一个元素所占的空间大小,但要注意的是,Java的数组是从0开始
2、的。,4,2.1.1 一维数组,假设一维数组(One Dimension Array)是A(0:u*1),且每一个元素占d个空间,则A(i) = l0 + id,其中l0是数组的起始地址。,5,2.1.1 一维数组,例如,有一数组A(0:100),而起始地址A(0)=100,d=2,则A(16)=? 解:由于A(i) = 100 + (i) d所以A(16) = 100 + 162 = 132 假若数组为(t:u),则 A(i) = l0 + (it) d 例如有一数组A(3:10)且A(3)=100,d=1求A(5)=? 所以A(5) = 100 + (5(3) 1= 108,6,2.1.2
3、 二维数组,假若有一个二维数组(Two Dimension Array)是A0:u11, 0:u21,表示此数组有u1行及u2列;也就是每一行是由u2个元素所组成。二维数组转化成一维数组时,对应方式有两种:以行为主(row-major)和以列为主(column-major)。,7,8,2.1.2 二维数组,假如数组是A(l1:u1, l2:u2),则此数组共有 m = u1 l1 + 1行,n = u2 l2 + 1列。计算A(i, j)的地址如下: (1)以行为主:A(i, j) = l0 + (il1)*nd + (jl2)d (2)以列为主:A(i, j) = l0 + (jl2)*md
4、 + (il1)d,9,2.1.2 二维数组,【范例2.1】 假设A(3:5, 4:2)且其起始位置为A(3, 4) = 100,若以行为主排列,请问A(1, 1)所在的地址。(假设d=1) 解:m = 5 (3) + 1 = 9, n = 2 (4) + 1 = 7, l1=3, l2=4, i=1, j=1 A(i, j)= l0 + (il1) nd + (jl2)d A(1, 1) = 100 + (1(3) 71 + (1 (4) 1 = 100 + 47 + 5 = 133,10,2.1.2 二维数组,另一解法是将表达式转化为标准式: A(3:5, 4:2)A(0:8, 0:6),
5、得知u1=9,u2=7 A(3, 4)A(0, 0),得知A(1, 1)A(4, 5) 因此,A(4, 5) = 100 + 47 + 5 = 100 + 28 + 5 = 133,11,2.1.3 三维数组,假如有一个三维数组(Three Dimension Array)是A(0:u11, 0:u21, 0:u31),如图所示。,12,2.1.3 三维数组,一般三维数组都先转化为二维数组后,再对应到一维数组,对应方式也有两种:以行为主和以列为主。 假设数组为A(l1:u1, l2:u2, l3:u3 ),则p = u1 l1 + 1, q = u2 l2 + 1,r = u3 l3 + 1。
6、 以行为主的公式为: A(i , j , k) = l0 + (il1) qrd + (jl2) rd + (kl3)d 以列为主的公式为 A(i , j , k) = l0 + (kl3) pqd + (jl2) pd + (il1) d,13,2.1.3 三维数组,【范例2.2】 假设有一个三维数组A(3:5, 4:2, 1:5)且其起始位置为A(3, 4, 1) = 100,以行为主排列,试求A(1, 1, 3)所在的地址.(d=1) 解:p = 5 (3) + 1 = 9, q = 2(4) + 1 = 7, r = 5 1 + 1 = 5, l1= 3, l2= 4, l3=1, i
7、=1, j=1, k=3 A(1, 1, 3) = 100 + (1(3) 751 + (1(4) 51 + (31) 1 = 267 另一种解法为将表达式全转化为标准式。 A(3:5, 4:2, 1:5)A(0:8, 0:6, 0:4) 从上式得知u1=9,u2=7,u3=5 A(1, 1, 3)A(4, 5, 2),14,2.1.3 三维数组,将第式中全部转化为标准式,分别加3、加4及减1,所以在第式中也要分别做加3。加4及减1的操作。同时A(3, 4, 1)A(0, 0, 0)=100(已知)。 所以,A(4, 5, 2) = 100 + 475 + 55 + 2= 100 + 140
8、+ 25 + 2= 267 与上一种解法答案是相同的。,15,2.1.4 n维数组,如果有一数组为A(0:u11, 0:u21,0:u31, , 0:un1 ),表示A数组为n维数组 (n dimension array),同样n维数组也有两种表示方式:以行为主和以列为主。,16,练习题,1 有一个二维数组A(1:u1, 1:u2),试分别写出以行为主和以列为主的A(i, j)的地址。 2 假设数组A(3:5, 4:2)且其起始位置 A(3, 4) = 100,以列为主排列,请问A(1, 1)所在地址。(d=1) 3 若有一数组为A(1:u1, 1:u2, 1:u3),分别以行为主和以列为主表
9、示一维数组中A(i, j, k)的地址。,17,练习题,4 假设有一个三维数组A(3:5, 4:2, 1:5)且其起始位置为A(3, 4, 1)=100,以列为主排列,则A(2, 1, 2)所在地址是什么(d=1) 5 假设有一个n维数组A(1:u1, 1:u2, 1:u3, 1:un),试分别写出以行为主和以列为主的A(i1 i2, i3, , in)的地址表达式。,18,2.2 Java语言的数组表示方法,Java语言的一维数组表示如下: int A = new int20; 表示A数组有20个整数元素,从A0A19。注意,Java语言的数组标注开始值为0,而二维数组表示方法为: int
10、A = new int2010; 表示A数组有20行、10列,从A00,A01,A199学共有200个元素。,19,2.2 Java语言的数组表示方法,三维数组就是由3个中括号表示,如: int A = new int302010;总共有 6 000个元素。,20,练习题,1. 试回答下列问题: (1)int a=0, 1, 2, 3, 4, 5; int ptr=a; 则ptr+2和*(ptr+2)及a2各表示什么? (2)上述的a和ptr有何差异? 2. 将第1章的思考题第2题以Java语言执行,并检查答案是否符合要求。,21,2.3 矩阵,矩阵相乘 假设A =(aij)是一个mn的矩阵,
11、而B =(bij )为ns的矩阵,则AB的乘积为ms的矩阵 (AB)ij = aikbkj,22,2.3 矩阵,【范例2.3】矩阵相乘的程序如下:,=,23,2.3 矩阵,public static void access_matrix(int A, int B) int i=0, j=0, k=0; / 将A矩阵每一行元素与B矩阵每一列元素 / 相乘之和放入C矩阵中 for(i=0;iN;i+)for(j=0;jN;j+)sum=0;for(k =0;kN;k+)sum=sum+AikBkj;Cij = sum ; ,24,2.3 矩阵,稀疏矩阵若一矩阵中大多数元素为0时,称此矩阵为稀疏矩阵
12、(Sparse Matrix),到底矩阵中有多少个0才算是稀疏矩阵,则没有绝对的定义,一般而言,超过半数就可称之为稀疏矩阵。,25,练习题,将此节所介绍的稀疏矩阵,利用Java程序进行遍历,将非零的元素一一存在一个名为sm的二维数组中。,26,2.4 多项式表示法,多项式使用线性表来表示有两种方法: 1. 使用一个n+2长度的数组,按照指数由大至小次序保存系数,数组的第一个元素是此多项式最大的指数值,如p = (n, an, an1, , a0)。 2. 另一种只考虑多项式中非零项的系数,若有m项,则使用一个2m+1长度的数组来存储,分别保存每一个非零项的指数与系数,而数组中第一个元素是此多项
13、式非零项的个数。,27,练习题,1. 有一个多项式px=6x7+8x5+5x4+3x2+7,请利用本节中提到的两种方法表示。 2. 有一个多项式pxy=6x5+3x4y3+2x3y28x2y+9x+3,试利用二维数组表示。,28,2.5 上三角形和下三角形表示法,若一矩阵的对角线以下的元素均为零,也即aij=0,i j,则称此矩阵为上三角形矩阵,如图(a)所示。反之,若一矩阵的对角线以上的元素均为零,也即aij = 0,i j,此矩阵称为下三角形矩阵,如图(b)所示。,(a),(b),29,练习题,1. 试编写一算法将Ann的上三角形矩阵存储于一个B(1:n(n+1)/2)的数组中。 2. 在
14、练习题1的基础上,编写一个算法从B数组取出A(i, j)。,30,2.6 幻方,有一nn的方阵,其中n为奇数,请在nn的幻方内将1到n2的整数填入其中,使其各行、各列及对角线的和都相等。 奇数幻方的程序如下: public void Magic(int Square, int N) int i=0, j=0 ,p=0 ,q=0 ,key=0 ;/ 初始化矩阵内容,矩阵全部清0for ( i=0 ; i N ; i+ )for ( j=0 ; j N ; j+ )Squareij=0 ;Square0(N 1) /2=1 ; / 将1放至最上行中间位置,31,2.6 幻方,key = 2 ;i
15、= 0 ; j=(N 1)/2 ; / i,j记录目前所在位置while ( key = N*N) p=( I 1)% N; / p,q为下一步位置,i,j各减1表往西北角移动q=( j 1)% N; /p0(超出方阵上方) 则将p 移至N 1(最后一行),32,2.6 幻方,if ( p0 )p=N 1 ;/q 0超出方阵左方,则将q 移至N1(最右列)if(q0)q=N 1;if(Squarepq!=0) / 判断下一步是否已有数字i=(i+1)% N ; / 已有则 i 往下填在原值下方,33,2.6 幻方,else i=p ; / 将下一步位置分配给目前位置j=q;Squareij=k
16、ey ;key+ ; ,34,练习题,自己填充完成99的幻方。,35,2.7 生命游戏,本章将以生命游戏(game of life)作为结束。此游戏在1970年由英国数学家J. H. CONWAY提出。生命游戏将数组元素视为细胞,而某一细胞邻居则是指在其垂直、水平、对角线相邻的细胞(cell)。,36,生命游戏的规则,1孤单死:若一个活细胞只有一个或没有邻居细胞存活,则在下一代,它将孤单而死如图(a)所示,以表示细胞,x符号表示此细胞将死去。 2拥挤死:一个活细胞有4个或4个以上邻居即是活的,则在下一代,它将因拥挤而死如图(b)所示,x符号表示此细胞将死去。,37,生命游戏的规则,3稳定:一个
17、活细胞有2个或3个相邻活细胞,则下一代它将继续生存如图(c)所示,符号表示此细胞将继续存活)。如图(c)所示: 4复活:一个死细胞正好有个相邻的活细胞,则下一代它将复活如图(d)所示,0符号表示此位置会复活一个细胞。如图(d)所示。,38,生命游戏的规则,39,2.9 思考题,1. 假设有一个数组A,其A(0, 0)与A(2, 2)的地址分别在(1204)8与(1244) 8,求A(3, 3)的地址(以八进制表示)。 2. 有一个三维数组A(3:2, 2:4, 0:3),以行为主排列,数组的起始地址是318,试求A(1,3,2)所在的地址。 3. 有一个二维数组A(0:m1, 0:n1),假设A(3, 2)在1110,而A(2, 3)在1115,若每个元素占一个空间,请问A(1, 4)所在的地址。,