第4章数组和广义表ppt课件.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《第4章数组和广义表ppt课件.ppt》由会员分享,可在线阅读,更多相关《第4章数组和广义表ppt课件.ppt(55页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第四章第四章 数组和广义表数组和广义表数组的逻辑结构数组的逻辑结构一个二维数组的类型定义如下:一个二维数组的类型定义如下: 其中其中c,dc,d设为设为1 1,数组可表示为:,数组可表示为:A:arrayc.md.n of ElemTypeA=a11 a12 a1na21 a22 a2n am1 am2 amn 它可以看成是由它可以看成是由m m个行向量或个行向量或n n个列向量组成的线性表。即,二个列向量组成的线性表。即,二维数组可以看成是一种推广的线维数组可以看成是一种推广的线性表,这种线性表的每一个数据性表,这种线性表的每一个数据元素本身也是一个线性表。元素本身也是一个线性表。类似地,类
2、似地, 一个三维数组可以看成是数据元素为二维数组的线性表一个三维数组可以看成是数据元素为二维数组的线性表一个一个n维数组可视为其数据元素为维数组可视为其数据元素为n-1维数组的线性表。维数组的线性表。数组的顺序存储分配数组的顺序存储分配a1a2a3an-1anLoc(ai) = Loc(a1) + (i-1) kA1:n = ( a1, a2, a3, , an ) 若已知每个元素占若已知每个元素占k 个存储单元,并且知道第个存储单元,并且知道第一个元素的存储地址一个元素的存储地址Loc(a1), 则则一一. .一维数组一维数组A1:nA1:n a11 a12 a13 a1n a21 a22
3、a23 a2nA1:m 1:n = am1 am2 am3 amn 行序为主序分配方式行序为主序分配方式 列序为主序分配方式列序为主序分配方式二二. .二维数组二维数组A1:mA1:m1:n1:n a11 . . .a1na21. . .a2na31. . .aij. . .amn第第1行行第第2行行 a11 a12 a13 a1n a21 a22 a23 a2nA1:m 1:n = am1 am2 am3 amn 1. 行序为主序分配方式行序为主序分配方式 a11 a12 a13 a1n a21 a22 a23 a2n a31 a32 a33 a3nA1:m 1:n = aij am1 am
4、2 am3 amni-1 行行 若已知每个元素占若已知每个元素占k个存储单元,并且知道第一个存储单元,并且知道第一个元素的存储地址个元素的存储地址 LOC(a11), 则则 Loc(aij) = Loc(a11) + (i 1) n k + (j 1) k = Loc(a11) + (i 1) n+(j 1) ka11 . . .am1a12. . .am2a13. . .aij. . .amn第第1列列第第2列列 a11 a12 a13 a1n a21 a22 a23 a2nA1:m1:n= am1 am2 am3 amn 2. 列序为主序分配方式列序为主序分配方式 a11 a12 a13
5、a1n a21 a22 a23 a2n a31 a32 a33 a3nA1:m 1:n = aij am1 am2 am3 amnj-1 列列 若已知每个元素占若已知每个元素占k个存储单元,并且知道第一个存储单元,并且知道第一个元素的存储地址个元素的存储地址 LOC(a11), 则则 Loc(aij) = Loc(a11) + (j 1) m k + (i 1) k = Loc(a11) + (j 1) m+(i 1) k9 数组数组A0A0505066的每个元素占的每个元素占5 5个字节,将个字节,将其按列优先次序存储在起始地址为其按列优先次序存储在起始地址为10001000的内存的内存单元
6、中,则单元中,则A55A55的地址是(的地址是( )。)。 课堂练习课堂练习A 已知二维数组已知二维数组AmnAmn采用行序为主的方式存储,采用行序为主的方式存储,每个元素占每个元素占k k个存储单元,并且第一个元素的存个存储单元,并且第一个元素的存储地址是储地址是LOC(A00),LOC(A00),则则AijAij的地址的地址是是 。LOC(A00)+(i*n+j)*k a11 a12 a13 a1n a21 a22 a23 a2n m = am1 am2 am3 amn A 1:m 1:n 所谓所谓压缩存储压缩存储是指为多个值相同的元素是指为多个值相同的元素, 或者或者位置分布有规律的那些
7、元素分配尽可能少的存储空位置分布有规律的那些元素分配尽可能少的存储空间,而对间,而对0元素一般情况下不分配存储空间。元素一般情况下不分配存储空间。传统做法传统做法矩阵的压缩存储矩阵的压缩存储 a11 a12 a13 a1n a21 a22 a23 a2n a31 a32 a33 a3nA1:n 1:n = an1 an2 an3 ann传统做法:传统做法: 定义一个二维数组定义一个二维数组 A 1:n, 1:n 一一. . 对称矩阵的压缩存储对称矩阵的压缩存储 一个一个n 阶矩阵阶矩阵A的元素满足性质的元素满足性质 aij = aji 1i, jn则称则称矩阵矩阵A为为n 阶对称矩阵。阶对称矩
8、阵。a11a21a22. .aij. .ann 1 2 3 1 2 3 . . n n* *(n+1)/2 (n+1)/2 a11 a12 a13 a1n a21 a22 a23 a2n a31 a32 a33 a3nA1:n 1:n = an1 an2 an3 annV只存储下三角元素时寻址公式为: loc(Aij)=loc (A11)+i(i-1)/2 +j-1*k传统做法:定义一个二维数组传统做法:定义一个二维数组 B 1:n 1:n 0元素元素0元素元素二二. . 对角矩阵的压缩存储对角矩阵的压缩存储 若一个矩阵中,值非若一个矩阵中,值非0的元素对称地集中在主对的元素对称地集中在主对角
9、线两旁的一个带状区域中角线两旁的一个带状区域中(该区域之外的元素都为该区域之外的元素都为0元素元素),称这样的矩阵为对角矩阵。,称这样的矩阵为对角矩阵。例例. . 三对角矩阵的压缩存储三对角矩阵的压缩存储 b11 b12 b21 b22 b23 b32 b33 b34 bn-1n bnn-1 bnn0元素元素0元素元素非零元素的个数为非零元素的个数为3 3(n-2n-2)+4+4B1:n 1:n =b11b12b21 bij . . b22. . 1 2 3 4 . . 3n-2 bnn b11 b12 b21 b22 b23 b32 b33 b34 bn-1n bnn-1 bn n0元素元素
10、0元素元素B1:n 1:n =对角线数组中某元素寻址公式为: loc(Aij)=loc (A11)+ 2(i-1)+j-1*k传统做法:定义一个二维数组传统做法:定义一个二维数组 A 1:6 1:6 一一. 什么是稀疏矩阵什么是稀疏矩阵? 一个较大的矩阵中,零元素的个数相对于整一个较大的矩阵中,零元素的个数相对于整 个矩阵元素的总个数所占比例较大时,可以称该个矩阵元素的总个数所占比例较大时,可以称该 矩阵为一个稀疏矩阵。矩阵为一个稀疏矩阵。 M = 15 0 0 22 0 -15 0 11 3 0 0 0 0 0 0 -6 0 0 0 0 0 0 0 0 91 0 0 0 0 0 0 0 28
11、 0 0 0稀疏矩阵稀疏矩阵三元组三元组: ( i, j, value )例如例如 : (1,1,15)表示第)表示第1行、第行、第1列、值为列、值为15的元素。的元素。(1,4,22)表示第)表示第1行、第行、第4 4列、值为列、值为22的元素。的元素。(1,6,-15)表示第)表示第1行、第行、第6列、值为列、值为-15的元素。的元素。 15 0 0 22 0 -15 0 11 3 0 0 0 0 0 0 -6 0 0 0 0 0 0 0 0 91 0 0 0 0 0 0 0 28 0 0 0二二. 稀疏矩阵的三元组表示稀疏矩阵的三元组表示( m, n, t ) 其中,其中,m, n, t
12、 分别表示稀疏矩阵的总的行数、分别表示稀疏矩阵的总的行数、总的列数与非零元素的总个数。总的列数与非零元素的总个数。 若一个若一个m n阶稀疏矩阵具有阶稀疏矩阵具有t个非零元素,则个非零元素,则用用t+1个三元组来存储个三元组来存储, ,其中第一个三元组分别用来其中第一个三元组分别用来给出稀疏矩阵的总行数给出稀疏矩阵的总行数m、总列数、总列数n 以及非零元素以及非零元素的总个数的总个数t ;第二个三元组到第;第二个三元组到第 t+1 个三元组按行个三元组按行序为主序的方式依次存储序为主序的方式依次存储t 个非零元素。个非零元素。 M= 15 0 0 22 0 -15 0 11 3 0 0 0 0
13、 0 0 -6 0 0 0 0 0 0 0 0 91 0 0 0 0 0 0 0 28 0 0 0 M 1:61:6 6681115142216-15221134-623351916328 A=A 1:9 1:3 三元组三元组: ( i j value )15 0 0 22 0 -1515 0 0 22 0 -15 0 11 3 0 0 0 0 11 3 0 0 0 0 0 0 -6 0 0 0 0 0 -6 0 0 0 0 0 0 0 0 0 0 0 0 0 091 0 0 0 0 091 0 0 0 0 0 0 0 28 0 0 00 0 28 0 0 0M= 15 0 0 0 91 01
14、5 0 0 0 91 0 0 11 0 0 0 0 0 11 0 0 0 0 0 3 0 0 0 28 0 3 0 0 0 28 22 0 -6 0 0 0 22 0 -6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0-15 0 0 0 0 0-15 0 0 0 0 0N=表示稀疏矩阵表示稀疏矩阵M的三列的二维数组的三列的二维数组 1 2 31 2 3A0 6 6 8A0 6 6 8A1 1 1 15A1 1 1 15A2 1 4 22A2 1 4 22A3 1 6 -15A3 1 6 -15A4 2 2 11A4 2 2 11A5 2 3 3A5 2 3 3A6 3 4 -6A
15、6 3 4 -6A7 5 1 91A7 5 1 91A8 6 3 28A8 6 3 28 1 2 31 2 3B0 6 6 8B0 6 6 8B1 1 1 15B1 1 1 15B2 1 5 91B2 1 5 91B3 2 2 11B3 2 2 11B4 3 2 3B4 3 2 3B5 3 6 28B5 3 6 28B6 4 1 22B6 4 1 22B7 4 3 -6B7 4 3 -6B8 6 1 -15B8 6 1 -15表示稀疏矩阵表示稀疏矩阵N的三列的二维数组的三列的二维数组A=B=三三. 矩阵的转置矩阵的转置1)1)转置过程按照转置过程按照B B数组中元素的最终排列顺序进行数组中元素
16、的最终排列顺序进行 由于矩阵由于矩阵M的列经过转置后变为的列经过转置后变为N的行的行,所以可以按照所以可以按照M的列序来转置。为了按顺序的列序来转置。为了按顺序找到找到M中的每一列的所有非中的每一列的所有非0元素元素,对数组对数组A从从第一行起将每行的第二列扫描第一行起将每行的第二列扫描n遍遍,每遍扫描每遍扫描分别找到矩阵分别找到矩阵N的从第一行到第的从第一行到第n行的各行所行的各行所有非有非0元素元素,并产生并产生B数组相应的行。数组相应的行。算法算法 void transmat(A,B); (m,n,t)=(A0,1,A0,2,A0,3); (B0,1, B0,2,B0,3)=(n,m,t
17、); if(t!=0) q=1; for(col=1;col=n;col+) for(p=1;p=t;p+) if(Ap2=col) Bq1=Ap2; Bq2=Ap1; Bq3=Ap3; q+; 1 2 31 2 3A0 6 6 8A0 6 6 8A1 1 1 15A1 1 1 15A2 1 4 22A2 1 4 22A3 1 6 -15A3 1 6 -15A4 2 2 11A4 2 2 11A5 2 3 3A5 2 3 3A6 3 4 -6A6 3 4 -6A7 5 1 91A7 5 1 91A8 6 3 28A8 6 3 282)B2)B数组中元素的生成不是顺序的而是跳跃式的数组中元素的生
18、成不是顺序的而是跳跃式的 即转换按数组即转换按数组A A中行的顺序进行,但转换后的元素在中行的顺序进行,但转换后的元素在B B中中不是连续存放,而是将它放入它在不是连续存放,而是将它放入它在B B中最终应占据的位置。中最终应占据的位置。设:设:Num1.n:存放矩阵存放矩阵m中各列非中各列非0元素的个数元素的个数; Pot1.n:存放矩阵存放矩阵m中各列第一个非中各列第一个非0元素在数组元素在数组B中应占中应占 的位置。的位置。pot1=1pot1=1potj=potj-1+numj-1 (2jn)potj=potj-1+numj-1 (2jn)15 0 0 22 0 -1515 0 0 22
19、 0 -15 0 11 3 0 0 0 0 11 3 0 0 0 0 0 0 -6 0 0 0 0 0 -6 0 0 0 0 0 0 0 0 0 0 0 0 0 091 0 0 0 0 091 0 0 0 0 0 0 0 28 0 0 0 0 0 28 0 0 0M= j 1 2 3 4 5 6 Numj 2 1 2 2 0 1 Potj 1 3 4 6 8 8void fasttranspo(A,B) (m,n,t)=(A01,A02,A03); (B01,B02,B03)=(n,m,t); if (t!=0) for (j=1;j=n;j+) numj=0; for (i=1;i=t;i+
20、) numAi,2=numAi,2+1; pot1=1; for (j=2;j=n;j+) potj=potj-1+numj-1; for (i=1;i=t;i+) k=Ai2; Bpotk1=Ai2; Bpotk2=Ai1; Bpotk3=Ai3; potk= potk+1; 1 2 3 1 2 3A0 6 6 8A0 6 6 8A1 1 1 15A1 1 1 15A2 1 4 22A2 1 4 22A3 1 6 -15A3 1 6 -15A4 2 2 11A4 2 2 11A5 2 3 3A5 2 3 3A6 3 4 -6A6 3 4 -6A7 5 1 91A7 5 1 91A8 6 3
21、28A8 6 3 28四四. 矩阵的相乘矩阵的相乘3 0 0 50 -1 0 02 0 0 0S=0 21 0-2 00 43 4 41 1 31 4 52 2 -13 1 2A=B=4 2 41 2 22 1 13 1 -24 2 4 由于两个稀疏矩阵的积并不一定仍是稀疏矩阵,故结果由于两个稀疏矩阵的积并不一定仍是稀疏矩阵,故结果矩阵矩阵c=sc=s* *r r仍需采用通常的矩形结构的二维数组存储方式。仍需采用通常的矩形结构的二维数组存储方式。m*nR=R=n*pB=Procedure matrix-multiplication(A,B,C);Begin (m,n,t1):=(A0,1,A0
22、,2,A0,3); if n=B0,1 then (p,t2):=(B0,2,B0,3) else Write(Incompatible matrix);exit; if t1*t2=0 then exit; 乘积为乘积为0矩阵矩阵 for i:=1 to m do for j:=1 to p do Ci,j:=0; for i:=1 to n do numi:=0; for i:=1 to t2 do numBi,1:=numBi,1+1; pot1:=1; for i:=2 to n+1 do poti:=poti-1+numi-1; for i:=1 to t1 do k:=ai,2;
23、for j:=potk to potk+1-1 do CAi,1,Bj,2:=CAi,1,Bj,2+Ai,3*Bj,3;End; 在经典算法中,不管元素是否为在经典算法中,不管元素是否为0都需要相乘,但实际上都需要相乘,但实际上只有只有Si,k和和Rk,j均不为均不为0时,乘积才不为时,乘积才不为0。因此,需在。因此,需在A、B中找出相应的各对元素中找出相应的各对元素(即数组即数组A中第二列的值与数组中第二列的值与数组B中第中第一列的值相等的元素一列的值相等的元素)相乘即可。相乘即可。 为了得到非为了得到非0的乘积,对的乘积,对A中每一行的元素中每一行的元素(i,k,Sik),需要,需要在在B
24、中找到所有相应的元素中找到所有相应的元素(k,j,Rkj),为了便于在为了便于在B中寻找中寻找R中第中第k行的第一个非行的第一个非0元素,和前面类似,需设置两个数组元素,和前面类似,需设置两个数组Num1:n和和Pot1:n,其中,其中numk表示表示R中第中第k行非行非0元素的个数;元素的个数;potk表示表示R中第中第k行第一个非行第一个非0元素在元素在B中的位置。中的位置。pot1=1pot1=1potj=potj-1+numj-1 (2jn)potj=potj-1+numj-1 (2jn)下面我们就给出矩阵乘法的算法矩阵乘法的算法:void matrx-multiplication(A
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数组 广义 ppt 课件
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内