第5章 多维数组和广义表
- 格式:ppt
- 大小:869.00 KB
- 文档页数:17
《数据结构与算法》第五章数组和广义表本章介绍的数组与广义表可视为线性表的推广,其特点是数据元素仍然是一个表。
本章讨论多维数组的逻辑结构和存储结构、特殊矩阵、矩阵的压缩存储、广义表的逻辑结构和存储结构等。
5.1 多维数组5.1.1 数组的逻辑结构数组是我们很熟悉的一种数据结构,它可以看作线性表的推广。
数组作为一种数据结构其特点是结构中的元素本身可以是具有某种结构的数据,但属于同一数据类型,比如:一维数组可以看作一个线性表,二维数组可以看作“数据元素是一维数组”的一维数组,三维数组可以看作“数据元素是二维数组”的一维数组,依此类推。
图5.1是一个m行n列的二维数组。
5.1.2 数组的内存映象现在来讨论数组在计算机中的存储表示。
通常,数组在内存被映象为向量,即用向量作为数组的一种存储结构,这是因为内存的地址空间是一维的,数组的行列固定后,通过一个映象函数,则可根据数组元素的下标得到它的存储地址。
对于一维数组按下标顺序分配即可。
对多维数组分配时,要把它的元素映象存储在一维存储器中,一般有两种存储方式:一是以行为主序(或先行后列)的顺序存放,如BASIC、PASCAL、COBOL、C等程序设计语言中用的是以行为主的顺序分配,即一行分配完了接着分配下一行。
另一种是以列为主序(先列后行)的顺序存放,如FORTRAN语言中,用的是以列为主序的分配顺序,即一列一列地分配。
以行为主序的分配规律是:最右边的下标先变化,即最右下标从小到大,循环一遍后,右边第二个下标再变,…,从右向左,最后是左下标。
以列为主序分配的规律恰好相反:最左边的下标先变化,即最左下标从小到大,循环一遍后,左边第二个下标再变,…,从左向右,最后是右下标。
例如一个2×3二维数组,逻辑结构可以用图5.2表示。
以行为主序的内存映象如图5.3(a)所示。
分配顺序为:a11 ,a12 ,a13 ,a21 ,a22,a23 ; 以列为主序的分配顺序为:a11 ,a21 ,a12 ,a22,a13 ,a23 ; 它的内存映象如图5.3(b)所示。
第五章多维数组和广义表本章要点:·多维数组的概念极其表示方法·特殊矩阵和稀疏矩阵·广义表的存储5.1多维数组a11a12……a n1Am×n= a21a22……a n2……………………a m1a m2……a mn5.2数组的顺序表示数组可以以行为主序,也可以以列为主序。
设每个数组的元素占t个存储单元,数组的下标从1开始,则元素a ij的位置可以由下式确定:Loc(a ij)=Loc(a11)+[(i-1)*n+j-1]*t其中:a11称为基地址。
在C语言中,数组的下标从0开始,则元素a ij的位置可以由下式确定:Loc(a ij)=Loc(a00)+(i*n+j)*t其中:a00称为基地址。
5.3矩阵的压缩存储5.3.1特殊矩阵1.对称矩阵若一个n阶方阵A的元素满足下述性质:a jia1≤i,j≤n ,称为对称矩阵。
ij由于元素的对称性,一对对称元素只分配一个存储空间即可,这样n2个元素只须n(n+1)/2空间即可。
如:4 7 0 27 0 0 3 0 0 9 52 3 5 1一般按行优先存储的下三角矩阵如下:a11An ×n= a 21 a 22 …………… a n 1 a n 2 ……a nn所以将一个二维数组a[i][j]存储在一个一维数组 sa[k]中的对应关系如下:{2)1(2)1(j i j i i j i i j j k ≥+-<+-=当当其中:k 是一维数组sa 的下标。
2.三角矩阵一般下三角矩阵如下:a11c …… cAn ×n= a 21 a 22 …… c ………………… a n 1 a n 2 ……a nna[i][j]和sa[k]的对应关系如下:{1)22(2112)1(ji i j i n i j i n n k ≤+-++-->++=当当一般上三角矩阵如下:a11a 12 ……a n 1An ×n= c a 22……a n 2 ………………… c c …… a nna[i][j]和sa[k]的对应关系如下:{2)1(12)1(j i j i i j i n n k ≥+-<++=当当 5.3.2 稀疏矩阵当矩阵中非0元素远远少于0元素,而且分布没有规律,称为稀疏矩阵。
第五章数组和广义表讲课提要【主要内容】1.多维数组的顺序存储结构2.特殊矩阵的压缩存储3.广义表的定义及其与线性表的关系4.广义表的存储结构5.广义表运算实现中递归的应用【教学目标】1.掌握多维数组的顺序存储结构2.掌握特殊矩阵的压缩存储方法3.掌握广义表的定义及其与线性表的关系4.掌握广义表的存储结构5.了解广义表运算实现中递归的应用学习指导1.多维数组的顺序存储结构对于多维数组,有两种存储方式:一是以行为主序(或先行后列)的顺序存放,如BASIC、PASCAL、C等程序设计语言中用的是以行为主的顺序分配,即一行分配完了接着分配下一行。
另一种是以列为主序(先列后行)的顺序存放,如FORTRAN语言中,用的是以列为主序的分配顺序,即一列一列地分配。
以行为主序的分配规律是:最右边的下标先变化,即最右下标从小到大,循环一遍后,右边第二个下标再变,…,从右向左,最后是左下标。
以列为主序分配的规律是:最左边的下标先变化,即最左下标从小到大,循环一遍后,左边第二个下标再变,…,从左向右,最后是右下标。
不论按何种方式存储,只要确定了数组的首地址以及每个数组元素所占用的单元数,就可以将数组元素的存储地址表示为其下标的线性函数。
设有m×n二维数组A mn,以“以行为主序”的分配为例,按照元素的下标确定其地址的计算方法如下。
设数组的基址为LOC(a11),每个数组元素占据L个地址单元,计算a ij 的物理地址的函数为:LOC(a ij) = LOC(a11) + ( (i-1)*n + j-1 ) * L同理,对于三维数组A mnp,即m×n×p数组,对于数组元素a ijk其物理地址为:LOC(a ijk)=LOC(a111)+( ( i-1) *n*p+ (j-1)*p +k-1) )*L注意:在C语言中,数组中每一维的下界定义为0,则:LOC(a ij) = LOC(a00) + ( i*n + j ) * L【例4-1】二维数组A的每一个元素是由6个字符组成的串,其行下标i=0,1,…,8,列下标j=1,2,…,10。
数据结构第五章多维数组和广义表第五章多维数组和广义表5.1多维数组一般用顺序存储的方式表示数组。
常用方式有:1)行优先顺序,将数组元素按行向量排列;2)列优先顺序,将数组元素按列向量排列。
计算地址的函数:LOC(Aij)=LOC(Ac1c2)+((i-c1)*(d2-c2+1)+j-c2)*d5.2矩阵的压缩存储为多个非零元素分配一个存储空间;对零元素不分配存储空间。
1.对称矩阵在一个n阶的方阵A中,元素满足Aij=Aji 0<=i,j<=n-1;称为对称矩阵。
元素的总数为:n(n+1)/2;设:I=i或j中大的一个数;J=i或j中小的一个数;则:k=I*(I+1)/2+J;地址计算:LOC(Aij)=LOC(sa[k])=LOC(sa[0])+k*d= LOC(sa[0])+ (I*(I+1)/2+J )*d 2.三角矩阵以主对角线划分,三角矩阵有上三角和下三角;上三角的主对角线下元素均为常数c;下三角的主对角线上元素均为常数c。
元素总数为:(n(n+1)/2)+1;以行优先顺序存放的Aij与SA[k]的关系:上三角阵:k=i*(2n-i+1)/2+j-i;下三角阵:k=i*(i+1)/2+j;3.对角矩阵所有的非零元素集中在以主对角线为中心的带状区域,相邻两侧元素均为零。
|i-j|>(k-1)/2以行优先顺序存放的Aij与SA[k]的关系:k=2i+j;5.2.2稀疏矩阵当矩阵A中有非零元素S个,且S远小于元素总数时,称为稀疏矩阵。
对其压缩的方法有顺序存储和链式存储。
1.三元组表将表示稀疏矩阵的非零元素的三元组(行号、列号、值)按行或列优先的顺序排列得到的一个结点均是三元组的线性表,将该表的线性存储结构称为三元组表。
其类型定义:#define maxsize 10000typedef int datatype;typedef struct{int i,j;datatype v;}trituplenode;typedef struct{trituplenode data[maxsize];int m,n,t;}tritupletable;2.带行表的三元组表在按行优先存储的三元组表中加入一个行表记录每行的非零元素在三元组表中的起始位置。