数组和广义表
一、数组
1.定义
数组是数据结构的基本结构形式,它是一种顺序式的结构。
数组是存储同一类型数据的数据结构,使用数组时需要定义数组的大小和存储数据的数据类型。
2.分类
数组分为一维数组和多维数组,数组的维数由数组下标的个数确定的。
可以说数组是有限个同类型数据元素组成的序列。
1>一维数组
一维数组是指下标的个数只有一个的数组,有时称为向量,是最基本的数据类型。
一维数组的数据存储按照顺序存储,逻辑地址和物理地址都是连续的。
2>多维数组
多维数组是指下标的个数有两个或两个以上。我们比较常用的是二维数组。因为三维一项的数组存储可以简化为二维数组的存储。
以二维数组为例,二维数组在顺序存储时一般有两种:
- 第一种行优先顺序:存储时先按行从小到大的顺序存储,在每一行中按列号从小到大存储。
- 第二种列优先顺序:存储时先按列从小到大的顺序存储,在每一列中按行号从小到大存储。
二、矩阵的存储
1.压缩存储
矩阵的压缩存储就是存储数组时,尽量减少存储空间,但数组中每个元素必须存储。
在矩阵中,如果有规律可寻,只要存储其中一部分,而另外一部分的存储地址可以通过相应的算法将它计算出来,从而占有较少的存储空间达到存储整个矩阵的目的。
矩阵的压缩存储仅能针对特殊矩阵使用,对于没有规律可循的二维数组则不能使用。
二维数组的压缩存储一般分为3种,它们分别是对称矩阵、稀疏矩阵和三角矩阵。
2.对称矩阵
若n阶矩阵A中的元素满足以下条件:aij=aji,i≥1,j≥1,则成为n阶对称矩阵。
对于对称矩阵如果不采用压缩存储,占用的存储单元为n*n个,因为是对称矩阵,所以只要存储对角的数据元素和一般的数据元素即可,占用的存储单元有n*(n-1)/2个。
对角矩阵是指矩阵的所有非零元素都集中在以主对角线为中心的带状区域中,即除了主对角线上和直接在主对角线上、下方若干条对角线上的元素之外,其余元素皆为零。
3.稀疏矩阵
对稀疏矩阵很难下一个确切的定义,它只是一个凭人们的直觉来理解的概念。
一般认为,一个较大的矩阵中,零元素的个数相对于整个矩阵元素的总个数所占比例较大时,该矩阵就是一个稀疏矩阵。
稀疏矩阵的压缩存储采用三元组的方法实现。其存储规则是每一个非零元素占有一行,每行中包含非零元素所在的行号、列号、非零元素的数值。
为完整描述稀疏矩阵,一般在第一行描述矩阵的行数、列数和非零元素的个数。其逻辑描述为(即三元组存储方式):(row col value)其中row表示行号,col表示列号,value表示非零元素的值。 如下图是一种稀疏矩阵的三元组存储形式:
原始数据: 三元组存储形式:
第一行表示矩阵的数据总数:5行、6列、4个值。 第二行表示数据的位置及内容:2行、2列、值为3。 第三行、第四行依次类推。 首先应该将稀疏矩阵转换为三元组存储,然后再利用三元组的存储,实现对矩阵的各种运算。
在Java中,除了一下两点以外,向量与数组完全相同:
- 第一:一个向量是类java.util.Vector的实例
- 第二:一个向量的长度可以改变。
三、广义表
1.定义
广义表是线性表的扩展,具体定义为n(n≥0)个元素的有限集合。
n的值是广义表的长度,如果n=0称广义表为空表。
广义表的数据元素有两种类型:一个是不可再分的元素(原子元素);一个是可以再分的元素(子表)。
如果所有的元素都是原子元素,则称为线性表。
如果数据元素中含有子表元素,则称为广义表。
广义表一般记作:LS=(a1,a2,……,an)
常见的广义表为:A=()、B=(())、C=(a,b)、D=(A,B,C)、E=(a,E)
广义表中含有元素的个数称为广义表的长度,广义表中含有的括号对数称为广义表的深度。
广义表有三个重要的特点:
- 第一:广义表的元素可以是子表,而子表的元素还可以是子表,广义表是一个多层次的结构。
- 第二:广义表可以为其他广义表所共享。
- 第三:广义表可以是一个递归表,即表也可以是其本身的一个子表。
广义表的表头是广义表中的第一个元素,而表尾则是去掉表头之后的所有元素。
广义表中通常利用求表头和表尾运算求得广义表中某个元素的值。
2.存储方式
广义表的存储方法有很多种,一般采用链表存储。采用链表存储时的结点存储的逻辑结构如下图:
flag表示标志位。当flag为0时,表示该结点为原子元素,info表示原子元素的值;当flag为1时表示该结点为子表,info表示指针,指向该子表的第一个结点。 link表示指针,指向广义表的下一个元素。 例如:广义表A=(a,(b,(c)),(d,e),f),利用链表存储的逻辑图如下:
广义表可以采用多种方式实现,最简单的方法是使用数组实现。
上一篇:队列(queue)
下一篇:树(tree)