《数据结构》第5章数组和广义表.ppt_第1页
《数据结构》第5章数组和广义表.ppt_第2页
《数据结构》第5章数组和广义表.ppt_第3页
《数据结构》第5章数组和广义表.ppt_第4页
《数据结构》第5章数组和广义表.ppt_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、DATA STRUCTURE,2020/7/30,2,第五章 数组和广义表,本章内容 5.1 数组的定义 5.2 数组的顺序表示 5.3 矩阵的压缩存储 5.3.1 特殊矩阵 5.3.2 稀疏矩阵 5.4 广义表的定义 5.5 广义表的存储结构,2020/7/30,3,5.1数组的定义,数组是我们很熟悉的一种数据结构,它可以看作线性表的推广。数组作为一种数据结构其特点是结构中的元素本身可以是具有某种结构的数据,但属于同一数据类型,比如:一维数组可以看作一个线性表,二维数组可以看作“数据元素是一维数组”的一维数组,三维数组可以看作“数据元素是二维数组”的一维数组,依此类推。,由于数组中各元素具有

2、统一的类型,并且数组元素的下标一般具有固定的上界和下界,因此,数组的处理比其它复杂的结构更为简单。多维数组是一维数组的推广。,2020/7/30,4,例如,二维数组A:,5.1数组的定义(续),二维数组A可以看成是由m个行向量组成的向量,也可以看成是n个列向量组成的向量。 数组一旦被定义,它的维数和维界就不再改变。因此,除了结构的初始化和销毁之外,数组只有存取元素和修改元素值的操作。,2020/7/30,5,由于计算机的内存结构是一维的,因此用一维内存来表示多维数组,就必须按某种次序将数组元素排成一列序列,然后将这个线性序列存放在存储器中。 数组一旦建立,结构中的元素个数和元素间的关系就不再发

3、生变化。因此,一般采用顺序存储的方法来表示数组。,5.2 数组的顺序表示,2020/7/30,6,行优先顺序或以行为主序存储方式:将数组元素按行排列,第i+1个行向量紧接在第i个行向量后面。以二维数组为例,按行优先顺序存储的线性序列为: a11,a12,a1n,a21,a22,a2n,am1,am2,amn 在PASCAL、C等语言中,数组就是按行优先顺序存储的。,5.2 数组的顺序表示(续),LOC(aij)=LOC(a11)+(i-1)*n+j-1*d,2020/7/30,7,列优先顺序或以列为主序存储方式:将数组元素按列向量排列,第j+1个列向量紧接在第j个列向量之后,A的m*n个元素按

4、列优先顺序存储的线性序列为: a11,a21,am1,a12,a22,am2,an1,an2,anm 在FORTRAN语言中,数组按列优先顺序存储。,5.2 数组的顺序表示(续),LOC(aij)=LOC(a11)+(j-1)*m+i-1*d,2020/7/30,8,行优先顺序先排最右的下标,从右到左,最后排最左下标。 列优先顺序先排最左下标,从右向左,最后排最左下标。 例如:三维数组Am*n*p以行优先方式顺序存储,则 LOC(aijk)=LOC(a111)+(i-1)*m*n+ (j-1)*n+(k-1)*d,5.2 数组的顺序表示(续),2020/7/30,9,只要知道开始结点的存放地址

5、(即基地址)、维数和每维的上、下界,以及每个数组元素所占用的单元数,就可以将数组元素的存放地址表示为其下标的线性函数。因此,数组中的任一元素可以在相同的时间内存取,即顺序存储的数组是一个随机存取结构。,数组存储的特点,2020/7/30,10,压缩存储:为多个值相同的非零元素只分配一个存储空间;对零元素不分配空间。,5.3 矩阵的压缩存储,2020/7/30,11,特殊矩阵:非零元素按照一定的规律分布。,5.3.1特殊矩阵的压缩存储,aij=aji,对称矩阵,常见的特殊矩阵有对称矩阵、三角矩阵、对角矩阵等。 对称矩阵:元素的值按照主对角线对称,2020/7/30,12,5.3.1(续)对称矩阵

6、的压缩存储,对称矩阵,1,2,1,3,3,1,4,4,4,1,数组B,1,2,3,4,5,6,7,8,9,10,下标k,例如:一个4*4的对称矩阵。,2020/7/30,13,5.3.1(续)对称矩阵的压缩存储,对称矩阵,数组B,ai,j,an,n,k,m,下标,k = ? m = ?,推广至一般情况,n*n的对称矩阵,2020/7/30,14,5.3.1(续)三角矩阵的压缩存储,(a) 下三角矩阵,(b) 上三角矩阵,三角矩阵:上(下)三角矩阵是指矩阵的下(上)三角(不包括对角线)中的元素均为常数或零的n阶矩阵,即非零元素的分布在矩阵中呈现为三角形。,例如:一个4*4的三角矩阵。,2020/

