数据结构 第五章.ppt_第1页
数据结构 第五章.ppt_第2页
数据结构 第五章.ppt_第3页
数据结构 第五章.ppt_第4页
数据结构 第五章.ppt_第5页
免费预览已结束,剩余59页可下载查看

下载本文档

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

文档简介

1、数据结构Data Structure,回顾,栈和队列的特点 顺序栈的插入、删除 循环队列的插入、删除 串的基本操作,第五章 数组和广义表,5.1 数组的类型定义,5.3 矩阵的压缩存储,5.2 数组的顺序表示和实现,线性表具有相同类型的数据元素的有限序列。,限制插入、删除位置,线性表具有相同类型的数据元素的有限序列。,限制元素类型为字符,串零个或多个字符组成的有限序列 。,5.1 数组的类型定义,线性表具有相同类型的数据元素的有限序列。,将元素的类型进行扩充,数组的定义,数组是由一组类型相同的数据元素构成的有序集合,每个数据元素称为一个数组元素(简称为元素),每个元素受n(n1)个线性关系的约

2、束,每个元素在n个线性关系中的序号i1、i2、in称为该元素的下标,并称该数组为 n 维数组。,数组的特点,元素本身可以具有某种结构,属于同一数据类型; 数组是一个具有固定格式和数量的数据集合。,数组,数组,a11 a12 a1n a21 a22 a2n am1 am2 amn,A=,例如,元素a22受两个线性关系的约束,在行上有一个行前驱a21和一个行后继a23,在列上有一个列前驱a12和和一个列后继a32。,数组示例,a11 a12 a1n a21 a22 a2n am1 am2 amn,A=,数组线性表的推广,二维数组是数据元素为线性表的线性表。,数组,数组的基本操作,数组,在数组中插入

3、(或删除)一个元素有意义吗?,将元素 x 插入 到数组中第1行第2列。,删除数组中 第1行第2列元素。,数组的基本操作, 存取:给定一组下标,读出对应的数组元素; 修改:给定一组下标,存储或修改与其相对应的数组元素。 存取和修改操作本质上只对应一种操作寻址,数组应该采用何种方式存储?,数组没有插入和删除操作,所以,不用预留空间,适合采用顺序存储。,数组,数组的存储结构与寻址一维数组,设一维数组的下标的范围为闭区间l,h,每个数组元素占用 c 个存储单元,则其任一元素 ai 的存储地址可由下式确定: Loc(ai)Loc(al)(il)c,5.2 数组的顺序表示和实现,常用的映射方法有两种: 按

4、行优先:先行后列,先存储行号较小的元素,行号相同者先存储列号较小的元素。 按列优先:先列后行,先存储列号较小的元素,列号相同者先存储行号较小的元素。,数组的存储结构与寻址二维数组,二维数组,例如:,称为基地址或基址。,以“行序为主序”的存储映象,二维数组A中任一元素ai,j 的存储位置 LOC(i,j) = LOC(0,0) + (b2ij),a0,1,a0,0,a0,2,a1,0,a1,1,a1,2,a0,1,a0,0,a0,2,a1,0,a1,1,a1,2,L,L,l2,h2,l1,h1,(a) 二维数组,aij前面的元素个数 =阴影部分的面积 =整行数每行元素个数+本行中aij前面的元素

5、个数 =(i -l1)(h2 -l21)(j -l2),按行优先存储的寻址,二维数组,第l1行,第l1+1行,(i -l1)(h2 -l21)(j -l2)个元素,Loc(aij)Loc(al1l2)(il1)(h2l21)(jl2)c,按行优先存储的寻址,按列优先存储的寻址方法与此类似。,二维数组,Loc(aijk ) = Loc(a000) +( im2m3 + jm3 + k )c,n(n2)维数组一般也采用按行优先和按列优先两种存储方法。请自行推导任一元素存储地址的计算方法。,数组的存储结构与寻址多维数组,多维数组,特殊矩阵:矩阵中很多值相同的元素并且它们的分布有一定的规律。 稀疏矩阵

