实用数据结构基础第6章-多维数组和广义表课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《实用数据结构基础第6章-多维数组和广义表课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实用 数据结构 基础 多维 数组 广义 课件
- 资源描述:
-
1、2011年5月11日星期三1第 6 6 章 树 知 识 点 多维数组的逻辑结构和存储结构多维数组的逻辑结构和存储结构 特殊矩阵的压缩存储特殊矩阵的压缩存储 稀疏矩阵的三元组存储、十字链表存储稀疏矩阵的三元组存储、十字链表存储 广义表的逻辑结构、存储结构及其基本算法广义表的逻辑结构、存储结构及其基本算法 难难 点点 多维数组和广义表可以看作是线性表的推广,其特点是线性表中的数据元素仍然是一个表。第 6 6 章 目 录 6-1 6-1 多维数组多维数组 6-2 6-2 特殊矩阵的压缩存储特殊矩阵的压缩存储 6-3 6-3 稀疏矩阵稀疏矩阵 6-4 6-4 广义表广义表 小小 结结 验证性实验:验证
2、性实验:稀疏矩阵和广义表子系统稀疏矩阵和广义表子系统 自主性实验自主性实验6 6:稀疏矩阵十字链表的存储:稀疏矩阵十字链表的存储 单元练习单元练习6 6-1 多维数组多维数组6.1.1 逻辑结构逻辑结构 数组作为一种数据结构,其特点是结构中的元素可以是具有某种结数组作为一种数据结构,其特点是结构中的元素可以是具有某种结构的数据,但属于同一数据类型。比如,一维数组可以看作一个线性表,构的数据,但属于同一数据类型。比如,一维数组可以看作一个线性表,二维数组可以看作二维数组可以看作“数据元素是一维数组数据元素是一维数组”的一维数组,三维数组可以的一维数组,三维数组可以看作看作“数据元素是二维数组数据
3、元素是二维数组”的一维数组。一般把三维以上的数组称为的一维数组。一般把三维以上的数组称为多维数组,多维数组,n维的多维数组可以视为维的多维数组可以视为n 1维数组元素组成的线性结构。其维数组元素组成的线性结构。其中每一个一维数组又由中每一个一维数组又由m个单元组成。个单元组成。图图6-1是一个是一个n行行m列的数组。列的数组。在二维数组中的每一个元素最多可以有两个直接前驱和两个直接后继(边在二维数组中的每一个元素最多可以有两个直接前驱和两个直接后继(边界除外),在界除外),在n维数组中的每一个元素最多可以有维数组中的每一个元素最多可以有n个直接前驱和个直接前驱和n个直接后继。个直接后继。所以多
4、维数组是一种非线性结构。所以多维数组是一种非线性结构。数组是一个具有固定格式和数量的数据有序集,每一个数据元素有唯一的数组是一个具有固定格式和数量的数据有序集,每一个数据元素有唯一的一组下标来标识,通常在很多高级语言中数组一旦被定义,每一维的大小及上一组下标来标识,通常在很多高级语言中数组一旦被定义,每一维的大小及上下界都不能改变。因此,在数组上一般不做插入或删除数据元素的操作。在数下界都不能改变。因此,在数组上一般不做插入或删除数据元素的操作。在数组中经常做的两种操作如下。组中经常做的两种操作如下。(1)取值操作:给定一组下标,读取其对应的数据元素。)取值操作:给定一组下标,读取其对应的数据
5、元素。(2)赋值操作:给)赋值操作:给定一组下标,存储或修改与其相对应的数据元素。定一组下标,存储或修改与其相对应的数据元素。6.1.2 存储结构存储结构 通常,数组在内存被映象为向量,即用向量作为数组的一种存通常,数组在内存被映象为向量,即用向量作为数组的一种存储结构,这是因为在计算机内存储结构是一维的。数组的行列固储结构,这是因为在计算机内存储结构是一维的。数组的行列固定后,通过一个映象函数,就可以根据数组元素的下标得到它的定后,通过一个映象函数,就可以根据数组元素的下标得到它的存储地址。对于一维数组只要按下标顺序分配即可;存储地址。对于一维数组只要按下标顺序分配即可;对多维数组对多维数组
6、分配时,要把它的元素映象存储在一维存储器中。分配时,要把它的元素映象存储在一维存储器中。1存储方式存储方式(1)以行为主()以行为主(row major order)以行为主的存储方式也称为按行优先顺序方式,实现时按行号以行为主的存储方式也称为按行优先顺序方式,实现时按行号从小到大的顺序,先存储第从小到大的顺序,先存储第0行的全部元素,再存放第行的全部元素,再存放第1行的元素、行的元素、第第2行的元素行的元素 一个一个23二维数组的逻辑结构如图二维数组的逻辑结构如图6-2所示,以行为主的内存所示,以行为主的内存映象如图映象如图6-3(a)所示,其分配顺序为:)所示,其分配顺序为:a00,a01
7、,a02,a10,a11,a12。以行为主序的分配规律是:最右边的下标先变化,即最右下标以行为主序的分配规律是:最右边的下标先变化,即最右下标从小到大,循环一遍后,右边第二个下标再变从小到大,循环一遍后,右边第二个下标再变,从右向左,从右向左,最后是左下标。最后是左下标。(2)以列为主序()以列为主序(column major order)以列为主的存储方式也称为按列优先顺序方式,实现时按列号以列为主的存储方式也称为按列优先顺序方式,实现时按列号从小到大的顺序,先存储第从小到大的顺序,先存储第0列的全部元素,再存储第列的全部元素,再存储第1列的元素、列的元素、第第2 列的元素列的元素 图图6-
8、2所示的逻辑结构,以列为主的内存映象如图所示的逻辑结构,以列为主的内存映象如图6-3(b)所示,)所示,其分配顺序为:其分配顺序为:a00,a10,a01,a11,a02,a12。以列为主分配的规律恰好与以行为主次序相反:最左边的下标以列为主分配的规律恰好与以行为主次序相反:最左边的下标先变化,即最左下标从小到大,循环一遍后,左边第二个下标再先变化,即最左下标从小到大,循环一遍后,左边第二个下标再变变,从左向右,最后是右下标。,从左向右,最后是右下标。2存储地址存储地址“以行为主以行为主”次序分配存储单元为例看其地址的计算次序分配存储单元为例看其地址的计算(1)二维数组中)二维数组中aij的地
9、址的地址 在在C语言中数组中每一维的下界定义为语言中数组中每一维的下界定义为0,数组的基址为,数组的基址为LOC(a00),每个数组,每个数组元素占据元素占据d个字节,那么个字节,那么aij 的物理地址可用一个线性寻址函数计算:的物理地址可用一个线性寻址函数计算:LOC(aij)=LOC(a00)+(in+j)d (0下标起始的语言)下标起始的语言)(2)三维数组中)三维数组中aijk的地址的地址 同理对于三维数组元素同理对于三维数组元素aijk的物理地址为:的物理地址为:LOC(aijk)=LOC(a000)+(inp+jp+k)d (0下标起始的语言)下标起始的语言)【例例6-1】设二维数
10、组设二维数组A56,每个元素占,每个元素占4个字节(个字节(Byte),存储),存储器按字节编址。已知器按字节编址。已知A的起始地址为的起始地址为2000。计算。计算(1)数组的大小)数组的大小 nmd=564=120 Byte(2)数组结点)数组结点a45的存储地址的存储地址 LOC(aij)=LOC(a00)+(i*n+j)*d /n为总列数为总列数 LOC(a45)=2000+(46+5)4=2116(3)按行为主存储,计算)按行为主存储,计算a32的存储地址的存储地址 LOC(aij)=LOC(a00)+(i*n+j)*d /n为总列数为总列数 LOC(a32)=2000+(36+2)
11、4=2080(4)按列为主存储,计算)按列为主存储,计算a32的存储地址的存储地址 LOC(aij)=LOC(a00)+(j*m+i)*d /m为总行数为总行数 LOC(a32)=2000+(25+3)4=2052 【例例6-2】若矩阵若矩阵A An nm m 中存在某个元素中存在某个元素a aijij,满足:,满足:a aijij是第是第i i行中最小行中最小值且是第值且是第j j列中的最大值,则称该元素为矩阵列中的最大值,则称该元素为矩阵A A的一个鞍点。试编写的一个鞍点。试编写一个算法,找出一个算法,找出A A中的所有鞍点。中的所有鞍点。基本思想:在矩阵基本思想:在矩阵A A中求出每一行
12、的最小值元素,然后判断该元素是中求出每一行的最小值元素,然后判断该元素是否是它所在列中的最大值。如果是则打印输出,接着处理下一行。否是它所在列中的最大值。如果是则打印输出,接着处理下一行。设矩阵设矩阵A A用一个二维数组表示,其算法如下:用一个二维数组表示,其算法如下:void saddle(int A,int n,int m)int i,j,min;for(i=0;in;i+)/按行处理按行处理 min=Ai0 for(j=1;jm;j+)if(Aijmin)min=Aij;/找第找第i行最小值行最小值 for(j=0;jm;j+)/检测最小值是否是鞍点检测最小值是否是鞍点 if(Aij=m
13、in)k=j;p=0;while(pn&Apj=n)printf(%d,%d,%dn,i,k,min);算法的时间复杂度为算法的时间复杂度为O O(n n(m m+n mn m)。6-2 特殊矩阵的压缩存储 矩阵是一个二维数组,是众多科学与工程计矩阵是一个二维数组,是众多科学与工程计算问题中研究的数学对象。在矩阵中非零元素或算问题中研究的数学对象。在矩阵中非零元素或零元素的分布有一定规律的矩阵称为特殊矩阵,零元素的分布有一定规律的矩阵称为特殊矩阵,如三角矩阵、对称矩阵、带状矩阵、稀疏矩阵等如三角矩阵、对称矩阵、带状矩阵、稀疏矩阵等。当矩阵的阶数很大时,用普通的二维数组存储。当矩阵的阶数很大时,
14、用普通的二维数组存储这些特殊矩阵将会占用很多的存储单元。从节约这些特殊矩阵将会占用很多的存储单元。从节约存储空间的角度考虑,下面来考虑这些特殊矩阵存储空间的角度考虑,下面来考虑这些特殊矩阵的存储方法。的存储方法。6.2.1 对称矩阵对称矩阵 对称矩阵是一种特殊矩阵,对称矩阵是一种特殊矩阵,n阶方阵的元素满足性质:阶方阵的元素满足性质:aij=aji(0=i,j=n 1)。)。如图如图6-4所示是一个阶对称矩阵。对称矩阵是关于主对角线所示是一个阶对称矩阵。对称矩阵是关于主对角线的对称,因此只需存储上三角或下三角部分的数据即可。比如,的对称,因此只需存储上三角或下三角部分的数据即可。比如,只存储下
15、三角中的元素只存储下三角中的元素aij,其特点是中,其特点是中j=i且且0=i=n 1,对于上,对于上三角中的元素三角中的元素aij,它和对应的,它和对应的aji相等,因此当访问的元素在上三相等,因此当访问的元素在上三角时,直接去访问和它对应的下三角元素即可,这样,原来需要角时,直接去访问和它对应的下三角元素即可,这样,原来需要n n个存储单元,现在只需要个存储单元,现在只需要n(n+1)/2个存储单元了,节约了个存储单元了,节约了n(n 1)/2个存储单元。个存储单元。图图6-4 5阶对称方阵及它的压缩存储阶对称方阵及它的压缩存储 如何只存储下三角部分呢?将下三角部分以行序为主序顺序存储到一
16、个向量如何只存储下三角部分呢?将下三角部分以行序为主序顺序存储到一个向量SA中去。在下三角中共有中去。在下三角中共有n(n+1)/2个元素,存储到一个向量空间个元素,存储到一个向量空间SA0至至SAn(n+1)/2-1中,存储顺序可用图中,存储顺序可用图6-5示意。示意。图图6-5 6-5 对称矩阵下三角压缩存储对称矩阵下三角压缩存储 原矩阵下三角中的某一个元素原矩阵下三角中的某一个元素aij具体对应一个具体对应一个sasak k,用,用“以行优先以行优先”存放下存放下三角部分的元素时,三角部分的元素时,a00存入存入sa0,a10存入存入sa1,a11存入存入sa2。sasak k与与aij
17、的一一的一一对应关系为:对应关系为:k=j(j+1)/2+i (0=k n(n+1)/2 1)当当ij时,在下三角部分时,在下三角部分aij前有前有i行,共有行,共有1+2+3+i个元素,而个元素,而aij是第是第i行的第行的第j个个元素,即有元素,即有k=1+2+3+i+j=i(i+1)/2+j。当当ij时,时,aij是上三角中的元素,因为是上三角中的元素,因为aij=aji,这样,访问上三角中的元素,这样,访问上三角中的元素aij时则去访问和它对应的下三角中的时则去访问和它对应的下三角中的aji即可,因此将上式中的行列下标交换就是上即可,因此将上式中的行列下标交换就是上三角中的元素在三角中
18、的元素在SA中的对应关系:中的对应关系:k=j(j+1)/2+i (0=krow=m;H-row=m;H-col=n;H-col=n;hd0=H;hd0=H;for(i=1;iS;i+)for(i=1;irow=0;p-col=0;p-row=0;p-col=0;p-right=p;p-down=p;p-right=p;p-down=p;hdi=p;hdi-1-v_next.next=p;hdi=p;hdi-1-v_next.next=p;hdS-v_next.next=H;hdS-v_next.next=H;/将头结点们形成循环链表将头结点们形成循环链表 for(k=1;k=t;k+)for
19、(k=1;krow=i;p-col=j;p-v_next.v=v p-row=i;p-col=j;p-v_next.v=v q=hdi;q=hdi;while(q-right!=hdi&(q-right-col)right!=hdi&(q-right-col)right;q=q-right;p-right=q-right;/p-right=q-right;/插入插入 q-right=p;q=hdi;q-right=p;q=hdi;while(q-down!=hdj&(q-down-row)down!=hdj&(q-down-row)down;q=q-down;p-down=q-down;p-d
展开阅读全文