7、7/30,15,5.3.1(续)三角矩阵的压缩存储,(c) 下三角矩阵,(d) 上三角矩阵,例如:一个4*4的三角矩阵。,2020/7/30,16,5.3.1(续)三角矩阵的压缩存储,0,a0,0,a0,1,a0,2,a0,3,ai,j,an-1, n-1,b1,b2,b3,b4,bk,bm,k = ? m = ?,推广至一般情况,n*n的三角矩阵以行为主序压缩存储,2020/7/30,17,5.3.1(续)三角矩阵的压缩存储,0,a0,0,a0,1,a1,1,a0,2,ai,j,an-1, n-1,b1,b2,b3,b4,bk,bm,k = ? m = ?,a1,2,b5,a2,2,b6,推

8、广至一般情况,n*n的三角矩阵以列为主序压缩存储,2020/7/30,18,5.3.1(续)三对角矩阵的压缩存储,a0,0,a0,1,a1,0,ai,j,数组B,1,2,k,k+1,m,下标,0,.,.,k = ? m = ?,对角矩阵是指所有的非零元素都集中在以主对角线为中心的带状区域中。,2020/7/30,19,上述各种特殊矩阵,其非零元素的分布都是有规律的,因此总能找到一种方法将它们压缩存储到一维数组中,并且一般都能找到矩阵中的元素与该一维数组元素的对应关系,通过这个关系,仍能对矩阵的元素进行随机存取。,5.3.1(续)特殊矩阵的压缩存储,2020/7/30,20,什么是稀疏矩阵?简单

9、说,设矩阵A中有s个非零元素,若s远远小于矩阵元素的总数(即smn),则称A为稀疏矩阵。 设在矩阵A中,有s个非零元素。令 e=s/(m*n),称e为矩阵的稀疏因子。通常认为e0.05时称之为稀疏矩阵。,5.3.2稀疏矩阵,2020/7/30,21,5.3.2稀疏矩阵的压缩存储,在存储稀疏矩阵时,由于非零元素的分布一般是没有规律的,因此在存储非零元素的同时,还必须同时记下它所在的行和列的位置(i,j)。反之,一个三元组(i,j,aij)惟一确定了矩阵A的一个非零元。因此,稀疏矩阵可由表示非零元的三元组及其行列数唯一确定。,2020/7/30,22,( (1,2,12), (1,3,9), (3

10、,1,-3), (3,6,14), (4,3,24), (5,2,18), (6,1,15), (6,4,-7) ),5.3.2稀疏矩阵的压缩存储,例如,一个6*7的稀疏矩阵,稀疏矩阵中的非零元素,2020/7/30,23,假设以顺序存储结构来表示三元组表,则可得到稀疏矩阵的一种压缩存储方法三元组顺序表。 #define maxsize 10000 typedef int datatype; typedef struct int i,j; datatype v; triple; /* 三元组*/,5.3.2(续)稀疏矩阵的压缩存储,2020/7/30,24,typedef struct tri

