数据结构第5章 数组和广义表.ppt





《数据结构第5章 数组和广义表.ppt》由会员分享,可在线阅读,更多相关《数据结构第5章 数组和广义表.ppt(66页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第 1 页第 2 页第五章第五章数组和广义表数组和广义表第五章第五章数组和广义表数组和广义表5.1数组的定义、运算数组的定义、运算5.2数组的顺序存储结构数组的顺序存储结构5.2矩阵的压缩存储矩阵的压缩存储5.3广义表广义表第 3 页前4章介绍的数据结构共同特点:(1)都属于线性数据结构;(2)每种数据结构中的数据元素,都作为原子数据,不再进行分解;本章讨论的两种数据结构:数组和广义表,其共同特点是:1)从逻辑结构上看它们,可看成是线性结构的一种扩展;2)数据元素本身也是一个数据结构;第五章第五章数组和广义表数组和广义表第 4 页5 51 1 数组的定义、运算数组的定义、运算一数组的概念 数组
2、是由一组个数固定,类型相同的数据元素组成阵列。以二维数组为例:二维数组中的每个元素都受两个线性关系的约束 即行关系和列关系,在每个关系中,每个元素aij都有且仅有一个直接前趋,都有且仅有一个直接后继。Amn=a00 a01 a0 n-1a10 a11 a1 n-1am-1 0 am-1 1 am-1 n-1在行关系中 aij直接前趋是 aij-1 aij直接后继是 aij+1在列关系中 aij直接前趋是 ai-1j aij直接后继是 ai+1j第 5 页5 51 1 数组的定义、运算数组的定义、运算二维数组也可看作这样的线性表:其每一个数据元素也是一个线性表A=(0,1 ,2,3,4,p)其中
3、每一个数据元素 j 是一个列向量的线性表j=(a0j,a1j ,a2j,a3j,am-1j)或 i 是一个行向量的线性表 i=(ai0 ,ai1 ,ai2,ai3,ain-1)第 6 页5 51 1 数组的定义、运算数组的定义、运算二、数组的基本操作1读元素操作2写元素操作操作方法根据其存储结构决定第 7 页5 52 2 数组的顺序存贮结构数组的顺序存贮结构 一维数组在内存中的存放很简单,只要顺序存放在连续的内存单元即可。二维数组,如何用顺序结构表示?内存地址是一维的,而数组是二维的,要将二维数组挤入一维的地址中,有两个策略:以行为主序(C语言使用)以列为主序a00 a01 a0n-1a10
4、a11 a1n-1am-10 am-11 am-1n-1第 8 页5 52 2 数组的顺序存贮结构数组的顺序存贮结构 设A是一个具有m 行n列的元素的二维数组:Amn=以行为主序的方式:a00 a01 a0n-1 a10 a11 a1n-1 am-11 am-1n-10 1 n-1 n n+1 2n-1 mn-1a00 a01 a0n-1a10 a11 a1n-1am-10 am-11 am-1n-1a00 a10 am-10 a01 a11 am-11 a0n-1 a1n-1 am-1n-10 1 m-1 m m+1 2m-1 nm-1以列为主序的方式:第 9 页5 52 2 数组的顺序存贮
5、结构数组的顺序存贮结构数组元素存储地址的计算数组元素存储地址的计算假设二维数组假设二维数组A每个元素占用每个元素占用s个存储单元,个存储单元,Loc(a aijij)为元素为元素a aijij的存储地址,的存储地址,Loc(a a0000)是是a a0000存储位置存储位置,也是二维数组也是二维数组A的基址的基址。若以行序为主序的方式存储二维数组,则元素若以行序为主序的方式存储二维数组,则元素a aijij的存储位置的存储位置可可由下式确定:由下式确定:Loc(a aijij)=Loc(a a0000)+(n i+j)s若以列序为主序的方式存储二维数组,则元素若以列序为主序的方式存储二维数组,
6、则元素a aijij的存储位置的存储位置可可由下式确定:由下式确定:Loc(a aijij)=Loc(a a0000)+(m j+i)s一般在程序设计过程中,一维数组和二维数组使用较普遍,超一般在程序设计过程中,一维数组和二维数组使用较普遍,超过二维以上的多维数组使用相对较少,对于高维数组的顺序存储方过二维以上的多维数组使用相对较少,对于高维数组的顺序存储方法,可以将二维的情形加以推广便能够得到。法,可以将二维的情形加以推广便能够得到。第 10 页5 53 3 矩阵的压缩存储矩阵的压缩存储5.3矩阵的压缩存储矩阵的压缩存储 一一 特殊矩阵的压缩存储特殊矩阵的压缩存储二二 稀疏矩阵的压缩存储稀疏
7、矩阵的压缩存储 1 1 三元组表的存储结构三元组表的存储结构 2 2 十字链表的存储结构十字链表的存储结构第 11 页5 53 3 矩阵的压缩存储矩阵的压缩存储 矩阵是许多科学与工程计算问题中常常涉及到的一种运算对象。一个m行n列的矩阵是一平面阵列,有mn个元素。可以对矩阵作加、减、乘等运算。只有少数程序设计语言提供了矩阵运算。通常程序员是用二维数组存储矩阵。由于这种存储方法可以随机地访问矩阵的每个元素,因而能较为容易地实现矩阵的各种运算。Amn =a00 a01 a0n-1a10 a11 a1n-1am-10 am-11 am-1n-1第 12 页 应用中常遇到一些阶数很高的矩阵,矩阵中有许
8、多值相同的元素或零元素。二维数组存储矩阵会浪费很多的存储单元。例如,设一个1000 1000的矩阵中有800个非零元素,若用二维数组存储需要106个存储单元。因此,需要使用高效的存储方法,减少数据的存储量,即对原矩阵,根据数据分布特征进行压缩存储。本章将讨论两类矩阵的压缩存储:1 特殊矩阵的压缩存储 2 稀疏矩阵的压缩存储5 53 3 矩阵的压缩存储矩阵的压缩存储Amn =a00 a01 a0n-1a10 a11 a1n-1am-10 am-11 am-1n-1第 13 页5 53 3 矩阵的压缩存储矩阵的压缩存储一 特殊矩阵值相同元素或者零元素分布有一定规律的矩阵称为特殊矩阵 例 对称矩阵、
9、上(下)三角矩阵都是特殊矩阵a00 a10 a20 an-10 a10 a11 a21an-10 an-11 an-1 n-1a00 a01 a0n-10 a11 a1n-10 0 0 an-1 n-1第 14 页5 53 3 矩阵的压缩存储矩阵的压缩存储 特殊矩阵压缩存储 (以对称矩阵为例)对称矩阵是满足下面条件的n 阶矩阵:aij=aji 0 i,j n-1 a00 a01 a0n-1a10 a11 a1n-1an-10 an-11 an-1n-1对称矩阵元素可以只存储下三角部分,共需 n(n+1)/2 个单元的空间(三角矩阵的存储方式类似)a00 a10 a11 a20 a21 a22
10、an-10 an-11 an-1n-1a00 a10 a11 a20 a21 a22 an-10 an-11 an-1n-1k=0 1 2 3 4 5 n(n+1)/2-1 第 15 页5 53 3 矩阵的压缩存储矩阵的压缩存储k=i(i+1)/2 +j 当 i jj(j+1)/2 +i 当 i j 以一维数组sa 作为n 阶对称矩阵A的存储结构,A中任意一元素 aij与它的存储位置 sak 之间存在着如下对应关系:a00 a10 a11 a20 a21 a22 an-10 an-11 an-1n-1k=0 1 2 3 4 5 n(n+1)/2-1 例如,a a53 53 在 sa 中的存储位
11、置是:k=5*(5+1)/2+3=18 sa18=a a5353第 16 页5 53 3 矩阵的压缩存储矩阵的压缩存储 压缩存储的对称矩阵的取值算法压缩存储的对称矩阵的取值算法intget_M(inti,intj)if(i=j)return(sai*(i+1)/2+j)elsereturn(saj*(j+1)/2+i);压缩存储的对称矩阵的压缩存储的对称矩阵的赋值算法赋值算法voidassign_M(inti,intj,intvalue)if(i=j)sai*(i+1)/2+j=value;elsesaj*(j+1)/2+i=value;第 17 页5 53 3 矩阵的压缩存储矩阵的压缩存储
12、带状矩阵带状矩阵 所有非0元素都集中在以主对角线为中心的带状区域,半带宽为d时,非0元素有(2d+1)*n-(1+d)*d个a a00 00 a a01 01 a a 02 02 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 a a10 10 a a11 11 a a12 12 a a13 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0a a20 20 a a21 21 a a22 22 a a23 23 a a24 24 0 0 00 0 0 0 0 0 0 0 0 0 00 0 a a31 31 a a32 32 a a33 33 a a34
13、 34 a a35 35 0 00 0 0 0 0 0 0 0 0 00 0 0 0 a a42 42 a a43 43 a a44 44 a a45 45 a a46 46 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 a a53 53 a a54 54 a a55 55 a a56 56 a a57 57 0 00 0 0 0 0 0 0 0 0 0 0 00 0 a a64 64 a a65 65 a a66 66 a a67 67 a a68 68 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 a a75 75 a a76 76 a a77 77 a a
14、78 78 a a79 79 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 a a86 86 a a87 87 a a88 88 a a89 89 a a810810 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 a a9797 a a98 98 a a99 99 a a910 910 a a9119110 00 0 0 0 0 0 0 0 0 0 0 0 0 0 a a108 108 a a109 109 a a1010 1010 a a1011 1011 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 a a119 119 a a111
15、0 1110 a a11111111d第 18 页5 53 3 矩阵的压缩存储矩阵的压缩存储0 a a0000 a a0101 a a1010 a a11 11 a a12 12 a a21 21 a a22 22 a a23 23 a a32 32 a a33 33 a a34 34 a a43 43 a a44 44 0 0K=0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 a 00 a01 0 0 0 a10 a11 a12 0 0 0 a21 a22 a23 00 0 a32 a33 a340 0 0 a43 a44 为计算方便,认为每一行都有2d+1个非0元素,
16、若少则用0补足,所以,存放矩阵的数组sa 有 n(2d+1)个元素 数组元素sak与矩阵元素aij 之间有关系 k=i*(2d+1)+d+(j-i)a00前为何放一个0?你会放d=2,n=6的带状矩阵吗?第 19 页5 53 3 矩阵的压缩存储矩阵的压缩存储 压缩存储的带状矩阵的取值算法压缩存储的带状矩阵的取值算法intget_Md(inti,intj)if(abs(i-j)=d)return(sai*(2*d+1)+d+(j-i);elsereturn(0);压缩存储的压缩存储的带状矩阵的带状矩阵的赋值算法赋值算法voidassign_Md(inti,intj,intvalue)if(abs
17、(i-j)=d)sai*(i+1)/2+j=value;第 20 页5 53 3 矩阵的压缩存储矩阵的压缩存储二稀疏矩阵 1 什么是稀疏矩阵 有较多值相同元素或较多零元素,且值相同元素或者零元素分布没有一定规律的矩阵称为稀疏矩阵。例A =0 12 9 0 0 0 0 0 0 0 0 0 0 0-3 0 0 0 0 14 0 0 0 24 0 0 0 0 0 18 0 0 0 0 015 0 0-7 0 0 0A有42(67)个元素有8个非零元素如何进行稀疏矩阵的压缩存储?第 21 页5 53 3 矩阵的压缩存储矩阵的压缩存储2 稀疏矩阵的压缩存储(只讨论有较多零元素矩阵的压缩存储)1)三元组表
18、(i,j,aij)A=(0,1,12),(0,2,9),(2,0,-3),(2,5,14),(3,2,24),(4,1,18),(5,0,15),(5,3,-7)加上行、列数6,7 A =0 12 9 0 0 0 0 0 0 0 0 0 0 0-3 0 0 0 0 14 0 0 0 24 0 0 0 0 0 18 0 0 0 0 015 0 0-7 0 0 0表示非零元的三元组第 22 页5 53 3 矩阵的压缩存储矩阵的压缩存储2)三元组顺序表 假设以顺序存储结构来表示三元组表,则可得稀疏矩阵的一种压缩存储方式我们称之为三元组顺序表。稀疏矩阵的三元组顺序表的类型定义structnodeint
19、row,col;/非零元的行下标和列下标 intvalue;/非零元值;typedefstructnodeNODE;NODEmaMAX;ma0用于存储矩阵行数、列数、非零元个数用于存储非零元三元组的结构第 23 页5 53 3 矩阵的压缩存储矩阵的压缩存储 A的三元组顺序表图示 A=0 12 9 0 0 0 0 0 0 0 0 0 0 0-3 0 0 0 0 14 0 0 0 24 0 0 0 0 0 18 0 0 0 0 015 0 0-7 0 0 0row col value0123456782 0 -32 0 -35 0 155 0 150 1 120 1 124 1 184 1 180
20、 2 90 2 93 2 243 2 245 3 -75 3 -72 5 142 5 146 7 86 7 8例如 ma1.row=0,ma1.col=1,ma1.value=12第 24 页5 53 3 矩阵的压缩存储矩阵的压缩存储 3)转置运算算法 转置运算是一种最常用的矩阵运算。对于一个 m 行 n 列的矩阵 A,它的转置矩阵 B是一个n行m列的矩阵。例如,下图中的矩阵A和B互为转置矩阵。A=0 12 9 0 0 0 0 0 0 0 0 0 0 0-3 0 0 0 0 14 0 0 0 24 0 0 0 0 0 18 0 0 0 0 015 0 0-7 0 0 0 B=0 0-3 0 0
21、 1512 0 0 0 18 0 9 0 0 24 0 0 0 0 0 0 0-7 0 0 0 0 0 0 0 0 14 0 0 0 0 0 0 0 0 0 第 25 页5 53 3 矩阵的压缩存储矩阵的压缩存储 A第第0 0 列列第一列第一列 第二列第二列第三列第三列 第四列第四列第五列第五列 第六列第六列.B B第第0 0 行行第一行第一行 第二行第二行第三行第三行 第四行第四行第五行第五行 第六行第六行.转置运算算法第 26 页5 53 3 矩阵的压缩存储矩阵的压缩存储矩阵 B矩阵 Arow col value0123456782 0 -32 0 -35 0 155 0 150 1 12
22、0 1 124 1 184 1 180 2 90 2 93 2 243 2 245 3 -75 3 -72 5 142 5 146 7 86 7 8row colv alue 0123456781 0 121 0 123 5 -73 5 -70 2 -30 2 -32 3 242 3 240 5 150 5 152 0 92 0 95 2 145 2 141 4 181 4 187 6 87 6 8分析:分析:(1 1)将矩阵的行列数的)将矩阵的行列数的值交换值交换(2 2)将每一个三元组的将每一个三元组的i i 和和 j j相互调换相互调换(3 3)重排三元组之间的)重排三元组之间的次序次序
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构第5章 数组和广义表 数据结构 数组 广义

限制150内