版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章数组和稀疏矩阵5.1数组4.2特殊矩阵的压缩存储5.3稀疏矩阵第5章数组和稀疏矩阵1/375.1数组5.1.1数组的定义一维数组是n(n>1)个相同性质的数据元素a1,a2,…,an构成的有限序列,它本身就是一个线性表。二维数组可以看成是这样的一个线性表,它的每个数据元素也是一个线性表。
5.1数组2/37例如,以下的二维数组A以m行n列的矩阵形式表示,它可以看成是一个线性表的线性表:A=(A1,A2,…,Ai,…,Am)其中每个数据元素Ai也是一个线性表:Ai=(ai,1,ai,2,…,ai,n)5.1数组3/37通常数组的基本运算主要有:存元素值取元素值5.1数组4/37几乎所有的高级程序设计语言都实现了数组数据结构,称为数组类型。在C/C++语言中,数组类型具有如下特点:一个数组中所有元素具有相同的数据类型。数组一旦被定义,它的维数和每维大小就不再改变。数组中每个元素对应唯一的下标,可以通过该下标对元素进行存取操作。5.1数组5/375.1.2数组的存储结构以二维数组为例,在C/C++语言中,由于数组下标从0开始,所以除特别指出外,后面的数组表示均统一为下标从0开始。5.1数组6/37二维数组的存储次序有按行优先和按列优先两种方式。按行优先存储a0,0
a0,1…a0,n-1
a1,0
a1,1…a1,n-1…am-1,0
am-1,1…am-1,n-1第0行第1行第m-1行5.1数组7/37对于元素ai,j,其存储地址为:a0,0
a0,1…a0,n-1…ai,0…ai,j
…ai,n-1…第0行第i行LOC(ai,j)=LOC(a0,0)+(i*n+j)*k每个元素占k个存储单元ai,j前面有0~i-1共i行,每行n个元素,共有i*n个元素在第i行中,ai,j前面j个元素5.1数组8/37按列优先存储a0,0
a1,0…am-1,0
a0,1
a1,1…an-1,1…a0,n-1
a1,n-1…am-1,n-1第0列第1列第n-1列5.1数组9/37对于元素ai,j,其存储地址为:a0,0
a1,0…am-1,0…a0,j…ai,j
…an-1,j…第0列第j列LOC(ai,j)=LOC(a0,0)+(j*m+i)*k每个元素占k个存储单元ai,j前面有0~j-1共j列,每列m个元素,共有j×m个元素在第j列中,ai,j前面i个元素5.1数组10/37
【例5.1】对于二维数组A[0..2][0..5],当按行优先存储时,元素A[2][3]是第几个元素;
当按列优先存储时,元素A[2][4]是第几个元素。
解:这里m=3,n=6。
当按行优先存储时,元素A[2][3]的前面有2行计12个元素,在第2行中前面有3个元素,所以元素A[2][3]是12+3+1=16个元素。当按列优先存储时,元素A[2][4]的前面有4列计12个元素,在第4列中前面有2个元素,所以元素A[2][4]是12+2+1=15个元素。5.1数组11/375.1.3数组的算法设计示例【例5.2】设计一个算法,实现一个m×n的整型数组A的转置运算。voidTransMat(intA[][MAX],intB[][MAX],intm,intn){inti,j;
for(i=0;i<m;i++) for(j=0;j<n;j++)
B[j][i]=A[i][j];}
解:对于一个m×n的数组Am×n,其转置矩阵是一个n×m的矩阵Bn×m,且B[i][j]=A[j][i],0≤i<m,0≤j<n。5.1数组12/375.2特殊矩阵的压缩存储特殊矩阵是指非零元素或零元素的分布有一定规律的矩阵。为了节省存储空间,特别是在高阶矩阵的情况下,可以利用特殊矩阵的规律,对它们进行压缩存储。5.2特殊矩阵的压缩存储13/37一个n阶方阵的元素可以分为主对角线、上三角和下三角部分1.对称矩阵的压缩存储若一个n阶方阵A[n][n]的元素满足ai,j=aj,i(0≤i,j≤n-1),则称其为n阶对称矩阵。5.2特殊矩阵的压缩存储14/37由于对称矩阵中的元素关于主对角线对称,因此在存储时可只存储对称矩阵中上三角+对角线或下三角+对角线中的元素,使得对称的元素共享一个存储空间。这样,就可以将n2个元素压缩存储到n(n+1)/2个元素的空间中。不失一般性,以行序为主序存储其下三角+对角线的元素。5.2特殊矩阵的压缩存储15/37B={bk}第0行有1个元素第1行有2个元素…第i-1行有i个元素在第i行中,元素ai,j的前面亦有j个元素k=
i(i+1)/2+j5.2特殊矩阵的压缩存储16/37则A中任一元素ai,j和bk之间存在着如下对应关系:对于A中上三角部分元素ai,j(i<j),它的值等于aj,i,而aj,i元素在B中的存储位置k=j(j+1)/2+i。5.2特殊矩阵的压缩存储17/372.三角矩阵的压缩存储所谓n阶下(上)三角矩阵,是指矩阵的上(下)三角(不包括对角线)中的元素均为常数c的n阶方阵。设以一维数组B[0..n(n+1)/2]作为n阶三角矩阵A的存储结构。5.2特殊矩阵的压缩存储18/37上三角矩阵:下三角矩阵:其中,B的元素bn(n+1)/2中存放常数c。5.2特殊矩阵的压缩存储19/373.对角矩阵的压缩存储若一个n阶方阵A满足其所有非零元素都集中在以主对角线为中心的带状区域中,则称其为n阶对角矩阵。其主对角线上下方各有b条次对角线,称b为矩阵半带宽。5.2特殊矩阵的压缩存储20/37
对于b=1的三对角矩阵A,只存储其非零元素,并按行优先存储到一维数组B中,将A的非零元素ai,j存储到B的元素bk中:
k=2i+j
5.2特殊矩阵的压缩存储21/375.3稀疏矩阵一个阶数较大的矩阵中的非零元素个数s相对于矩阵元素的总个数t十分小时,即s<<t时,称该矩阵为稀疏矩阵。例如一个100×100的矩阵,若其中只有100个非零元素,就可称其为稀疏矩阵。稀疏矩阵的压缩存储方法是只存储非零元素,主要有三元组和十字链表两种方法。5.3稀疏矩阵22/375.3.1稀疏矩阵的三元组表示由于稀疏矩阵中非零元素的分布没有任何规律,所以在存储非零元素时还必须同时存储该非零元素所对应的行下标和列下标。这样稀疏矩阵中的每一个非零元素需由一个三元组(i,j,ai,j)唯一确定,稀疏矩阵中的所有非零元素构成三元组线性表。5.3稀疏矩阵23/37((0,2,1),(1,1,2),(2,0,3),(3,3,5),(4,4,6),(5,5,7),(5,6,4))5.3稀疏矩阵24/37三元组顺序表的数据结构可定义如下:#defineMaxSize100 //矩阵中非零元素的最多个数typedefstruct{intr; //行号
intc; //列号
ElemTyped;
//元素值为ElemType类型}TupNode; //三元组定义typedefstruct{introws; //行数
intcols; //列数
intnums; //非零元素个数
TupNode
data[MaxSize];}TSMatrix; //三元组顺序表定义5.3稀疏矩阵25/37(1)从一个二维稀疏矩阵创建其三元组表示以行序方式扫描二维稀疏矩阵A,将其非零的元素插入到三元组t中。voidCreatMat(TSMatrix&t,ElemTypeA[M][N]){inti,j;
t.rows=M;t.cols=N;t.nums=0;
for(i=0;i<M;i++)
{for(j=0;j<N;j++)
if(A[i][j]!=0) //只存储非零元素
{
t.data[t.nums].r=i;t.data[t.nums].c=j;
t.data[t.nums].d=A[i][j];t.nums++;
}
}}5.3稀疏矩阵26/37(2)三元组元素赋值对于稀疏矩阵A,执行A[i][j]=x。intValue(TSMatrix&t,ElemTypex,inti,intj){intk=0,k1;
if(i>=t.rows||j>=t.cols)return0; //参数错误
while(k<t.nums&&i>t.data[k].r)k++; //查找行while(k<t.nums&&i==t.data[k].r&&j>t.data[k].c)k++;
//查找列if(t.data[k].r==i&&t.data[k].c==j) //存在元素t.data[k].d=x;
else
//不存在这样的元素时插入一个元素
{for(k1=t.nums-1;k1>=k;k1--)
{t.data[k1+1].r=t.data[k1].r;
t.data[k1+1].c=t.data[k1].c;
t.data[k1+1].d=t.data[k1].d;
}
t.data[k].r=i;t.data[k].c=j;t.data[k].d=x;t.nums++;
}
return1; //成功时返回1}5.3稀疏矩阵27/37(3)将指定位置的元素值赋给变量
对于稀疏矩阵A,执行x=A[i][j]。intAssign(TSMatrixt,ElemType&x,inti,intj){intk=0;
if(i>=t.rows||j>=t.cols)return0;
//参数错误
while(k<t.nums&&i>t.data[k].r)k++; //查找行
while(k<t.nums&&i==t.data[k].r&&j>t.data[k].c)k++; //查找列
if(t.data[k].r==i&&t.data[k].c==j) x=t.data[k].d;
else x=0; //在三元组中没有找到表示是零元素
return1; //成功时返回1}5.3稀疏矩阵28/37(4)输出三元组运算算法从头到尾扫描三元组t,依次输出元素值。voidDispMat(TSMatrixt){inti;
if(t.nums<=0) //没有非零元素时返回return;
printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums);
printf("\t------------------\n");
for(i=0;i<t.nums;i++)printf("\t%d\t%d\t%d\n", t.data[i].r,t.data[i].c,t.data[i].d);}5.3稀疏矩阵29/37
【例5.4】一个稀疏矩阵采用三元组表示压缩存储后,和直接采用二维数组存储相比会失去()特性。A.顺序存储
B.随机存取
C.输入输出 D.以上都不对5.3稀疏矩阵30/375.3稀疏矩阵5.3.2稀疏矩阵的十字链表表示31/37对于稀疏矩阵中每个非零元素创建一个结点存放它,包含元素的行号、列号和元素值。这里有4个非零元素,创建4个数据结点。将同一行的所有结点构成一个带头结点的循环单链表,行号为i的单链表的头结点为hr[i]。这里有3行,对应有3个循环单链表,头结点分别为hr[0]~hr[2]。hr[i](0≤i≤2)头结点的行指针指向行号为i的单链表的首结点。5.3稀疏矩阵32/37将同一列的所有结点构成一个带头结点的循环单链表,列号为j的单链表的头结点为hd[j]。这里有4列,对应有4个循环单链表,头结点分别为hd[0]~hd[3]。hd[j](0≤j≤3)头结点的列指针指向列号为j的单链表的首结点。5.3稀疏矩阵3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国椰子水行业市场发展趋势与前景展望战略研究报告
- 2026高温过滤材料在垃圾焚烧领域应用评估报告
- 2026高分子材料行业技术突破及产业链优化与可持续发展报告
- 2026镍基合金行业供应链金融模式与资金管理优化报告
- 2026镍基合金市场集中度与竞争格局演变研究报告
- 2026镍基合金在海洋工程领域市场潜力与开发策略报告
- 2026锂电池正极材料市场趋势与供应链优化策略报告
- 2026钕铁硼磁铁行业技术发展现状与市场需求预测及投资评估报告
- 2026量子计算技术研发进展与应用场景可行性研究报告
- 2026年天津仁爱学院单招职业技能测试题库含答案详解(培优b卷)
- 《植物组织培养》课件-项目一 行业与岗位认知
- HYT 180-2015 基准潮位核定技术指南(正式版)
- 大学劳动教育(高等院校劳动教育课程)全套教学课件
- JBT 10364-2014 液压单向阀标准规范
- 中建履约过程风险发函时点提示及函件指引(2023年)
- GB/T 24475-2023电梯远程报警系统
- HCIA-Security 华为认证初级网络安全工程师实验手册
- 《美学原理》导论-课件
- GM/T 0031-2014安全电子签章密码技术规范
- GB/T 492-1989钠基润滑脂
- 立法建议书6篇
评论
0/150
提交评论