




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
返回主目录
本章说明5.1数组的定义5.2数组的顺序表示和实现5.3矩阵的压缩存储5.4广义表的定义5.5广义表的存贮结构
本章小结学习目标理解数组类型的特点及其在高级编程语言中的存储表示和实现方法,并掌握数组在“以行为主”、“以列为主”的存储表示中的地址计算方法。掌握特殊矩阵的存储压缩表示方法。理解稀疏矩阵的两类存储压缩方法的特点及其适用范围,领会以三元组表示稀疏矩阵时进行矩阵运算所采用的处理方法。本章说明重点和难点重点是学习数组类型的定义及其存储表示。知识点数组的类型定义、数组的存储表示、特殊矩阵的压缩存储表示方法、随机稀疏矩阵的压缩存储表示方法。本章说明5.1数组的定义数组是线性表的推广数组可以看成是一种特殊的线性表,即线性表中数据元素本身也是一个线性表。列向量行向量数组的抽象数据类型定义ADT
Array{数据对象:ji=0,...,bi-1,i=1,2,..,n
D={aj1,j2,...jn|n(>0)为数组的维数,bi为数组第i维的长度,
ji为数组元素的第i维下标,aj1,j2,...jn∈ElemSet}数据关系:R={R1,R2,...,Rn}
Ri={<aj1,…,ji,…,jn,aj1,…,ji+1,…,jn>|
0≤jk≤bk-1,1≤k≤n且k
i,
0≤ji≤bi-2,
aj1,…,ji,…,jn,aj1,…,ji+1,…,jn∈D,i=2,...,n}5.1数组的定义基本操作:
InitArray(&A,n,bound1,...,boundn)
操作结果:若维数n和各维长度合法,则构造相应的数组A。
DestroyArray(&A)
初始条件:数组A已经存在。
操作结果:销毁数组A。
Value(A,&e,index1,...,indexn)
初始条件:A是n维数组,e为元素变量,随后是n个下标值。
操作结果:若各下标不超界,则e赋值为所指定的A的元素值,并返回OK。
Assign(&A,e,index1,...,indexn)
初始条件:A是n维数组,e为元素变量,随后是n个下标值。
操作结果:若下标不超界,则将e的值赋给A中指定下标的元素。}ADTArray5.1数组的定义5.2数组的顺序表示和实现用一组连续的存储单元来表示数组。有两种映象方法:“以行(序)为主(序)”
:对二维数组进行“按行切分”,即将数组中的数据元素“按行依次排放”在存储器中“以列(序)为主(序)”对二维数组进行“按列切分”,即将数组中的数据元素"按列依次排放"在存储器中。
按行序为主序存放
am-1,n-1……..
am-1,1
am-1,0
………
a1,n-1
……..
a11
a10
a0,n-1
…….
a01
a0001n-1m*n-1n5.2数组的顺序表示和实现
按列序为主序存放am-1,n-1
……..
a1,n-1
a0,n-1
……….am-1,1
……..
a11a01
am-1,1
…….a10a0001m-1m*n-1m5.2数组的顺序表示和实现
按行序为主序存放
am-1,n-1……..
am-1,1am-1,0
………
a1,n-1
……..
a11
a10a0,n-1
…….a01
a0001n-1m*n-1n
每个数据元素占L个存储单元;LOC(0,0)表示数据元素a00的存储地址
是数组的起始地址(基地址);LOC(i,j)表示下标为(i,j)的数据元素
aij的存储地址
LOC(i,j)=LOC(0,0)+(i*n+j)*L5.2数组的顺序表示和实现
按列序为主序存放am-1,n-1……..a1,n-1a0,n-1
……….am-1,1……..a11a01am-1,1
…….a10a0001m-1m*n-1m
每个数据元素占L个存储单元;LOC(0,0)表示数据元素a00的存储地址,
是数组的起始地址(基地址)
LOC(i,j)表示下标为(i,j)的数据元素
aij的存储地址
LOC(i,j)=LOC(0,0)+(j*m+i)*L5.2数组的顺序表示和实现5.3矩阵的压缩存储压缩存储为多个值相同的矩阵元只分配一个存储空间;对零元不分配空间。5.3.1特殊矩阵特殊矩阵值相同的元素或者零元素在矩阵中的分布有一定规律对称矩阵n阶矩阵;
aij=aji 1
i,jn5.3矩阵的压缩存储特殊矩阵值相同的元素或者零元素在矩阵中的分布有一定规律三角矩阵n阶矩阵;下(上)三角矩阵:矩阵的上(下)三角(不包括对角线)中的元均为常数c或零。5.3矩阵的压缩存储特殊矩阵值相同的元素或者零元素在矩阵中的分布有一定规律对角矩阵n阶矩阵所有的非零元都集中在以主对角线为中心的带状区域中5.3矩阵的压缩存储压缩存储——对称矩阵按行序为主序:仅存储下三角
a11
a12
….
……..a1n
a21
a22
……..…….a2n
an1
an2
……..ann
….ann…an1a32…a31a22a21a114321k=05.3矩阵的压缩存储压缩存储——下三角矩阵
a11
11
……..1
a21a22
1
……..1
an1an2an3……..ann
….1按行序为主序:ann…an1a32…a31a22a21a11仅存储下三角14321k=05.3矩阵的压缩存储压缩存储——对角矩阵
a11
a12
0
…………….
0
a21
a22
a23
0
……………0
0
0
…an-1,n-2
an-1,n-1
an-1,n
0
0
………an,n-1
an,n
0
a32
a33
a34
0
………0……………仅存储主对角线非0元素按行序为主序:an,nan,n-1a23…a22a21a12a114321k=05.3矩阵的压缩存储5.3.2稀疏矩阵稀疏矩阵非零元较零元少,且分布没有一定规律的矩阵。压缩存储原则:只存矩阵的行列维数和每个非零元的行列下标及其值。
矩阵维数(6,7)非零元(1,2,12)(1,3,9)(3,1,-3)(3,6,14)(4,3,24)(5,2,18)(6,1,15)(6,4,-7)5.3矩阵的压缩存储1.压缩存储——稀疏矩阵(三元组顺序表)以顺序存储结构来表示三元组。稀疏矩阵的三元组顺序表存储表示#defineMAXSIZE12500//假设非零元个数的最大值为12500typedefstruct{
inti,j; //该非零元的行下标和列下标
ElemTypee;
}Triple;typedefstruct{
Tripledata[MAXSIZE+1];//非零元三元组表,data[0]未用
intmu,nu,tu;//矩阵的行数、列数和非零元个数
}TSMatrix;行序5.3矩阵的压缩存储6
7
8
121213931-3361443245218611564-7dataije012345678行列下标非零元值data[0].i,data[0].j,data[0].e分别存放矩阵行列维数和非零元个数5.3矩阵的压缩存储求转置矩阵问题描述已知一个稀疏矩阵的三元组表,求该矩阵转置矩阵的三元组表。解决思路将矩阵行、列维数互换;将每个三元组中的i和j相互调换;重排三元组次序。5.3矩阵的压缩存储6
7
8
121213931-3361443245218611564-7ije01234567M.dataije7
6
8
13-3161521122518319342446-7631401234567T.data?5.3矩阵的压缩存储方法一:按矩阵的列序转置按T.data中三元组次序依次在M.data中找到相应的三元组进行转置6
7
8
121213931-3361443245218611564-7ije012345678M.data7
6
8
13-3161521122518319342446-76314ije012345678T.dataqppppppppqqqqppppppppcol=1col=25.3矩阵的压缩存储Col从1~n在M中找每1列5.3矩阵的压缩存储
按矩阵的列序转置的算法思想
(1)令T.mu=M.nu,T.nu=M.mu,T.tu=M.tu,col=1,q=1(T的三元组下标初始化,指向转置后的第1个位置),p=1(指向M的第1个位置)
(2)如p所指元素的列下标=col,则送q所指位置,q++
(3)p++,若p<=M.tu(1~最后1个非0元),则(2),否(4)
(4)col++,如果col<=M.nu,p=1,转(2),否(5)
(5)结束适用于tu<<mu*tu时间复杂度为O(nutu)算法5.1算法实现:
设num[col]记录M中第col列中非0元个数,cpot[col]记录M中第col列的第1个非0元在T中的恰当位置,有:
cpot[1]=1;cpot[col]=cpot[col-1]+num[col-1]2≤col≤M.mu方法二:按矩阵的行序转置按M.data中三元组次序转置,转置结果放入T.data中恰当位置。此法关键是要预先确定M.data中每一列第一个非零元在T.data中位置。(cpot[col])为确定这些位置,转置前应先求得M.data的每一列中非零元个数。(num[col])5.3矩阵的压缩存储6
7
8
121213931-3361443245218611564-7ije012345678M.dataije012345678T.datacolnum[col]cpot[col]1122323524715806817907
6
8
13-3161521122518319342446-76314pppppppp462975385.3矩阵的压缩存储
方法二:按矩阵的行序转置的实现用空间换取时间时间复杂度为O(nu+tu)算法5.25.3矩阵的压缩存储
三元组顺序表的特点优点非零元在表中按行序有序存储,便于进行依行序处理的矩阵运算。缺点若需按行号存取某一行的非零元,则需从头开始进行查找。5.3矩阵的压缩存储2.压缩存储——稀疏矩阵(行逻辑链接的顺序表)为了便于随机存储任意一行的非零元,需要知道每一行的第一个非零元在三元组表中的位置解决方法:将cpot固定在稀疏矩阵的存储结构中。#defineMAXSIZE12500 //假设非零元个数的最大值为12500typedefstruct{
inti,j; //该非零元的行下标和列下标
ElemTypee;
}Triple;typedefstruct{
Tripledata[MAXSIZE+1];//非零元三元组表,data[0]未用
intrpos[MAXRC+1];
//各行第一个非零元的位置表
intmu,nu,tu; //矩阵的行数、列数和非零元个数
}RLSMatrix;5.3矩阵的压缩存储344
11314522-1312ije01234M.data42
4
12221131-2324ije01234N.data323
12621-1324ije0123Q.data矩阵乘法运算如何求?5.3矩阵的压缩存储(1)稀疏矩阵M
N,只需在M、N中找到相应的各对非0元素相乘,即M.data中的j值和N.data中的i值相等的各对非0元素相乘。例如M中的(1,1,3)p=1和N中的(1,1,0)、(1,2,2)q=1相乘。为此,设两个:num[brow]表示N中第brow行的非0元个数,rpos[brow]表示N中第brow行的第1个非0元在N.data中的位置,N.rpos[1]=1,N.rpos[brow]=rpos[brow-1]上一行+num[brow-1]上一行,2≤brow≤n。N.rops[brow]、M.rpos[arow]称为行逻辑链接的顺序表。(并在进入下面的算法前,预先求得一维数组rpos的值。(2)乘积矩阵Q中每个元素的值是个累计和(也可能为和),对每个元素设一中间变量,temp[]列数,初值为0,将相应非0元素的乘积累加。例如,Ma中的(1,1,3)1与Nb中的(1,1,1)1的乘积,以及Ma中的(1,3,4)2与Nb中的(3,1,-2)3的乘积累加为Q中的(1,1,-5)1(3)因(M)是“以行为主”排列,(Q)也应“以行为主”排列,故对Q逐行处理。中间变量ctemp[最大为Q的列数]存放Q的一行,检查这行中各元素是否零,然后,再将非0元素(结果)存到Q.data中。5.3矩阵的压缩存储矩阵Q的rposrow123rpos[row]
1ppppp2pp312621-1324ije0123Q.data431rpos[row]321row矩阵M的rpos54321rpos[row]321row矩阵N的rpos
11314522-1312ije01234M.data34
4
12221131-2324ije01234N.data42
4320arow=1arow=2arow=3000000ctemp累加器6-145.3矩阵的压缩存储5.3矩阵的压缩存储算法思想①初始化(行数Q<=M,列数Q<=N赋值,Q的下标Q.tu=0,准备接收);②for(arow=1;arow<=M.mu;++arow),处理M的每一行;③中间变量一维数组ctemp(行)清0(例子中,Q一行只有2列,故ctemp[1],ctemp[2]即2)。顺便记下Q当前行非0元的起始位置Q.tu④对M的当前行中的非0元,(逐个)做:(p<tp)⑤取M中当前非0元的列号(j),即为N中行i(N中的行号brow);⑥根据N的行号,对该行的非0元逐个做:(有几个就做几次)(q<t)⑦取N中当前非0元的列号为Q的列号(Q的列号为ccol);⑧M、N中相应的非0元相乘,并累加到ctemp[Q的列号]ccol中;⑨逐个将当前Q的一行中的非0元素存入Q中。矩阵相乘算法实现算法5.35.3矩阵的压缩存储算法时间复杂度累加器ctemp[]初始化的时间复杂度为:
O(M.mu×N.nu)
求Q的所有非0元的时间复杂度为:
O(M.nu×N.tu/N.mu)
压缩存储的时间复杂度为:
O(M.mu×N.nu)所以,总的时间复杂度为:
O(M.mu×N.nu+M.tu×N.tu/N.mu)3.压缩存储——稀疏矩阵(十字链表)引入原因当矩阵的非零元的个数发生变化时,不宜采用三元组表。如A=A+B,非零元的插入或删除将会引起A.data中的数据移动,这是顺序结构三元组的弱势。十字链表结点形式ijedownright非零元的行、列、值同一列下一个非零元同一行下一个非零元typedefstructOLNode{
inti,j;
ElemTypee;
structOLNode*right,*down;
}OLNod;*OLink;typedefstruct
Olink*rhead,*chead;
intmu,nu,tu;
}CrossList;5.3矩阵的压缩存储113418225234^^^^^^^M.cheadM.rhead列链表头指针行链表头指针5.3矩阵的压缩存储建立十字链表的思想418^^234^^m=4,n=3,t=5113^^217^^225^^1,1,32,2,52,3,44,1,82,1,7M.rheadM.cread5.3矩阵的压缩存储建立十字链表的算法思想
(1)初始化
(2)循环输入各非0元的(i,j,e),直到最后一个,重复做:
(3)申请结点,赋值
(4)寻找行i插入位置,插入
(5)寻找列j插入位置,插入时间复杂度为O(
t*s),s=max(m.n)5.3矩阵的压缩存储建立十字链表的算法实现算法5.45.4广义表的定义广义表(列表)是线性表的推广,广泛地应用于人工智能等领域的表处理语言LISP语言。一般记作LS=(a1,a2,…,an)(n0)名称:LS;长度:n;原子:ai是单个元素,一般用小写字母表示;子表:ai是广义表,一般用大写字母表示。表头(Head):非空广义表LS的第一个数据元素a1;表尾(Tail):非空广义表LS除第一个数据元素外的其余数据元素构成的广义表(a2,…,an)
。广义表特性A=()F=(b,(c,d,e))E=(b,(c),(d,e))D=(E,A,F)C=(A,D,F)B=(a,B)=(a,(a,(a,v...)))
广义表中的数据元素有固定的相对次序广义表的元素可以是子表,而子表的元素还可是子表广义表可以为其它列表共享广义表可以是一个递归的表
广义表与数组的区别5.4广义表的定义操作——长度A=()F=(b,(c,d,e))E=(b,(c),(d,e))D=(E,A,F)C=(A,D,F)B=(a,B)=(a,(a,(a,v...)))广义表中元素的“长度"应由最外层括弧中的"逗号"来定。
A的长度为0F的长度为2E的长度为3D的长度为3C的长度为3B的长度为25.4广义表的定义操作——取表头、取表尾F=(b,(c,d,e))GetHead(F)=bGetTail(F)=((c,d,e))=F1GetHead(F1)=(c,d,e)=F2,GetTail(F1)=()GetHead(F2)=c,GetTail(F2)=(d,e)=F3GetHead(F3)=d,GetTail(F3)=(e)=F4GetHead(F4)=e,GetTail(F4)=()
两个操作只对非空表有意义;取表头的结果可能是原子,也可能是个广义表;取表尾"必定"是个广义表,但可能是个空的广义表。5.4广义表的定义5.5广义表的存储结构采用链式存储结构两种结构的结点表结点:用来表示列表原子结点:用来表示子表表结点tag=1hptp原子结点tag=0atom标志域标志域表头指针表尾指针值域A=() B=(e)
C=(a,(b,c,d))D=(A,B,C)
E=(a,E)1
1
11111
1
1
11
0a0a0e0d0b0cABCDE1
5.5广义表的存储结构另一种结点结构表结点tag=1hptp原子结点tag=0atomtp标志域标志域表头指针值域下一个元素指针下一个元素指针5.5广义表的存储结构A=() B=(e)
C=(a,(b,c,d))D=(A,B,C)
E=(a,E)1
1
1
1
1
11
0a0a0e
0d
0b0cBCDEA1
1
1
5.5广义表的存储结构本章小结了解数组的类型定义及其在高级语言中实现的方法。数组的特点是一种多维的线性结构,并只进行存取或修改某个元素的值,因此它只需要采用顺序存储结构。介绍了稀疏矩阵的三种表示方法。至于在具体应用问题中采用哪一种表示法这取决于该矩阵主要进行什么样的运算。广义表是一种递归定义的线性结构,因此它兼有线性结构和层次结构的特点。基础知识题(数组部分)假设有二维数组A6×8,每个元素用相邻的6个字节存储,存储器按字节编址。已知A的起始存储位置(基地址)为1000,计算:数组A的存储;数组A的最后一个元素a5,7
的第一个字节的地址;按行存储时,元素a1,4
的第一个字节的地址;按列存储时,元素a4,7
的第一个字节的地址。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 乐器清洁保养考核试卷
- 2024年行政管理师考试中的解题策略试题及答案
- 行政管理师考前心理预备试题及答案
- 2025年【湖南省汽车修理工(中级)】考试题及答案
- 索道制动系统设计与优化考核试卷
- 材料科学与工程基础考核试卷
- 矿产勘查经济学考核试卷
- 糖果与巧克力产品创新设计考核试卷
- 路基工程挖土施工方案
- 花艺师个人创意题目及答案
- 江西卷-2025届高考历史4月模拟预测卷(解析版)
- bim安全教育试题及答案
- 运输公司机务管理制度
- 妇科管理制度
- 初中数学课标培训
- 2025年济源职业技术学院单招职业技能测试题库附答案
- 《浙江省中药饮片炮制规范》 2015年版
- 新晋管理者培训
- 广东省清远市清新区2025年中考一模语文试题(含答案)
- 防高处坠落 物体打击专项施工方案
- ISO9001-2015版质量管理体系标准培训教程
评论
0/150
提交评论