11、ple datamaxsize; int m,n,t; tripletable;,5.3.2(续)三元组顺序表,2020/7/30,25,转置,2020/7/30,26,5.3.2(续)三元组顺序表上的转置,转置,排序,2020/7/30,27,typedef struct triple datamaxsize; int m,n,t; tripletable;,Void transmatrix(tripletable A, tripletable /按照AT.datap.i进行非递减排序 ,5.3.2(续)三元组顺序表,2020/7/30,28,5.3.2(续)三元组顺序表上的转置(二),转置

12、,2020/7/30,29,设置向量num,numcol表示矩阵A中第col列中非零元的个数。(A的列数:A.n),5.3.2(续)三元组顺序表上的转置(二),for(col=1;col=A.n;+col) numcol = 0; for(p=1;p=A.t;+p) /计算A中每列非零元的个数 numA.datap.j+;,列号,2020/7/30,30,设置向量cpot,cpotcol指示A中第col列的第一个非零元在转置矩阵AT.data中的恰当位置。,5.3.2(续)三元组顺序表上的转置(二),cpot1=1 cpotcol=cpotcol-1+numcol-1 2colA.n,cpot

13、1=1; for(col = 2; col=A.n; +col) cpotcol=cpotcol-1+numcol-1;,2020/7/30,31,5.3.2(续)三元组顺序表上的转置(二),cpot,1,3,5,7,8,8,9,1 2 3 4 5 6 7,num,2,2,2,1,0,1,0,2020/7/30,32,转置,cpot,1,3,5,7,8,8,9,1 2 3 4 5 6 7,2 1 12,三元组顺序表上的转置(二续),2020/7/30,33,转置,cpot,1,4,5,7,8,8,9,1 2 3 4 5 6 7,2 1 12,三元组顺序表上的转置(二续),2020/7/30,3

14、4,转置,cpot,1,4,5,7,8,8,9,1 2 3 4 5 6 7,2 1 12,3 1 9,三元组顺序表上的转置(二续),2020/7/30,35,转置,cpot,1,4,6,7,8,8,9,1 2 3 4 5 6 7,2 1 12,3 1 9,三元组顺序表上的转置(二续),2020/7/30,36,转置,cpot,1,4,6,7,8,8,9,1 2 3 4 5 6 7,2 1 12,3 1 9,1 3 -3,三元组顺序表上的转置(二续),2020/7/30,37,转置,cpot,2,4,6,7,8,8,9,1 2 3 4 5 6 7,2 1 12,3 1 9,6 3 14,1 3

15、-3,三元组顺序表上的转置(二续),2020/7/30,38,转置,cpot,2,4,6,7,8,9,9,1 2 3 4 5 6 7,2 1 12,3 1 9,3 4 24,1 3 -3,6 3 14,三元组顺序表上的转置(二续),2020/7/30,39,转置,cpot,2,4,7,7,8,9,9,1 2 3 4 5 6 7,2 1 12,3 1 9,2 5 18,1 3 -3,6 3 14,3 4 24,三元组顺序表上的转置(二续),2020/7/30,40,转置,cpot,2,5,7,7,8,9,9,1 2 3 4 5 6 7,2 1 12,3 1 9,1 6 15,1 3 -3,6 3

16、 14,3 4 24,2 5 18,三元组顺序表上的转置(二续),2020/7/30,41,转置,cpot,3,5,7,7,8,9,9,1 2 3 4 5 6 7,2 1 12,3 1 9,4 6 -7,1 3 -3,6 3 14,3 4 24,2 5 18,1 6 15,三元组顺序表上的转置(二续),2020/7/30,42,for(col=1;col=A.n;+col) numcol = 0; for(p=1;p=A.t;+p) /计算A中每列非零元的个数 numA.datap.j+;,5.3.2(续)三元组顺序表上的转置(二),cpot1=1; for(col = 2; col=A.n;

17、 +col) /计算元素位置 cpotcol=cpotcol-1+numcol-1;,2020/7/30,43,for(col=1;col=A.n;+col) numcol = 0; for(p=1;p=A.t;+p) /计算A中每列非零元的个数 numA.datap.j+;,cpot1=1; for(col = 2; col=A.n; +col) /计算元素位置 cpotcol=cpotcol-1+numcol-1;,for(p = 1; p=A.t; +p) /转置 col = A.datap.j; q = cpotcol; AT.dataq.i = A.datap.j; AT.dataq

18、.j = A.datap.i; AT.dataq.v = A.datap.v; cpotcol+; ,2020/7/30,44,十字链表,2020/7/30,45,5.3广义表的定义,广义表是线性表的推广。 L=(a1,a2,.,an ),n0,ai可以是单元素,也可以是一个表。 例如: A = () B = (e) C = (a,(b,c,d) D = (A,B,C) E = (a,E),广义表的长度 广义表的深度 非空广义表 表头(Head):第一个元素 表尾(Tail):除第一个元素外其余元素构成的表,2020/7/30,46,广义表的存储结构(一),链表存储 C = (a,(b,c,d

19、) D = (A,B,C) E = (a,E) 链表结点结构,tag=1,hp,tp,表结点,tag=0,atom,原子结点,2020/7/30,47,广义表的存储结构(一),C = (a,(b,c,d),C,Head(C) = a Tail(C)=(b,c,d),2020/7/30,48,广义表的存储结构(一),C = (a,(b,c,d),C,Head(C) = a Tail(C)=(b,c,d),(b,c,d),2020/7/30,49,广义表的存储结构(一),C = (a,(b,c,d),C,Head(C) = a Tail(C)=(b,c,d),(b,c,d),(c,d),(d),2020/7/30,50,广义表的存储结构(一),C = (a,(b,c,d),2020/7/30,51,B= (e),B,2020/7/30,52,A= (),B,A,2020/7/30,53,D= (A,B,C),B,A,D,(B,C),(C),2020/7/30,54,5.4广义表的存储结构(一),链表结点结构,tag=1,hp,tp,表结点,tag=0,atom,原子结点,typedef enum ATOM,LIST ElemTag; Typedef struct GLNode ElemTag tag; union AtomType atom

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论