6、:矩阵中有很多零元素。,压缩存储的基本思想是: 为多个值相同的元素只分配一个存储空间; 对零元素不分配存储空间。,特殊矩阵和稀疏矩阵,5.3 矩阵的压缩存储,特殊矩阵的压缩存储对称矩阵,36478 62842 48169 74605 82957,A,对称矩阵特点:aij=aji,如何压缩存储?,只存储下三角部分的元素。,矩阵的压缩存储,(a) 下三角矩阵 (b) 存储说明 (c) 计算方法,aij在一维数组中的序号 =阴影部分的面积 = i(i+1)/2+ j+1 一维数组下标从0开始 aij在一维数组中的下标 k= i(i+1)/2+ j,0 i n-1,0 j n-1,aij,对称矩阵的压

7、缩存储,矩阵的压缩存储,对于下三角中的元素aij(ij),在数组SA中的下标k与i、j的关系为:ki(i1)/2j 。 上三角中的元素aij(ij),因为aijaji,则访问和它对应的元素aji即可,即:kj(j1)/2i 。,对称矩阵的压缩存储,矩阵的压缩存储,特殊矩阵的压缩存储三角矩阵,3 cc c c 6 2c c c 4 81 c c 7 46 0 c 8 29 5 7,(a)下三角矩阵,3 4 8 1 0 c2 9 4 6 cc 5 7 cc c 0 8 cc c c 7,(b)上三角矩阵,如何压缩存储?,只存储上三角(或下三角)部分的元素。,矩阵的压缩存储,矩阵中任一元素aij在数

8、组中的下标k与i、j的对应关系:,下三角矩阵的压缩存储,矩阵的压缩存储,矩阵中任一元素aij在数组中的下标k与i、j的对应关系:,上三角矩阵的压缩存储,矩阵的压缩存储,作业,二维数组A的每个元素是由6个字符组成的串,行下标的范围从08,列下标的范围是从09,则存放A至少需要(D)个字节,A的第8列和第5行共占(E)个字节,若A按行优先方式存储,元素A85的起始地址与当A按列优先方式存储时的(K)元素的起始地址一致。A 90 B 180 C 240 D 540 E 108 F 114 G 54 H A85 I A310 J A58 K A49,假设 m 行 n 列的矩阵含 t 个非零元素,则称

9、为稀疏因子 通常认为 0.05 的矩阵为稀疏矩阵,稀疏矩阵的压缩存储,何谓稀疏矩阵?,15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,A=,以常规方法,即以二维数组表示 高阶的稀疏矩阵时产生的问题:,1) 零值元素占了很大空间;,2) 计算中进行了很多和零值的运算, 遇除法,还需判别除数是否为零;,1) 尽可能少存或不存零值元素;,解决问题的原则:,2) 尽可能减少没有实际意义的运算;,3)

10、 操作方便; 即: 能尽可能快地找到 与下标值 (i, j) 对应的元素; 能尽可能快地找到 同一行或同一列的非零值元;,随机稀疏矩阵的压缩存储方法:,一、三元组顺序表,二、行逻辑联接的顺序表,三、 十字链表,#define MAXSIZE 12500 typedef struct int i, j; /该非零元的行下标和列下标 ElemType e; / 该非零元的值 Triple; / 三元组类型,一、三元组顺序表,typedef struct Triple dataMAXSIZE + 1; int mu, nu, tu; TSMatrix; / 稀疏矩阵类型,三元组顺序表操作转置操作,例

11、:,1 1 15 1 4 22 1 6 -15 2 2 11 2 3 3 3 4 6 5 1 91 空 空 空 闲 闲 闲,row col e,1 2 3 4 5 6 7,MAXSIZE+1,5(矩阵的行数),6(矩阵的行数),MAXSIZE+1,三元组顺序表转置算法算法,基本思想:直接取,顺序存。即在M的三元组顺序表中依次找第0列、第1列、直到最后一列的三元组,并将找到的每个三元组的行、列交换后顺序存储到T的三元组顺序表中。,1 1 15 1 4 22 1 6 -15 2 2 11 2 3 3 3 4 6 5 1 91 空 空 空 闲 闲 闲,row col e,1 2 3 4 5 6 7,

