数据结构C语言版第5章数组和广义表.ppt
《数据结构C语言版第5章数组和广义表.ppt》由会员分享,可在线阅读,更多相关《数据结构C语言版第5章数组和广义表.ppt(64页珍藏版)》请在三一办公上搜索。
1、数 组 和 广 义 表,1、数组的定义和顺序存储方式;2、特殊矩阵的压缩存储;3、稀疏矩阵;4、广义表的概念、表示及基本操作;广义表存储结构的实现。,教学内容,5.1 数组的定义,数组:按一定格式排列起来的 具有相同类型的数据元素的集合。,一维数组:若线性表中的数据元素为非结构的简单元素,则称为一维数组。,一维数组的逻辑结构:线性结构。定长的线性表。,声明格式:数据类型 变量名称长度;,例:int num5=0,1,2,3,4;,二维数组:若一维数组中的数据元素又是一维数组结构,则称为二维数组。,非线性结构,num5=0,1,2,3,4;,A=(0,1,p)(p=m-1 or n-1),j=(
2、a0j,a1j,am-1,j)0jn-1,i=(ai0,ai1,ai,n-1)0im-1,二维数组的逻辑结构,线性结构定长的线性表,每一个数据元素 既在一个行表中,又在一个列表中。,该线性表的每个数据元素 也是一个定长的线性表。,在 C 语言中,一个二维数组类型也可以定义为 一维数组类型(其分量类型为一维数组类型),即:typedef elemtype array2mn;等价于:typedef elemtype array1n;typedef array1 array2m;,声明格式:数据类型 变量名称行数 列数;,例:int num5 8;,三维数组:若二维数组中的元素又是一个一维数组结构,
3、则称作三维数组。,n 维数组:若 n-1 维数组中的元素又是一个一维数组结构,则称作 n 维数组。,线性表结构是数组结构的一个特例,而数组结构又是线性表结构的扩展。,结论,数组特点:结构固定定义后,维数和维界不再改变。,数组基本操作:除了结构的初始化和销毁之外,只有取元素和修改元素值的操作。,数组的抽象数据类型的定义,ADT Array 数据对象:Da j1 j2 jn|ji=0,.,bi-1,i=1,2,.,n,n(0)称为数组的维数,bi 是数组第 i 维的长度,ji 是数组元素的第 i 维下标,a j1 j2 jnElemSet 数据关系:RR1,R2,.,Rn Ri|0jkbk-1,1
4、kn 且 ki,0jibi-2,aj1jijn,aj1ji+1jnD,i=2,.,n,数据对象:D=aij|0 i b1-1,0 j b2-1 数据关系:R=ROW,COL ROW=|0 i b1-2,0 j b2-1 COL=|0 i b1-1,0 j b2-2,二维数组的抽象数据类型的数据对象和数据关系的定义,基本操作:InitArray(&A,n,bound1,.,boundn)操作结果:若维数 n 和各维长度合法,则构造相应的数组 A,并返回 OK。DestroyArray(&A)操作结果:销毁数组 A。Value(A,&e,index1,.,indexn)初始条件:A 是 n 维数组
5、,e 为元素变量,随后是 n 个下标值。操作结果:若各下标不超界,则 e 赋值为所指定的A的元素值,并返回 OK。Assign(&A,e,index1,.,indexn)初始条件:A 是 n 维数组,e 为元素变量,随后是 n 个下标值。操作结果:若下标不超界,则将 e 的值赋给所指定的A的元素,并返回 OK。ADT Array,数组特点:结构固定维数和维界不变。,数组基本操作:初始化、销毁、取元素、修改元素值。,5.2 数组的顺序表示和实现,一般不做插入和删除操作。,因为,所以:,一般都是采用顺序存储结构来表示数组。,注意:数组可以是多维的,但存储数据元素的内存单元地址 是一维的,因此,在存
6、储数组结构之前,需要解决将 多维关系映射到一维关系的问题。,两种顺序存储方式,以行序为主序(低下标优先)BASIC、COBOL和PASCAL,以列序为主序(高下标优先)FORTRAN,以行序为主序存放:,二维数组中任一元素 aij 的存储位置 LOC(i,j)=LOC(0,0)+(b2ij)L,某个元素的地址就是它前面所有行 所占的单元加上它所在行前面所有列元 素所占的单元数之和。,二维数组的映象函数,按列序为主序存放,二维数组中任一元素 aij 的存储位置 LOC(i,j)=LOC(0,0)+(b1ji)L,某个元素的地址就是它前面所有列 所占的单元加上它所在列前面所有行元 素所占的单元数之
7、和。,例 1:一个二维数组 A,行下标的范围是 1 到 6,列下标 的范围是 0 到 7,每个数组元素用相邻的 6 个字节 存储,存储器按字节编址。那么,这个数组的体积 是 个字节。,答:Volume=mnL=(6 1+1)(7 0+1)6=486=288,288,例 2:某校计算机系考研题 设数组 A059,069 的基地址为 2048,每个元素占 2 个 存储单元,若以列序为主序顺序存储,则元素 A31,57 的存储 地址为。,解:LOC(i,j)=LOC(31,57)=LOC(0,0)+(b1ji)L=2048+(605731)2=8950,8950,作业:5.1,5.3 矩阵的压缩存储
8、,矩阵定义:一个由 mn 个元素排成的 m 行(横向)n 列(纵向)的表。,矩阵的常规存储:将矩阵描述为一个二维数组。,矩阵的常规存储的特点:可以对其元素进行随机存取;矩阵运算非常简单;存储的密度为 1。,不适宜常规存储的矩阵:值相同的元素很多且呈某种规律 分布;零元素多。,矩阵的压缩存储:为多个相同的非零元素只分配一个存储 空间;对零元素不分配空间。,5.3.1 特殊矩阵,特殊矩阵:元素值的排列具有一定规律的矩阵。,对称矩阵、下(上)三角矩阵、对角线矩阵等。,1、对称矩阵 在一个 n 阶方阵 A 中,若元素满足下述性质:aij=aji 1 i,j n 则称 A 为对称矩阵。,对称矩阵上下三角
9、中的元素数均 为:n(n+1)/2 可以行序为主序将元素存放在一 个一维数组 san(n+1)/2 中。,对称矩阵的存储结构,k=0 1 2 3 4 n(n-1)/2 n(n+1)/2-1,以行序为主序存储下三角:,则 aij 和 sak 存在着一一对应关系:,aij 前的 i-1 行有 1+2+(i-1)=i(i-1)/2 个元素,在第 i 行上有 j 个元素。,因为aij=aji,所以只要交换上述 对应关系式中的 i 和 j 即可。,k=0 1 2 3 4 n(n-1)/2,以行序为主序存储下三角:,2、三角矩阵 以主对角线划分,三角矩阵有上(下)三角两种。上(下)三角矩阵的下(上)三角(
10、不含主对角线)中的元素均为常数。在大多数情况下,三角矩阵常数为零。,三角矩阵的存储:除了存储主对角线及上(下)三角中的元 素外,再加一个存储常数 c 的空间。,3、对角矩阵 在对角矩阵中,所有的非零元素集中在以主对角线为中心的 带状区域中,即除了主对角线和主对角线相邻两侧的若干条对角 线上的元素之外,其余元素皆为零。,对角矩阵可按行优先顺序或对角线的顺序,将其压缩存储到 一维数组中,且也能找到每个非零元素和向量下标的对应关系。,5.3.2 稀疏矩阵,稀疏矩阵:设在 mn 的矩阵中有 t 个非零元素。令=t/(mn)当 0.05 时称为稀疏矩阵。,压缩存储原则:存各非零元的值、行列位置和矩阵的行
11、列数。,M 由(1,2,12),(1,3,9),(3,1,-3),(3,6,14),(4,3,24),(5,2,18),(6,1,15),(6,4,-7)和矩阵维数(6,7)唯一确定。,三元组(i,j,aij)惟一确定矩阵的一个非零元。,三元组的不同表示方法可决定稀疏矩阵不同的压缩存储方法。,#define MAXSIZE 12500/假设非零元个数的最大值 typedef struct int i,j;/该非零元的行列下标 Elemtype e;Triple;typedef struct Triple dataMAXSIZE+1;int mu,nu,tu;/矩阵的行、列数和非零元个数 TSM
12、atrix;,i j tu,0 1 2 3 4 5 6 7 8,稀疏矩阵的压缩存储方法顺序存储结构,1、三元组顺序表,转置矩阵:一个 mn 的矩阵 M,它的转置 T 是一个 nm 的矩阵,且 T(i,j)=M j,i,1in,1jm,即 M 的行是 T 的列,M 的列是 T 的行。,求转置矩阵,问题描述:已知一个稀疏矩阵的三元组表,求该矩阵转置矩 阵的三元组表。,i j tu,0 1 2 3 4 5 6 7 8,解决思路:,将矩阵行、列 维数互换,将每个三元组 中的 i 和 j 相 互调换,重排三元组次 序,使 b.data 中元素以 T 的 行(M的列)为 主序。,M.data,i j tu
13、,0 1 2 3 4 5 6 7 8,T.data,T.data,i j tu,0 1 2 3 4 5 6 7 8,7 6 8,2 1 12,3 1 9,1 3-3,6 3 14,3 4 24,2 5 18,1 6 15,4 6-7,方法一:按 M 的列序转置,为找到 M 中每一列所有非零元素,需对其三元组表 M.data 从第一行起扫描一遍。由于 M 的列是 T 的行,且 T.data 中以 M 行序为主序,所以由此得到的 T.data 必定是按行优先存放的。,T.data,M.data,1 3-3,1 6 15,2 1 12,2 5 18,3 1 9,3 4 24,4 6-7,6 3 14
14、,typedef struct Triple dataMAXSIZE+1;int mu,nu,tu;/行、列、非零元数 TSMatrix;,Status TransposeSMatrix(TSMatrix M,TSMatrix/TransposeSMatrix,时间复杂度:O(nutu),若 tu 与munu 同数量级,则为:O(munu2),1 3-3,1 6 15,2 1 12,2 5 18,3 1 9,3 4 24,4 6-7,6 3 14,7 6 8,for(col=1;col=nu;+col)for(row=1;row=mu;+row)Tcolrow=Mrowcol;,一般矩阵转置算
15、法:,一般矩阵转置算法时间复杂度:O(munu),用三元组顺序表存储的矩阵转置算法时间复杂度:O(nutu),若 tu 与munu 同数量级,则为:O(munu2),算法仅适用于 tu munu 的情况。,结论,用三元组顺序表存储稀疏矩阵节约存储空间(优点);,tu与munu同数量级时,算法时间复杂度高(缺点);,方法二:按 M 的行序转置 快速转置,T.data,M.data,实施步骤:,1、确定 M 的第 1 列的第 1 个非零元在 T.data 中的位置。,1,3、确定 M 的第 col 列的第一个非零元在 T.data 中的位置。,2、确定 M 的第 col-1 列的非零元个数。,存入
16、数组 numM.nu,存入数组 cpotM.nu,cpot1=1;,cpotcol=cpotcol 1+numcol 1 2cola.nu,Status FastTransposeSMatrix(TSMatrix M,TSMatrix/求 M 中各列的第一个非零元在 T.data 中的序号,7 6 8,0 0 0 0 0 0 0,1,1,1,1,2,2,2,1,1,3,5,7,8,8,9,for(p=1;p=M.tu;+p)/转置矩阵元素 col=M.datap.j;q=cpotcol;T.dataq.i=M.datap.j;T.dataq.j=M.datap.i;T.dataq.e=M.da
17、tap.e;+cpotcol;/for/if return OK;/FastTransposeSMatrix,7 6 8,2,1,12,4,3,1,9,6,1,3,-3,2,6,3,14,9,3,4,24,7,2,5,18,5,1,6,15,3,4,6,-7,8,0 12345678,0 12345678,Status FastTransposeSMatrix(TSMatrix M,TSMatrix/FastTransposeSMatrix,时间复杂度为:,O(nu+tu),若 tu 与munu 同数量级,则为:O(munu),三元组顺序表又称有序的双下标法。,三元组顺序表的优点:非零元在表中
18、按行序有序存储,因此便于进行依行顺序处理的矩阵运算。,三元组顺序表的缺点:不能随机存取。若按行号存取某 一行中的非零元,则需从头开始进行查找。,2、行逻辑联接的顺序表(带行表的三元组),在稀疏矩阵中,若要随机存取任意一行的非零元,需要知道 每一行的第一个非零元在三元组表中的位置,而这必须从第一个 元素起进行搜索查询。,若在稀疏矩阵的存储结构中增加一个行表 rpos 快速转置算法中的 cpot,指示稀疏矩阵中每行的 非零元素在三元组表中的起始位置,则不必从第一个 元素起进行搜索查询。称这种“带行链接信息”的三元 组表为:行逻辑联接的顺序表。,#define MAXSIZE 12500/假设非零元
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言版 数组 广义

链接地址:https://www.31ppt.com/p-6296818.html