数据结构-第七周-稀疏矩阵课件.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《数据结构-第七周-稀疏矩阵课件.pptx》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 第七 稀疏 矩阵 课件
- 资源描述:
-
1、矩阵矩阵是一个具有是一个具有m行行n列列的数据表,共的数据表,共包包含含有有m*n个元素,每个个元素,每个元素处在确定行和列元素处在确定行和列的交点位置上,与的交点位置上,与一对行号和列号一对行号和列号唯一对应唯一对应。矩阵是很多科学与工程计算问题中研究矩阵是很多科学与工程计算问题中研究的数学对象,的数学对象,在用高级语言编程时,一般采在用高级语言编程时,一般采用二维数组来存储矩阵。用二维数组来存储矩阵。矩阵矩阵普通矩阵的完全存储普通矩阵的完全存储u 如果矩阵中的每个元素的值都是不如果矩阵中的每个元素的值都是不能确定的值,那么存储这样的矩阵能确定的值,那么存储这样的矩阵时,每个元素都必须存储,
2、时,每个元素都必须存储,即即需要需要完全完全存储。存储。u 用高级语言描述用高级语言描述时,时,就是使用二就是使用二维维数组的形式数组的形式存储矩阵。存储矩阵。u 有的矩阵中,有的矩阵中,非零元素非零元素非常少非常少-稀疏矩阵稀疏矩阵u 还还有一些有一些矩阵的元素分布有一定的规律矩阵的元素分布有一定的规律-特特殊矩阵(比如对称矩阵、三角矩阵)殊矩阵(比如对称矩阵、三角矩阵)特殊矩阵和稀疏矩阵特殊矩阵和稀疏矩阵3647862842481697460582957对称矩阵对称矩阵3cccc62ccc481cc7460c82957三角矩阵三角矩阵特殊矩阵a00a01000a10a11a12000a21
3、a22a23000a32a33a34000a43a44对角矩阵对角矩阵特殊矩阵15000210000000010600000050900000稀疏矩阵稀疏矩阵稀疏矩阵对于特殊矩阵和稀疏矩阵对于特殊矩阵和稀疏矩阵若若仍采用二维数仍采用二维数组形式存放组形式存放,将造成,将造成存储单元的很大浪费。存储单元的很大浪费。可以利用这些矩阵的特点和规律,只可以利用这些矩阵的特点和规律,只存储部分元素,从而提高存储空间的存储部分元素,从而提高存储空间的利用率。利用率。矩阵的压缩存储矩阵的压缩存储特殊矩阵和稀疏矩阵的压缩存储 在对特殊矩阵和稀疏矩阵进行存储时,为了节省存储空间,可以对这类矩阵进行压缩存储。压缩
4、存储的基本思想是:多个值相同的元素只分配一个存储空间;对零元素不分配存储空间。对称矩阵对称矩阵的压缩存储的压缩存储3647862842481697460582957An阶对称矩阵(阶对称矩阵(方阵方阵)特点特点:aij=aji如何压缩存储?如何压缩存储?只只存储下三角部分的存储下三角部分的元素元素或是或是上三角部分上三角部分的元素的元素,使得每两个对称元素共享一个存,使得每两个对称元素共享一个存储空间。储空间。压缩存储后节省了多少空间?压缩存储后节省了多少空间?对于一个对于一个n阶对称矩阵,如果完全存储需要阶对称矩阵,如果完全存储需要n2个个存储空间;存储空间;如果压缩存储,需要如果压缩存储,
5、需要n(n+1)/2个存储空间。个存储空间。对称矩阵对称矩阵的压缩存储的压缩存储3647862842481697460582957A定义一个一维数组定义一个一维数组san(n+1)/2作为作为n阶阶对称矩阵对称矩阵A的存储结构,那么对称矩阵的存储结构,那么对称矩阵A中任一元素中任一元素aij和和sak之间的之间的对应关系对应关系如何?如何?对称矩阵对称矩阵的压缩存储的压缩存储(a)下三角矩阵下三角矩阵(b)存储说明存储说明(c)计算方法计算方法aij在一维数组中在一维数组中的的下标下标=阴影部分的阴影部分的面面积积=i(i+1)/2+j0 i n-10j n-1 aij每行元素个数每行元素个数
6、12iaij在本行中的序号在本行中的序号aij第第0行行第第1行行第第i-1行行对称矩阵的压缩存储对称矩阵的压缩存储对于下三角中的元素对于下三角中的元素aij(i=j),在一维数组在一维数组sa中中的的下下标标k与与i、j的关系为:的关系为:ki(i1)/2j 上三角中的元素上三角中的元素aij(ij),),因为因为aijaji,则访问和它则访问和它对应的元素对应的元素aji即可,即:即可,即:kj(j1)/2i对称矩阵的压缩存储对称矩阵的压缩存储第第1行行第第n-1行行第第0行行 a00 a10 a11 a20 a21 a22 aij a n-10 an-11 an-1n-1 第第2行行01
7、2345kn(n+1)/2-1例:将压缩存储在一维数组例:将压缩存储在一维数组a a中的中的4x44x4阶阶对称矩阵按矩阵格式输出。对称矩阵按矩阵格式输出。int i,j;for(i=0;i4;i+)for(j=0;j=j)coutai*(i+1)/2+j;/*输出主对角线以及主对角线以下元素*/else coutaj*(j+1)/2+i;/*输出主对角线以上元素*/coutendl;三三角角矩阵矩阵的压缩存储的压缩存储3cccc62ccc481cc7460c82957(a)下三角矩阵下三角矩阵34810c2946cc57ccc08cccc7(b)上三角矩阵上三角矩阵n n阶阶上上(下下)三角
8、矩阵三角矩阵是指是指下下(上上)三角三角(不(不包括主对角线)中的元素均为常数包括主对角线)中的元素均为常数c c三三角角矩阵矩阵的压缩存储的压缩存储3cccc62ccc481cc7460c82957(a)下三角矩阵下三角矩阵34810c2946cc57ccc08cccc7(b)上三角矩阵上三角矩阵如何压缩如何压缩存储三角矩阵?存储三角矩阵?可以只可以只存储上三角(或下三角)部分的存储上三角(或下三角)部分的元元素,对于常量素,对于常量c多开辟一个空间来存储。多开辟一个空间来存储。下三角矩阵中任一元素下三角矩阵中任一元素aij在在一维一维数组数组中的下标中的下标k与与i、j的的对应关系:对应关
9、系:i(i1)/2j 当当ijn(n1)/2当当ijk=下三角矩阵的压缩存储下三角矩阵的压缩存储012345kn(n+1)/2-1n(n+1)/2第第1行行第第0行行 a00 a10 a11 a20 a21 aij an-1n-1 第第2行行 c a22存储存储下三角下三角元素元素对角线上方的常数对角线上方的常数只存一个只存一个数据元素数据元素sasan(n+1)/2n(n+1)/2用于存放常量用于存放常量c c矩阵中任一元素矩阵中任一元素aij在在数组数组中的下标中的下标k与与i、j的对应关系:的对应关系:i(2n-i+1)/2+j-i 当当ijn(n1)/2当当ijk=上三角矩阵的压缩存储
10、上三角矩阵的压缩存储存储存储上三角上三角元素元素对角线上方的常数对角线上方的常数只存一个只存一个数据元素数据元素sasan(n+1)/2n(n+1)/2用于存放常量用于存放常量c c对角矩阵对角矩阵压缩存储压缩存储对角矩阵对角矩阵:n n阶对角矩阵是指阶对角矩阵是指所有所有非零元素都集中在非零元素都集中在以主对角线为中心的带状区域中,除了以主对角线为中心的带状区域中,除了主主对角线和它的上对角线和它的上下方若干条对角线下方若干条对角线的元素的元素外,所有其他元素都为零。外,所有其他元素都为零。n n阶三对角矩阵:阶三对角矩阵:n n阶三对角矩阵的非零元素仅出现在阶三对角矩阵的非零元素仅出现在主
11、对角线主对角线(a(aiiii,0=i=n-1),0=i=n-1)上以及紧邻主对角线上面的上以及紧邻主对角线上面的那条对角线上(那条对角线上(a aii+1ii+1,0=i=n-2),0=i=n-2)和紧邻主对角线下面和紧邻主对角线下面的那条对角线上的那条对角线上(a ai+1ii+1i,0,0=i=n-2=i1时,时,元素元素aijij=0元素元素aij与一与一维数维数组下标组下标k的关系:的关系:k=2+3(i1)+(ji+1)=2i+j(b)一维数组元素一维数组元素sak和矩阵和矩阵元素元素aij的对应关系的对应关系(c)压缩到一维数组中压缩到一维数组中a00 a01 a10 a11 a
12、12 a21 a22 a23 a32 a33 a34 a43 a440123456789101112三三对角矩阵对角矩阵的压缩存储的压缩存储(a)三对角矩阵三对角矩阵000000000000A=a00a01a10a11a12a21a22 a23a32a33 a34a43a44稀疏矩阵稀疏矩阵的压缩存储的压缩存储15000000000110000600000000900000A=若矩阵若矩阵A Amxnmxn中的非零元素个数非常少,且非中的非零元素个数非常少,且非零元素的分布没有任何规律,则称该矩阵为零元素的分布没有任何规律,则称该矩阵为稀疏矩阵。稀疏矩阵。稀疏矩阵稀疏矩阵的压缩存储的压缩存储1
13、5000000110000000600000000900000A=如何如何只存储非零元素?只存储非零元素?稀疏矩阵稀疏矩阵中的非零元素的分布没有规律。中的非零元素的分布没有规律。由于稀疏矩阵中非零元素的分布没有规律,因此由于稀疏矩阵中非零元素的分布没有规律,因此在存储在存储非零元素的值非零元素的值的同时,还必须记下该的同时,还必须记下该非零非零元素元素在矩阵中的在矩阵中的行号行号和和列号列号。稀疏矩阵的压缩存储稀疏矩阵的压缩存储定义三元组:定义三元组:稀疏矩阵稀疏矩阵中的每个非中的每个非零元素对应一个三元组零元素对应一个三元组:(行号,列号,非零元素值行号,列号,非零元素值)三元组三元组三元组
14、表三元组表:将稀疏矩阵将稀疏矩阵的所有非的所有非零元素对应的三元零元素对应的三元组所构成的集合,组所构成的集合,按行优先的顺序按行优先的顺序排列成一排列成一个个三元三元组线性表组线性表。三元组三元组表表:(0,2,1),(1,1,2),(2,0,3),(3,3,5),(4,4,6),(5,5,7),(5,6,4)如何存储三元组表?如何存储三元组表?47000000060000000500000000030000020000010076A若把稀疏矩阵的若把稀疏矩阵的三元组线性表三元组线性表按顺序存储结按顺序存储结构存储构存储,则称为稀疏矩阵的则称为稀疏矩阵的三元组顺序表三元组顺序表。示例示例A5
15、6=003513053100017000600200210000100800rowcolval数组数组bbm 0352011330255033101417415622620527211381049834行号:行号:0到到4列号:列号:0到到5该三元组线性表按该三元组线性表按“行序为主序行序为主序”,用用一维数组进行存放一维数组进行存放按按“列序为主序列序为主序”的三元组线性表的三元组线性表typedefstruct/三元组的类型定义三元组的类型定义introw;/非零元素行非零元素行号号intcol;/非零元素列号非零元素列号ElemTypeval;/非零元素值非零元素值tupletype;#
16、defineMAXSIZE100;typedefstruct/三元组三元组顺序表存储结构定义顺序表存储结构定义tupletypedataMAXSIZE;/非零元素的三元组表非零元素的三元组表intrnum;/矩阵行矩阵行数数intcnum;/矩阵矩阵列数列数intlen;/矩阵矩阵总非总非零元素个数零元素个数table;三元组顺序表存储结构定义 三元组三元组顺序表顺序表采用顺序存储结构存储三元组表采用顺序存储结构存储三元组表0015032205-1511111232364091空空空空空空闲闲闲闲闲闲rowcole0123456MAXSIZE-11500220-1501130000006000
17、000009100000A=5(矩阵的行矩阵的行数)数)6(矩阵的列数矩阵的列数)7(非零元非零元个数个数)(1)从一从一个稀疏矩阵个稀疏矩阵创建创建其对应三元组表其对应三元组表以行序方式以行序方式扫描扫描二二维稀疏矩阵维稀疏矩阵A,将其非零的元素插入到将其非零的元素插入到三元三元组顺序表组顺序表m的的后面。算法如下后面。算法如下:#defineM16#defineN17voidCreatTable(table*m,ElemTypeAM1N1)inti,j;m-rnum=M1;m-cnum=N1;m-len=0;for(i=0;iM1;i+)for(j=0;jdatam-len.row=i;m
18、-datam-len.col=j;m-datam-len.val=Aij;m-len+;(2)取值操作,从三元组表中取出稀疏矩阵指定取值操作,从三元组表中取出稀疏矩阵指定位置的位置的元素元素值值算法算法思路:先思路:先在在三元组三元组m中中找到指定的位置找到指定的位置,然后将然后将该处该处的元素值赋给的元素值赋给x。intgetvalue(table*m,ElemType*x,inti,intj)intk=0;if(i=m-rnum|j=m-cnum)return0;while(klen&im-datak.row)k+;/找第找第i行行while(klen&jm-datak.col)k+;/找
19、找第第j列列if(m-datak.row=i&m-datak.col=j)/元素存在元素存在*x=m-datak.val;return1;elsereturn0;(3)稀疏矩阵稀疏矩阵赋值,将给定值,赋值到三元组表的指定位置赋值,将给定值,赋值到三元组表的指定位置算法算法思路:先思路:先在在三元组表三元组表m中找到指定的中找到指定的位置位置k,若指定若指定位置已经有值,则用给定值替换原有值,否则,将指位置已经有值,则用给定值替换原有值,否则,将指定位置定位置k及其后面的元素及其后面的元素后移一位后移一位,然后将给定的元素然后将给定的元素值值x插入插入到指定位置处。到指定位置处。intputVa
20、lue(table*m,ElemTypex,inti,intj)inti,k=0;if(i=m-rnum|j=m-cnum)return0;while(klen&im-datak.row)k+;/找找第第i行行while(klen&jm-datak.col)k+;/找找第第j列列if(m-datak.row=i&m-datak.col=j)/元素存在元素存在m-datak.val=x;/用给定值用给定值x替换原值替换原值else/*元素不存在时,将其插入元素不存在时,将其插入*/for(i=m-len-1;i=k;i-)/*元素后移元素后移*/m-datai+1=m-datai;m-datak
21、.row=i;m-datak.col=j;m-datak.val=x;m-len+;return1;(4)按矩阵格式输出以三元组顺序表存储的稀疏矩阵按矩阵格式输出以三元组顺序表存储的稀疏矩阵算法思路:对稀疏矩阵中的每个元素,从头到尾算法思路:对稀疏矩阵中的每个元素,从头到尾扫描扫描三元组三元组m,若在三元组表中存在,则输出其元素值,否若在三元组表中存在,则输出其元素值,否则输出则输出0。void DispTable(table*m)int i,j,k,e;for(i=0;irnum;i+)for(j=0;jcnum;j+)e=0;for(k=0;klen;k+)if(i=m-datak.row
展开阅读全文