第6章 数组和稀疏矩阵-数据结构教程(Java语言描述)-李春葆-清华大学出版社

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6/57
Hale Waihona Puke Baidu 2. d维数组
以m行n列的二维数组Am×n=(ai,j)为例讨论(二维数组也称为矩阵)。
7/57
按行优先存储 假设每个元素占k个存储单元,LOC(a0,0)表示a0,0元素的存储地址。
对于元素ai,j: ai,j前面有0~i-1共i行,每行n个元素,共有i×n个元素。 在第i行中前面有a[i,0..j-1],共j个元素。 合起来,ai,j前面有i×n+j个元素。
置A[i1,i2,…,id]=e。 … }
5/57
1. 一维数组
一维数组的所有元素依逻辑次序存放在一片连续的内存存储单元中。 其起始地址为第一个元素a0的地址即LOC(a0)。 假设每个数据元素占用k个存储单元。 则任一数据元素ai的存储地址LOC(ai)就可由以下公式求出
LOC(ai)=LOC(a0)+i×k (1≤i<n) 一维数组具有随机存储特性
4/57
d维数组抽象数据类型
ADT Array { 数据对象:
D={ 数组中所有元素 } 数据关系:
R={r1,r2,…,rd} ri={ 元素之间第i维的线性关系 | i=1,…,d} 基本运算: Value(A,i1,i2,…,id):A是已存在的d维数组,其运算结果是返回
A[i1,i2,…,id]值。 Assign(A,e,i1,i2,…,id):A是已存在的d维数组,其运算结果是
int[] a; a=new int[3];
也可以这样写:
//定义一个int数组变量a //为int数组变量a指定元素个数为3,此时分配内存空间
int[] a=new int[3]; //相当于在定义int数组变量的时候,为其分配内存空间
11/57
Java数组初始化有两种方式,一种是静态初始化,即初始化时由程序 员显式指定每个数组元素的初始值,由系统决定数组长度,另外一种是动态
2/57
二维数组的逻辑关系用二元组表示
1 2 3 4
5
6
7
8
9 10 11 12
B=(D,R)
R={r1,r2}
r1={<1,2>,<2,3>,<3,4>,<5,6>,<6,7>,<7,8>,<9,10>,
<10,11>,<11,12>}
//同行关系
r2={<1,5>,<5,9>,<2,6>,<6,10>,<3,7>,<7,11>,<4,8>,
LOC(ai,j)=LOC(a0,0) + (i×n + j)×k
8/57
按列优先存储
假设每个元素占k个存储单元,LOC(a0,0)表示a0,0元素的存储 地址。对于元素ai,j:
ai,j前面有0~j-1共j列,每列m个元素,共有j×m个元素。 在第j列中前面有a[0..i-1,j],共i个元素。 合起来,ai,j前面有j×m+i个元素。则:
int[] c=new int[N];
定义的一维数组c的内存空间如图所示,总共占用24+4N个字节。
头信息
对象开销 长度N
填充字节 … … …
16字节 4字节 4字节
N个int值,占用4N个字节
13/57
2. 二维数组
二维数组的声明、初始化和访问元素和一维数组相似,例如:
int [][] a={{1,2},{2,3},{4,5}}; int [][] b= new int[2][3]; b[0][0]=1; b[0][1]=2; //... b[1][2]=6;
提纲
CONTENTS
1/57
数组是一个二元组(idx,value)的集合,对每个idx,都有一个value值 与之对应。idx称为下标,可以由一个整数、两个整数或多个整数构成,下 标含有d(d≥1)个整数称为维数是d。 数组按维数分为一维、二维和多维数组。 一维数组A是n(n>1)个相同类型元素a0,a1,…,an-1构成的有限序列,其 逻辑表示为A=(a0,a1,…,an-1),其中,A是数组名,ai(0≤i≤n-1) 是数组A中序号为i的元素。 一个二维数组可以看作是每个数据元素都是相同类型的一维数组的一维数组。 以此类推。
10/57
1. 一维数组
Java声明一维数组的语法有两种,两种形式上没有区别,使用效果完全一样:
int[] a; int a[];
//第一种 //第二种
与C/C++不同,Java 中的数组是一种引用类型的变量,数组变量并不是数组本 身,它只是指向堆内存中的数组对象,因此[]中无需指定数组元素的个数即数组长 度。所以必须在先分配内存空间后才能访问数组中的元素。为数组分配内存空间的 方式如下:
LOC(ai,j)=LOC(a0,0) + (j×m + i)×k
二维数组也具有随机存储特性,以此类推。
9/57
更一般地,数组A[c1..d1,c2..d2],则该数组按行优先存储时有: LOC(ai,j)=LOC(ac1,c2)+[(i-c1)×(d2-c2+1)+(j-c2)]×k
按按行优先存储时有: LOC(ai,j)=LOC(ac1,c2)+[(j-c2)×(d1-c1+1)+(i-c1)]×k
//静态初始化 //动态初始化
14/57
Java语言中把二维数组看作是一维数组的数组,数组空间不是连续分 配的,所以不要求二维数组每一维的大小相同。例如:
int [][]a=new int[2][]; a[0]=new int[3]; a[1]=new int[5]; System.out.printf("数组a的大小:%d\n",a.length); System.out.printf("a[0]的大小:%d\n",a[0].length); System.out.printf("a[1]的大小:%d\n",a[1].length);
初始化,即初始化时程序员只指定数组长度,由系统为数组元素分配初始值。
例如:
int[] a=new int[]{1,2,3};
//静态初始化
String[] b=new String[3];
//动态初始化
b[0]="Hello";
b[1]="World";
b[2]="Hello World";
12/57
<8,12>}
//同列关系
3/57
数组具有以下特点 (1)数组中各元素都具有统一的数据类型。 (2)d(d≥1)维数组中的非边界元素具有d个前驱元素和d个后
继元素。 (3)数组维数确定后,数据元素个数和元素之间的关系不再发
生改变,特别适合于顺序存储。 (4)每个有意义的下标都存在一个与其相对应的数组元素值。
相关文档
最新文档