12、MAXSIZE+1,5(矩阵的行数),row col e,1 2 3 4 5 6 7,MAXSIZE+1,6(矩阵的行数),5(矩阵的列数) 7(非零元个数),设置矩阵T的行数、列数、非零元个数,1 1 15 1 4 22 1 6 -15 2 2 11 2 3 3 3 4 6 5 1 91 空 空 空 闲 闲 闲,row col e,1 2 3 4 5 6 7,MAXSIZE+1,5(矩阵的行数),row col e,1 2 3 4 5 6 7,MAXSIZE+1,6(矩阵的行数),在矩阵M中查找第1列非零元,顺序存储到矩阵T中,1 1 15 1 4 22 1 6 -15 2 2 11 2 3

13、 3 3 4 6 5 1 91 空 空 空 闲 闲 闲,row col e,1 2 3 4 5 6 7,MAXSIZE+1,5(矩阵的行数),row col e,1 2 3 4 5 6 7,MAXSIZE+1,6(矩阵的行数),在矩阵M中查找第2列非零元,顺序存储到矩阵T中,1 1 15 1 4 22 1 6 -15 2 2 11 2 3 3 3 4 6 5 1 91 空 空 空 闲 闲 闲,row col e,1 2 3 4 5 6 7,MAXSIZE+1,5(矩阵的行数),row col e,1 2 3 4 5 6 7,MAXSIZE+1,6(矩阵的行数),在矩阵M中查找第3列非零元,顺序

14、存储到矩阵T中,1 1 15 1 4 22 1 6 -15 2 2 11 2 3 3 3 4 6 5 1 91 空 空 空 闲 闲 闲,row col e,1 2 3 4 5 6 7,MAXSIZE+1,5(矩阵的行数),row col e,1 2 3 4 5 6 7,MAXSIZE+1,6(矩阵的行数),在矩阵M中查找第4列非零元,顺序存储到矩阵T中,1 1 15 1 4 22 1 6 -15 2 2 11 2 3 3 3 4 6 5 1 91 空 空 空 闲 闲 闲,row col e,1 2 3 4 5 6 7,MAXSIZE+1,5(矩阵的行数),row col e,1 2 3 4 5

15、 6 7,MAXSIZE+1,6(矩阵的行数),在矩阵M中查找第5列非零元,顺序存储到矩阵T中,1 1 15 1 4 22 1 6 -15 2 2 11 2 3 3 3 4 6 5 1 91 空 空 空 闲 闲 闲,row col e,1 2 3 4 5 6 7,MAXSIZE+1,5(矩阵的行数),row col e,1 2 3 4 5 6 7,MAXSIZE+1,6(矩阵的行数),在矩阵M中查找第6列非零元,顺序存储到矩阵T中,1 1 15 1 4 22 1 6 -15 2 2 11 2 3 3 3 4 6 5 1 91 空 空 空 闲 闲 闲,row col e,1 2 3 4 5 6

