《数据结构》数组和广义表
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
a00
a10
a11 …
k= 1 2 3
an1 …
an-1n-1 n(n+1)/2-1
图5.3 对称矩阵的压缩存储
运算
算法5.1 压缩存储的对称矩阵中的取值算法。
/* 取对称矩阵s中第i行第j列的元素 */
int Matrix_Get(int s[],int i,int j) { if(i>=j) return(s[i*(i+1)/2+j]); else return(s[j*(j+1)/2+i]); }
a11 a12 … a1n-1
… ………
am-11 am-12 … am-1n-1
图5.1 二维数组元素关系
二维数组中的每一个元素aij都受到两个关系的约束: ROW(行关系)和COL(列关系)。aij+1是aij在行关系中的直 接后续元素;而ai+1j是aij在列关系中的直接后续元素。和 线性表一样,所有的数据元素属于同一数据类型。每个数 据元素对应于一组下标(i,j)。将这个概念依次类推,可以
第5章 数组和广义表
5.1 数组的定义与运算 5.2 数组的顺序存储结构 5.3 矩阵的压缩存储 5.4 广义表 习题
5.1 数组的定义与运算
数组定义:类似于线性表,一个两维数组的逻辑结构 可形式地表示为
2_Array=(D,R) 其中D={aij|i=0,1,…,m-1,j=0,1,…,n-1},aij是同类型数据元 素的集合。
算法5.2 压缩存储的对称矩阵中的赋值算法。 void Matrix_Set(int s[],int i,int j,int value)
k
i(i j(
1) j 2 j 1)
i
2
i j i j
存储示意:
对于任意给出的数组下标(i,j),均可以在sa[]中找到 矩阵元素aij,反之,对所有的k=1,2,…,n(n+1)/2,都 能确定sa[k]中的矩阵元素在矩阵中的位置(i,j)。由 此,称sa[n(n+1)/2]为n阶对称矩阵A的压缩存储,如 图5.3所示。
5.3.1 特殊矩阵
a.对称矩阵 定义:若有一个n阶矩阵A中的元素满足下述性质
aij=aji 1≤i,j≤n 则称为n阶对称矩阵。对称矩阵可以只给每一对对称 元素分配一个存储空间,则可将n×n的二维矩阵,压 缩存储到n(n+1)/2个元的空间中。在这里讨论以行序 为主序存储其下三角(包括对角线)中的对称矩阵元素。 假设以一维数组s[n(n+1)/2]作为n阶对称矩阵A的存储 结构,数组元素s[k]于矩阵元素aij之间转换公式如下。
可将概念依次类推,可以写出n维数组地址计算方法。
5.3 矩阵的压缩存储
在工程应用中,矩阵有着重要的作用。许 多实际问题的解决需要大量数据的综合计算, 而这些大量数据之间总是表现出二维数组的逻 辑结构。而这种二维数组结构在数学上称为矩 阵。
为了使矩阵的各种运算能有效地进行,必 须在算法的空间和时间复杂度上下功夫。首先 我们考虑如何减少空间复杂度,即找一种高效 的存储方法,再在相应的存储结构上找高效的 算法。许多矩阵的数据分布是有特征的,那就 要利用这种特征,尽量减少数据的存储量。
写出n维数组的逻辑结构,但最常用的是二维数组。
也可以从另一个角度来定义二维数组,即将二维数组
看成这样一个线性表:它的每一个数据元素是一个线性表 (一维数组)。例如,图5.1所示的是一个二维数组,以m行n 列的矩阵形式表示。它可以看成是一个线性表:
A =(α0 ,α1 ,α2 ,α3 ,…,αP) (p=m-1或n-1) 其中每一个数据元素αj 是一个列向量的线性表
LOC(i,j)=LOC(0,0)+(i×n+j)×s (0≤i≤m-1, 0≤j≤n-1) 其中,s是每个数据元素所占存储单元的个数。
可将二维数组的元素想象为一个一维数组,大小为p, 则推出三维数组的地址计算方法。
三维数组aijk(m×n×p): LOC(i,j,k)=LOC(0,0,0)+(i×n+j)×s×p+k×s LOC(i,j,k)=LOC(0,0,0)+(i×n×p+j×p+k)×s (0≤i≤m-1, 0≤j≤n-1,0≤k≤p-1)
5.2 数组的顺序存储结构
由于数组一般不作插入或删除操作,也就是说,一旦 建立了数组,则结构中的数据元素个数和元素之间的关系 就不再发生变动,因此,采用顺序存储结构表示数组。
顺序结构即是用一组连续的存储单元来存放数组结构。 内存地址是一维的,而数组结构可能是多维的。如何将多 维的数组挤入一维的地址中,就有了策略问题:
R={ROW,COL}是数据元素上关系的集合。 ROW={<aij,aij+1>|0≤i≤m-1,0≤j≤n-2}每一行上的列关系。 COL={<aij,ai+1j>|0≤i≤m-2,0≤j≤n-1}每一个列上的行关 系。 行列关系跟线性表已经大不相同了,见图5.1所示。
a01 a02 … a0n-1
αj =(a0j ,a1j ,a2j ,…,am-1j) 或者αi 是一个行向量的线性表:
αi =(ai0 ,ai1 ,ai2 ,…,ain-1) 这种定义二维数组的方法也可以推广到n维数组,即认 为n维数组是一个线性表,它的每一个数据元素是一个n-1 维数组。
在数组结构最常用的操作:给定数组的下标i,对相应 元素ai作取数、赋值的操作,操作方法根据其存储结构决 定。
(b)行序
(c)列序
图5.2 二维数组的两种存储方式
数组的顺序存储方式,给对数组元素的随机存取带来
方便。因为,数组是同类型数据元素的集合,所以,每一 个数据元素所占用的内存空间的单元数是相同的,故只要 给出首地址,可以使用统一的地址公式,求出数组中任意 元素的地址。这里以二维数组的行主序为例,讨论数组元 素的地址计算方法。 二维数组aij(m×n)
按行序为主序(row major order)。首先,存放数组的 第一行,然后,按顺序存放数组的各行;
按列序为主序(column major order)。首先,存放数组 的第一列,然后,按顺序存放数组的各列,
如图5.2所示。大多数程序设计语言是按行主序来排列 数组元素的,但列主序也是常见的。
(aຫໍສະໝຸດ Baidu二维数组