数据结构与算法教学课件ppt作者王曙燕chapter5多维数组和广义表PPT文档格式.ppt
《数据结构与算法教学课件ppt作者王曙燕chapter5多维数组和广义表PPT文档格式.ppt》由会员分享,可在线阅读,更多相关《数据结构与算法教学课件ppt作者王曙燕chapter5多维数组和广义表PPT文档格式.ppt(44页珍藏版)》请在冰豆网上搜索。
其本质是地址计算问题。
有两种顺序映象的方式:
以行序为主序;
以列序为主序。
5.2多维数组,7,以行序为主序,例如:
a1,2,a1,1,a1,3,a2,1,a2,2,a2,3,a1,2,a1,1,a1,3,a2,1,a2,2,a2,3,L,二维数组Amxn中任一元素ai,j的存储位置LOC(i,j)=LOC(1,1)+(n(i-1)(j-1),称为基地址或基址。
L,5.2多维数组,8,以列序为主序,例如:
L,二维数组Amxn中任一元素ai,j的存储位置LOC(i,j)=LOC(1,1)+(m(j-1)(i-1),称为基地址或基址。
L,a1,2,a1,1,a1,3,a2,1,a2,2,a2,3,a2,1,a1,1,a1,2,a2,2,a1,3,a2,3,5.2多维数组,9,三维数组Armn中任一元素ai,j,k的存储位置,LOC(i,j,k)=LOC(1,1,1)+(i-1)mn(j-1)n+(k-1)L,j1,j2,j3代替数组下标i,j,k,并且j1,j2,j3的下限分别为c1,c2,c3,上限为d1,d2,d3,每个元素占size个存储单元。
则aj1,j2,j3的存储位置,LOC(j1,j2,j3)=LOC(c1,c2,c3)+(j1-c1)(d2-c2+1)(d3-c3+1)(j2-c2)(d3-c3+1)+(j3-c3)size,数据结构与算法,5.2多维数组,10,推广到一般情况,可得到n维数组数据元素存储位置的映象关系:
5.2多维数组,11,例如:
设有二维数组A1020,其每个元素占2个字节,第一个元素A1,1的存储地址为100,则按行优先顺序存储时元素A5,6的存储地址为?
若按列优先顺序存储时元素A5,6的存储地址为?
A5,6=100+(5-1)*20+(6-1)*2=270,按行优先,按列优先,A5,6=100+(6-1)*10+(5-1)*2=208,5.2多维数组,12,5.3矩阵的压缩存储,特殊矩阵,三角矩阵,带状矩阵,稀疏矩阵,三元组顺序表,十字链表,13,第5章数组和广义表,特殊矩阵:
三角矩阵,下三角矩阵,LOC(i,j)=LOC(1,1)+前i-1行非零元素个数第i行中aij前非零元素的个数,=LOC(1,1)+i(i-1)/2+j-1,数据结构与算法,5.3矩阵的压缩存储,14,特殊矩阵:
三角矩阵,上三角矩阵,LOC(i,j)=LOC(1,1)+前i-1行非零元素个数第i行中aij前非零元素的个数,=LOC(1,1)+(i-1)(2n-i+2)/2+j-i,5.3矩阵的压缩存储,15,第5章数组和广义表,特殊矩阵:
带状矩阵,LOC(i,j)=LOC(1,1)+3(i-1)-1+j-i+1,=LOC(1,1)+2(i-1)+j-1,数据结构与算法,5.3矩阵的压缩存储,16,稀殊矩阵:
稀疏因子:
设在m*n的矩阵中,有t个非零元素,令,称为矩阵的稀疏因子。
通常认为=0.3时为稀疏矩阵。
数据结构与算法,5.3矩阵的压缩存储,17,稀殊矩阵:
三元组顺序表,三元组也是采取按行进行存储!
1,1,3,3,2,-4,3,5,5,4,1,2,5,4,6,6,1,1,6,5,7,数据结构与算法,5.3矩阵的压缩存储,18,稀殊矩阵:
三元组顺序表,数据类型定义,#defineMAXSIZE1000typedefstructintrow,col;
ElementTypee;
Triple;
typedefstructTripledataMAXSIZE+1;
intm,n,len;
TSMatrix;
5.3矩阵的压缩存储,19,5.3特殊矩阵的压缩存储,第5章数组和广义表,稀殊矩阵:
三元组顺序表,的转置运算,for(row=1;
row=m;
+row)for(col=1;
col=n;
+col)destcolrow=sourcerowcol;
其时间复杂度为:
O(mn),用常规的二维数组表示时的算法,数据结构与算法,20,稀殊矩阵:
三元组顺序表,的转置运算,不是按行序有序存储!
重新排序,5.3矩阵的压缩存储,21,稀殊矩阵:
三元组顺序表,的转置运算,重排三元组之间的次序有两种方法:
按照A的列序进行转置;
按照A的行序转置,但转置后的元素按B的行序直接填到向量B.data中恰当的位置。
5.3矩阵的压缩存储,22,5.3特殊矩阵的压缩存储,第5章数组和广义表,稀殊矩阵:
三元组顺序表,的转置运算,“列序”递增转置法,算法实现,voidTransposeTSMatrix(TSMatrixA,TSMatrix*B)inti,j,k;
B-m=A.n;
B-n=A.m;
B-len=A.len;
if(B-len0)j=1;
for(k=1;
kdataj.row=A.datai.col;
B-dataj.col=A.datai.row;
B-dataj.e=A.datai.e;
j+;
if(jA.len)break;
23,voidTransposeTSMatrix(TSMatrixA,TSMatrix*B)inti,j,min;
i=1;
while(idatai.row=A.datamin.col;
B-datai.col=A.datamin.row;
B-datai.e=A.datamin.e;
i+;
A.datamin.col=A.n+1;
24,稀殊矩阵:
三元组顺序表,的转置运算,M第j列在转置后,形成转置矩阵T的第j行。
设M的第j列有k个非零元素,如图所示,一次定位快速转置,5.3矩阵的压缩存储,25,稀殊矩阵:
三元组顺序表,的转置运算,2114,22-7,1336,4328,51-5,5.3矩阵的压缩存储,26,稀殊矩阵:
三元组顺序表,的转置运算,一次定位快速转置,算法步骤:
a.扫描矩阵A的三元组表,统计出A的每一列的非零元素的个数,存放到数组numcol中(numcol存放M第col列的非零元素个数)。
b.计算转置矩阵B的每一行在三元组表中的开始位置,并存放到数组positioncol中,(positioncol存放T第col行开始位置)。
c.再次扫描矩阵A的三元组表,根据非零元素的列号col,确定它转置后的行号,查position表,按查到的位置直接将该项存入转置三元组表B中,并修改positioncol,将其指向该行下一个元素的存储位置(positioncol+)。
5.3矩阵的压缩存储,27,稀殊矩阵:
三元组顺序表,的转置运算,一次定位快速转置,算法实现:
a.for(col=1;
col=A.n;
col+)numcol=0;
for(t=1;
t=A.len;
t+)numA.datat.col+;
0,0,0,0,0,1,1,2,1,1,5.3矩阵的压缩存储,28,稀殊矩阵:
b.position1=1;
for(col=2;
col+)positioncol=positioncol-1+numcol-1;
positioncol,1,2,4,4,5,5.3矩阵的压缩存储,29,稀殊矩阵:
for(p=1;
pdataq.row=A.datap.col;
B-dataq.col=A.datap.row;
B-dataq.e=A.datap.e;
positioncol+;
2,1,14,3,5,1,-5,2,2,-7,4,1,3,36,2,4,3,28,6,5,完整P100,5.3矩阵的压缩存储,30,稀殊矩阵:
该算法的总的循环次数为:
A.n+A.len+A.n-1+A.len,=2(A.n+A.len)-1,时间复杂度为:
O(A.n+A.len),即使非零元个数A.len与A.m*A.n同数量级,其时间复杂度为O(A.m*A.n),与经典算法时间复杂度相同。
5.3矩阵的压缩存储,31,稀殊矩阵:
十字链表,的存储表示,一个结点除了数据域(i,j,elem)之外,还应该用两个方向的指针(right,down),分别指向行和列。
right:
用于链接同一行中的下一个元素;
down:
用于链接同一列中的下一个元素。
整个矩阵构成了一个十字交叉的链表,因此称十字链表。
每一行和每一列的头指针,用两个一维指针数组来存放。
5.3矩阵的压缩存储,32,稀殊矩阵:
十字链表,的类型定义,typedefstructOLNodeintrow,col;
intvalue;
structOLNode*right,*down;
OLNode,*OLink;
typedefstructOLink*row_head,*col_head;
CrossList;
5.3矩阵的压缩存储,33,稀殊矩阵:
十字链表,的举例,5.3矩阵的压缩存储,34,5.4广义表,概念:
是n=0个元素的有限序列,记作LS=(d1,d2,dn)其中:
di或为原子项(原子,一般用小写字母表示)或为广义表(子表,一般用大写字母表示),n为广义表的长度。
原子:
是作为结构上不可分割的成分,它可以是一个数或一个结构。
表头与表尾:
LS不为空时,称d1为表头(head),称其余元素组成的子表(d2,d3,,dn)为表尾(tail)。
35,5.4广义表,举例:
1)A=(),2)F=(d,(e),n=,3)D=(a,(b,c),F),4)C=(A,D,F),5)B=(a,B)=(a,(a,(a,),n=2,n=,n=,head(F)=,head(D)=,tail(D)=,head(C)=,head(B)=,tail(F)=,0,d,(e),2,(a,(bc),(F),3,A,tail(C)=,(D,F),a,tail(B)=,(B),任何一个非空广义表其表头可能是原子或广义表,而其表尾必定为广义表。
36,5.4广义表,结构特点:
1)广义表中的数据元素有相对次序;
2)广义表的长度定义为最外层包含元素个数;
3)广义表的深度定义为所含括弧的重数;
4)广义表可以共享;
5)广义表可以是一个递归的表。
递归表的深度是无