16、7,MAXSIZE+1,5(矩阵的行数),row col e,1 2 3 4 5 6 7,MAXSIZE+1,6(矩阵的行数),在矩阵M中查找第6列非零元,顺序存储到矩阵T中,Status TransposeSMatrix(TSMatrix M, TSMatrix / TransposeSMatrix,其时间复杂度为: O(nutu),三元组顺序表转置算法,其时间复杂度为: O(munu),for (col=1; col=nu; +col) for (row=1; row=mu; +row) Tcolrow = Mrowcol;,分析:M中第1列的第一个非零元素一定存储在T中下标为1的位置上,

17、该列中其它非零元素应存放在T中后面连续的位置上,那么第2列的第一个非零元素在T中的位置便等于第1列的第一个非零元素在T中的位置加上第1列的非零元素的个数,以此类推。,基本思想:顺序取,直接存。即在M中依次取三元组,交换其行号和列号放到T中适当位置。,三元组顺序表转置算法算法,如何确定当前从M中取出的三元组在T中的位置?,row col e,1 2 3 4 5 6 7,MAXSIZE+1,6(矩阵的行数),第1列第1个非零元素,第1列有2个非零元素,第2列第1个非零元素,1 1 15 1 4 22 1 6 -15 2 2 11 2 3 3 3 4 6 5 1 91 空 空 空 闲 闲 闲,row

18、 col e,1 2 3 4 5 6 7,MAXSIZE+1,5(矩阵的行数),引入两个数组作为辅助数据结构: numnu:存储矩阵M中某列的非零元素的个数; cpotnu:初值表示矩阵M中某列的第一个非零元素在T中的位置。,数据结构设计:,num与cpot存在如下递推关系:,1 1 15 1 4 22 1 6 -15 2 2 11 2 3 3 3 4 6 5 1 91 空 空 空 闲 闲 闲,row col e,1 2 3 4 5 6 7,MAXSIZE+1,5(矩阵的行数),根据矩阵M计算num和cpot,2,1,1,2,0,1,1,3,4,5,7,7,1 1 15 1 4 22 1 6

19、-15 2 2 11 2 3 3 3 4 6 5 1 91 空 空 空 闲 闲 闲,row col e,1 2 3 4 5 6 7,5(矩阵的行数),将矩阵M中col列元素存放在T中下标为cpotcol的位置,row col e,1 2 3 4 5 6 7,6(矩阵的行数),cpot2,cpot3,cpot4,cpot5 cpot6,1 1 15 1 4 22 1 6 -15 2 2 11 2 3 3 3 4 6 5 1 91 空 空 空 闲 闲 闲,row col e,1 2 3 4 5 6 7,5(矩阵的行数),row col e,1 2 3 4 5 6 7,6(矩阵的行数),cpot2,

20、cpot3,cpot5 cpot6,将矩阵M中col列元素存放在T中下标为cpotcol的位置,1 1 15 1 4 22 1 6 -15 2 2 11 2 3 3 3 4 6 5 1 91 空 空 空 闲 闲 闲,row col e,1 2 3 4 5 6 7,5(矩阵的行数),row col e,1 2 3 4 5 6 7,6(矩阵的行数),cpot2,cpot3,cpot5,cpot6,将矩阵M中col列元素存放在T中下标为cpotcol的位置,1 1 15 1 4 22 1 6 -15 2 2 11 2 3 3 3 4 6 5 1 91 空 空 空 闲 闲 闲,row col e,1

21、2 3 4 5 6 7,5(矩阵的行数),row col e,1 2 3 4 5 6 7,6(矩阵的行数),cpot3,cpot5,cpot2,将矩阵M中col列元素存放在T中下标为cpotcol的位置,1 1 15 1 4 22 1 6 -15 2 2 11 2 3 3 3 4 6 5 1 91 空 空 空 闲 闲 闲,row col e,1 2 3 4 5 6 7,5(矩阵的行数),row col e,1 2 3 4 5 6 7,6(矩阵的行数),cpot3,cpot5,cpot2,cpot2,将矩阵M中col列元素存放在T中下标为cpotcol的位置,1 1 15 1 4 22 1 6

22、-15 2 2 11 2 3 3 3 4 6 5 1 91 空 空 空 闲 闲 闲,row col e,1 2 3 4 5 6 7,5(矩阵的行数),row col e,1 2 3 4 5 6 7,6(矩阵的行数),cpot5,cpot2,cpot4,将矩阵M中col列元素存放在T中下标为cpotcol的位置,1 1 15 1 4 22 1 6 -15 2 2 11 2 3 3 3 4 6 5 1 91 空 空 空 闲 闲 闲,row col e,1 2 3 4 5 6 7,5(矩阵的行数),row col e,1 2 3 4 5 6 7,6(矩阵的行数),cpot5,cpot2,cpot4,将矩阵M中col列元素存放在T中下标为cpotcol的位置,1. 设置转置后矩阵T的行数、列数和非零元素的个数; 2. 计算M中每一列的非零元素个数; 3. 计算M中每一列的第一个非零元素在T中的下标; 4. 依次取M中的每一个非零元素对应的三元组; 4.1 确定该元素在T中的下标; 4.2 将该元素的行号列号交换后存入T中的位置; 4.3 预置该元素所在列的下一个元素的存放位置;,三元组顺序表转置算法,Status FastTransposeSMatrix(TSMatrix M, TSMatrix /

温馨提示

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

评论

0/150

提交评论