第5章 数组和广义表
数据结构第五章 数组与广义表
压缩存储方法:只需要存储下三角 (含对角线)上的元素。可节省一 半空间。
可以使用一维数组Sa[n(n+1)/2]作为n阶对称矩阵A的存 储结构,且约定以行序为主序存储各个元素,则在Sa[k]和矩
阵元素aij之间存在一一对应关系: (下标变换公式)
i(i+1)/2 + j 当i≥j k = j(j+1)/2 + i 当i<j
q = cpot[col];
T.data[q].i = M.data[p].j; T.data[q].j = M.data[p].i; T.data[q].e = M.data[p].e; ++cpot[col]; }
分析算法FastTransposeSMatrix的时间 复杂度:
for (col=1; col<=M.nu; ++col) … … for (t=1; t<=M.tu; ++t) … … for (col=2; col<=M.nu; ++col) … … for (p=1; p<=M.tu; ++p) … …
//对当前行中每一个非零元
处
brow=M.data[p].j;
理
if (brow < N.nu ) t = N.rpos[brow+1];
M
else { t = N.tu+1 }
的
for (q=N.rpos[brow]; q< t; ++q) { ccol = N.data[q].j; // 乘积元素在Q中列号
一、三元组顺序表
对于稀疏矩阵,非零元可以用三元组表示, 整个稀疏矩阵可以表示为所有非零元的三元组所 构成的线性表。例如:
《数据结构与算法》第五章-数组和广义表学习指导材料
《数据结构与算法》第五章数组和广义表本章介绍的数组与广义表可视为线性表的推广,其特点是数据元素仍然是一个表。
本章讨论多维数组的逻辑结构和存储结构、特殊矩阵、矩阵的压缩存储、广义表的逻辑结构和存储结构等。
5.1 多维数组5.1.1 数组的逻辑结构数组是我们很熟悉的一种数据结构,它可以看作线性表的推广。
数组作为一种数据结构其特点是结构中的元素本身可以是具有某种结构的数据,但属于同一数据类型,比如:一维数组可以看作一个线性表,二维数组可以看作“数据元素是一维数组”的一维数组,三维数组可以看作“数据元素是二维数组”的一维数组,依此类推。
图5.1是一个m行n列的二维数组。
5.1.2 数组的内存映象现在来讨论数组在计算机中的存储表示。
通常,数组在内存被映象为向量,即用向量作为数组的一种存储结构,这是因为内存的地址空间是一维的,数组的行列固定后,通过一个映象函数,则可根据数组元素的下标得到它的存储地址。
对于一维数组按下标顺序分配即可。
对多维数组分配时,要把它的元素映象存储在一维存储器中,一般有两种存储方式:一是以行为主序(或先行后列)的顺序存放,如BASIC、PASCAL、COBOL、C等程序设计语言中用的是以行为主的顺序分配,即一行分配完了接着分配下一行。
另一种是以列为主序(先列后行)的顺序存放,如FORTRAN语言中,用的是以列为主序的分配顺序,即一列一列地分配。
以行为主序的分配规律是:最右边的下标先变化,即最右下标从小到大,循环一遍后,右边第二个下标再变,…,从右向左,最后是左下标。
以列为主序分配的规律恰好相反:最左边的下标先变化,即最左下标从小到大,循环一遍后,左边第二个下标再变,…,从左向右,最后是右下标。
例如一个2×3二维数组,逻辑结构可以用图5.2表示。
以行为主序的内存映象如图5.3(a)所示。
分配顺序为:a11 ,a12 ,a13 ,a21 ,a22,a23 ; 以列为主序的分配顺序为:a11 ,a21 ,a12 ,a22,a13 ,a23 ; 它的内存映象如图5.3(b)所示。
第5 章数组和广义表
2019/11/8
14
如果将三维数组推广到一般情况,即:用j1,j2, j3代替数组下标i,j,k;并且j1,j2,j3的下限为c1, c2,c3,上限分别为d1,d2,d3,每个元素占一个 存储单元。则三维数组中任意元素 a(j1,j2,j3)的地址为:
………
……
特点:
i=1, j=1,2; 当 1<i<n,j=i-1, i, i+1
i=n, j=n-1, n;
时,aij非零,其他元素均为零。
2019/11/8
21
三对角带状矩阵的压缩存储,以行序为主序进行存储, 并且只存储非零元素。其方法为:
1. 确定存储该矩阵所需的一维向量空间的大小
从三对角带状矩阵中可看出:除第一行和最后一行只有两 个元素外,其余各行均有3个非零元素。由此可得到一维向量
i(i-1)/2+j-1 当i>=j k=
j(j-1)/2+i-1 当i<j
2019/11/8
20
5.3.2 带状矩阵
带状矩阵:在矩阵A中,所有的非零元素都集中在以主对角 线为中心的带状区域中。最常见的是三对角带状矩阵。
a11 a12
a21 a22 a23
An×n =
a32 a33 a34 a43 a44 a45
Loc[i,j]=Loc[1,1]+n ×(i-1)+(j-1)
其中n为第2维的长度
如果每个元素占size个存储单元 ,则任意元 素aij的地址计算公式为:
Loc[i,j]=Loc[1,1] + (n×(i-1)+j-1)×size
第五部分数组和广义表教学课件
的 压
常数。下三角矩阵正好相反,它的主对角线上方均为常数, 如图所示。在大多数情况下,三角矩阵常数为零。
缩
存
a00 0 0 …….. 0
储
a10 a11 0 …….. 0
…………………. 0 an-10 an-11 an-12…….. an-1n-1
三角矩阵中的重复元素c可共享一个存储空间,其
矩
余的元素正好有n(n+1)/2个,因此,三角矩阵可压缩
ji =0,...,bi -1, i=1,2,..,n
}
数据关系:
R1={ 0
a a <
j1 … ji…,jn jk bk -1,
1j1
…
kji+1…njn
>| 且k i,
0 ji bi -2, i=2,...,n, 0 ji bi -2,}
二维数组的定义:
数 数据对象:
实
现
以行序为主序(低下标优先)
以列序为主序(高下标优先)
0
a00
按行序为主序存放
1
a01
数
…….
组 的
n-1 a0n-1
顺
n
a10
序 表 示
a00 a01 …….. a0n-1 a10 a11 …….. a0n-1
a11 ……..
和
a1n-1
实
………………….
……….
现
am-10am-11 …….. am-1n-1
定
10
11
1 n-2
义
A
=
m* n
...
... ...
...
a
a
数据结构课件PPT数组和广义表
{ q=1; for (col=1;col<=T.mu;++col) for(p=1;p<=M.tu;++p) if ( M.data[p].j==col ) { T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++q; } }
(row) (col) (value)
[0] 1 4 22
[0] 1 5 91
[1] 1 7 15
[1] 2 2 11
[2] 2 2 11
[2] 3 6 28
[3] 2 [4] 3来自6 17 4 -6[3] 4 [4] 4
1 22 3 -6
[5] 4 6 39
[5] 6 2 17
[6] 5 1 91
[6] 6 4 39
cpot[1]=1 cpot[col]=cpot[col-1]+num[col-1]
稀疏矩阵的快速转置(算法5.2)
Status FastTransposeSMatrix(TSMatrix M,TSMatrix &T) { T.mu=M.nu; T.nu=M.mu; T.tu=M.tu;
if (T.tu) { for (col=1;col<=M.nu;++col) num[col]=0; for (t=1;t<=M.tu;++t) ++num[M.data[t].j]; cpot[1]=1; for ( col=2;col<=M.nu;++col) cpot[col]=cpot[col-1]+num[col-1]; for (p=1;p<=M.Tu;++p) { col=M.data[p].j; q=cpot[col]; T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++cpot[col]; } }
大学数据结构课件--第5章 数组和广义表
a 32 a 33 a 34 0 0
a 43 a 44 a 45 0
a 54 a 55 a 56 a 65 a 66
5.3.2 稀疏矩阵
稀疏矩阵的存储:如何表示非零元素的位置信息 1. 三元组表:每个元素用一个三元组(i,j,v)来表示。 i j v
0 1 6 1 1 6 2 3 8 12 9
2
3 4 5 6 7 8
2
5.2 数组的顺序表示和实现
a00 a00 a10 a01 存储单元是一维结构,而数组是个多维结构 , …… …… 则用一组连续存储单元存放数组的数据元素就有 am-1,0 a0,n-1 个次序约定问题。 a01 a10
a11
……
a11
……
二维数组可有两种存储方式: am-1,1 a1,n-1
……
K=
i*n-i(i-1)/2+j-i n(n+1)/2
当 i≤j 当i>j
0 a11 ... a1n-1 ... ... ... ... 0 0 0 an-1n-1
当i ≤ j时,a[i][j]是非零元素, a[i][j]前面有i行,共有n+(n-1)+(n-2)+…(n-(i-1))
=i(n+[n-(i-1)])/2=i*n-i(i-1)/2个元素,a[i][j]前面有j列,共j-i个非零元素,
A m× n
( a10 a11 … a1,n-1 )
=
注:
( … … …… ) ( am-1,0 am-1,2 … am-1,n-1 ) ( ( ( (
① 数组中的元素都具有统一的类型; ② 数组元素的下标一般都具有固定的上界和下界,即数组一旦 被定义,它的维数和维界就不再发生改变; ③ 数组的基本操作简单:初始化、销毁、存取元素和修改元素值
数据结构数组和广义表
数据结构05数组与广义表数组与广义表可以看做是线性表地扩展,即数组与广义表地数据元素本身也是一种数据结构。
5.1 数组地基本概念5.2 数组地存储结构5.3 矩阵地压缩存储5.4 广义表地基本概念数组是由相同类型地一组数据元素组成地一个有限序列。
其数据元素通常也称为数组元素。
数组地每个数据元素都有一个序号,称为下标。
可以通过数组下标访问数据元素。
数据元素受n(n≥1)个线性关系地约束,每个数据元素在n个线性关系地序号 i1,i2,…,in称为该数据元素地下标,并称该数组为n维数组。
如下图是一个m行,n列地二维数组A矩阵任何一个元素都有两个下标,一个为行号,另一个为列号。
如aij表示第i行j列地数据元素。
数组也是一种线性数据结构,它可以看成是线性表地一种扩充。
一维数组可以看作是一个线性表,二维数组可以看作数据元素是一维数组(或线性表)地线性表,其一行或一列就是一个一维数组地数据元素。
如上例地二维数组既可表示成一个行向量地线性表: A1=(a11,a12,···,a1n)A2=(a21,a22, ···,a2n)A=(A1,A2, ···,Am) ············Am=(am1,am2, ···,amn)也可表示成一个列向量地线性表:B1=(a11,a21,···,am1)B2=(a12,a22, ···,am2)A=(B1,B2, ···,Bm) ············Bn=(a1n,a2n, ···,amn)数组地每个数据元素都与一组唯一地下标值对应。
第5章 数组和广义表总结
0603
2090
B5×4 = 0 8 0 0
0000
row col val
4000
0 12
0 44
1 06
1 28
2 19
3 03
现在,要通过A的 三元组表求其转置 矩阵B的三元组表。
row col val
0 16 0 33 1 02 1 29 2 18 4 04
16
三元组表的转置
方法1:设矩阵A是m行、n列、t个非0元素 从头到尾扫描A,将第0列的元素依次放入B(行号列号互换); 从头到尾扫描A,将第1列的元素依次放入B(行号列号互换); ...... 从头到尾扫描A,将第n-1列的元素依次放入B(行号列号互换); 扫描A几趟? 矩阵A的列数n
}tritype;
typedef struct { //三元组表
tritype data[MAXSIZE]; //三元组表存储空间
int mu, nu, tu;
//原矩阵的行数、列数、非0元素个数
}Tsmtype, *Tsmlink;
//三元组表说明符
14
三元组表
例 5.3 矩阵的转置。 求矩阵A的转置矩阵B,算法很简单:
ArrayInit(&A, n, d1, d2, ..., dn) ArrayDestroy(&A)
ArrayGet(A, i1, ..., in, &e)
ArrayAssign(&A, i1, ..., in, e) }ADT Array;
数组的基本操作一般不包括插入和删除
4
5.2 数组的存储结构
存储空间是在程序执行时动态分配的
n维数组A[u1][u2]…[un]
数据结构第五章 数组和广义表
5.3.1
特殊矩阵
1、对称矩阵 在一个n阶方阵A中,若元素满足下述性质: aij = aji 1≤i,j≤n 则称A为对称矩阵。 a11 1 5 1 3 7 a21 a 22 5 0 8 0 0 a31 a32 a33 1 8 9 2 6 ……………….. 3 0 2 5 1 an 1 a n 2 a n 3 …a n n 7 0 6 1 3
第5章
数组和广义表
5.1 数组的定义
5.2 数组的顺序表示和实现
5.3 矩阵的压缩存储
5.3.1 特殊矩阵
5.3.2 稀疏矩阵
5.4 广义表的定义
5.1 数组的定义
数组-----线性表的扩展 A =(a0,a1,a2,…,an-1)
a00 a10 ┇ Am×n= ai0 ┇ am-1,0 a01 … a0j … a11 … a1j … ┇ ai2 … aij … ┇ am-1,2 … am-1,j … a0,n-1 a1,n-1 ai,n-1 am-1,n-1 α0 α1 ┇ Am×n= α i ┇ α m-1
Assign( &A, e, index1, ..., indexn) 赋值操作 初始条件:A是n维数组,e为元素变量,随后是n个下标值。 操作结果:若下标不超界,则将e的值赋给所指定的A的元 素,并返回OK。 对于数组来说一旦维数确定了,每个元素的下标确定了, 那么整个数组就确定了,这样的一个数组结构除了能改变 某元素的值,其他的不能再改变。
5.2 数组的顺序表示和实现
数组类型特点: 1) 只有引用型操作,没有加工型操作; 2) 数组是多维的结构,而存储空间是一个一维的结构。 有两种顺序映象的方式。
有两种顺序映像方法: 1)以行序为主序(行优先,先行后列):先存储行号较小 的元素,行号相同者先存储列号较小的元素;
数组与广义表
第五章数组与广义表一基本内容数组的类型定义和表示方式:特殊矩阵和稀疏矩阵的压缩存储方法及运算的实现;广义表的逻辑结构和存储结构、m元多项式的广义表表示以及广义表的操作的递归算法举例。
二学习要点1.了解数组两种存储表示方法,并掌握数组在以行为主的存储结构中的地址计算方法。
2.掌握对特殊矩阵进行压缩存储时的下标变换公式。
3.了解稀疏矩阵的两种压缩存储方法的特点和适用范围,领会以三元组表示稀疏矩阵时进行矩阵运算采用的处理方法。
4.掌握广义表的结构特点及其存储表示方法,读者可根据自己的习惯熟练掌握任意一种结构的链表,学会对非空广义表进行分解的两种分析方法:即可将一个非空广义表分解为表头和表尾两部分或者分解为n个子表。
5.学习利用分治法的算法设计思想编制递归算法的方法。
三重点与难点5.1.1 数组结构的基本概念1.数组的定义数组是由下标和值组成的有序对的集合。
在数组中对于每组有定义的下标,都存在一个与其相对应的值,该值通常称为数组元素值。
例如,一个形如m×n阶矩阵A[1,1] A[1,2]…A[1,n]A[2,1] A[2,2]…A[2,n]::::(5.1)A[m,1] A[m,2]…A[m,n]就是一个二维数组。
其中的每个元素A[I,j]都与一个二维空间的数(i,j)|(1<=i<=m,1<=j<=n)相对应。
类似的,一个N维数组中的每个元素都与一个N维空间的数(i,j,k,…)相对应。
若N=1 则为一维数组,变化成线性表即A[I]。
因此,数组可看成是线性表的最简单的推广,但这样一推就把数组结构由线性结构推到非线性结构了。
以式5。
1矩阵为例,每个元素A[i,j]属于两个线性队列,即第i行的队列A[i,1],A[i,2],…,A[i,n]共n个元素;第j列的队列A[1,j],A[2,j],…,A[m,j]共m个元素。
这些正交的行队列和列队列表示了数组的二维结构性质。
2.数组的性质数组结构中的每一个元素都与一组下标有关,一旦数组定义后,该结构就具有以下性质:(1)数据元素的数目固定,即一旦定义了数组结构,在其被操作的过程中,元素数目不再有增减变化。
数据结构讲义第5章-数组和广义表
5.4 广义表
5)若广义表不空,则可分成表头和表尾,反之,一对表头和表尾 可唯一确定广义表 对非空广义表:称第一个元素为L的表头,其余元素组成的表称 为LS的表尾; B = (a,(b,c,d)) 表头:a 表尾 ((b,c,d)) 即 HEAD(B)=a, C = (e) D = (A,B,C,f ) 表头:e 表尾 ( ) TAIL(B)=((b,c,d)),
5.4 广义表
4)下面是一些广义表的例子; A = ( ) 空表,表长为0; B = (a,(b,c,d)) B的表长为2,两个元素分别为 a 和子表(b,c,d); C = (e) C中只有一个元素e,表长为1; D = (A,B,C,f ) D 的表长为4,它的前三个元素 A B C 广义表, 4 A,B,C , 第四个是单元素; E=( a ,E ) 递归表.
以二维数组为例:二维数组中的每个元素都受两个线性关 系的约束即行关系和列关系,在每个关系中,每个元素aij 都有且仅有一个直接前趋,都有且仅有一个直接后继. 在行关系中 aij直接前趋是 aij直接后继是 在列关系中 aij直接前趋是 aij直接后继是
a00 a01 a10 a11
a0 n-1 a1 n-1
a11 a21 ┇ a12 a22 ┇ ai2 ┇ … amj … amn … aij … ain … … a1j a2j … … a1n a2n β1 β2 ┇ βi ┇ βm
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.1数组的定义
一维数组的特点: 1个下标,ai 是ai+1的直接前驱 二维数组的特点: 2个下标,每个元素ai,j受到两个关系 (行关系和列关系)的约束 N维数组的特点: n个下标,每个元素受到n个关系约束 一个n维数组可以看成是由若干个n-1维数组组成的线性 表 当n=1时,n维数组就退化为定长的线性表。因此,n维数 组是线性表的扩广
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
5.3.1特殊矩阵
另外的存储映射方式 1 1 2 3 4
4
9
5
2
7 19 3 23 14 8
2 23 0 0 4 7 14 0 2 3 0 9 19 8 0 0 5 3 4
Loc(aij)=Loc(a11)+[(j-1)*m+(i-1)]*K (尽管是方阵,公式不同) 例:设数组a[1…60, 1…70]的基地址为2048,每个元素占2 个存储单元,若以列序为主序顺序存储,则元素a[32, 58] 8950 的存储地址为 。 答:请注意审题! 利用列优先通式: LOC(aij)=LOC(ac1,c2)+[(j-c2)*(d1-c1+1)+i-c1)]*L 得:LOC(a32,58)=2048+[(58-1)*(60-1+1)+32-1)]*2=8950
5.3.1特殊矩阵
3、三角矩阵
5.3.1特殊矩阵
下三角矩阵:只存储对角线以下的元素: 1 1 2 2 3 4
0 0 0 2 4 7 0 0 3 23 9 19 0 (i, j ) A[i(i 1) / 2 j 1], i j
4
0 7 0 0 0 0 19 0 0 0 0 3
2
7 19 3
[0] [1] [2] [3]
5.3.1特殊矩阵
2、三对角矩阵 只存储三个对角线上的元 素(按行存储); 一维数组空间需要: (3n-2) *sizeof(T) 1 2 3 4 M 1 2 23 0 0 2 4
数组的抽象数据类型定义参见教材P90
6
5.2数组的顺序表示和实现
以行序为主序 如C, PASCAL
5.2数组的顺序表示和实现
以列序为主序 如FORTRAN
5.2数组的顺序表示和实现
若二维数组a[n][m]以行序优先存储:
5.3矩阵的压缩存储
矩阵是科学与工程计算问题中常用的数学对象。在高级语 言编制程序时,简单而又自然的方法,就是将一个矩阵描 述为一个二维数组 什么是压缩存储? 若多个数据元素的值都相同,则只分配一个元素值的 存储空间,且零元素不占存储空间 所有二维数组(矩阵)都能压缩吗? 未必,要看矩阵是否具备以上压缩条件。 什么样的矩阵具备以上压缩条件? 一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵 ,稀疏矩阵等。 什么叫稀疏矩阵? 矩阵中非零元素的个数较少(一般小于5%)
a
a[ n 1][1]
若每个元素占L个存储单元,则有: LOC (i, j ) = LOC(0,0) + (m ×i + j)L
aij的存储地址
a00的存储地址 (基地址或基址)
5.2数组的顺序表示和实现
无论规定行优先或列优先,只要知道以下三要素便可随时求 出任一元素的地址(这样数组中任一元素便可随机存取): ①开始结点的存放地址(即基地址) ac1,c2 … ac1,d2 ②维数和每维的上、下界; Amn= … aij … ③每个数组元素所占用的单元数 ad1,c2 … ad1,d2 计算二维数组元素地址的通式: 设一般的二维数组是A[c1..d1, c2..d2],c1、c2不一定是0 则行优先存储时的地址公式为: LOC(aij)=LOC(ac1,c2)+[(i-c1)*(d2-c2+1)+j-c2)]*L
5.1数组的定义
由于数组中各元素具有统一的类型,并且数组元素的下 标一般具有固定的上界和下界;除了结构的初始化和销 毁之外,数组只有存取元素和修改元素值的操作,因此, 数组的处理比其它复杂的结构更为简单。多维数组是向 量的推广。例如,二维数组:
(a11 (a 21 ( ... a m1 (
M ( j, i) A[ j ( j 1) / 2 i 1], i j M (i, j ) A[i(i 1) / 2 j 1], i j
5.3.1特殊矩阵
特殊矩阵压缩存储小结:
只存储上三角/下三角部分; 找出特殊矩阵中特殊元素的分布规律; 把有一定分布规律的、值相同的元素(包括零)压 缩存储在一个存储空间中; 在算法中按公式作一映射即可实现矩阵元素的随机 存取。
5
5.1数组的定义
n维数组的数据类型定义:
n_ARRAY = (D, R)
其中:
数据对象:D = {aj1,j2…jn| ji为数组元素的第i 维下标 , aj1,j2…jn Elemset }
数据关系:R = { R1 ,R2,…. Rn } Ri = {<aj1,j2,…ji…jn , aj1,j2,…ji+1…jn >| aj1,j2,…ji…jn , aj1,j2,…ji+1…jn D } 基本操作:构造数组、销毁数组、读数组元素、写数组元素
)
a12
Amn
a 22 ... am2
可以看成是由一个行向量组成的向量,也可以看成是由 一个列向量组成的向量。
4
(
( ( (
(
) ) )
)
... ... a1n ) ... ... a 2 n ) ... ... ... ) ) ... ... a mn
数据结构
软件学院 2013.9
第5章 数组和广义表
数组的定义
数组的顺序表示和实现
矩阵的压缩存储 广义表的定义 广义表的存储结构
2
数组和广义表:特殊的线性表 元素的值并非原子类型,可以再分解,表中元 素也是一个线性表(即广义的线性表) 所有数据元素仍属同一数据类型 高级语言中的数组是顺序结构; 而本章的数组既可以是顺序的,也可以是链式结 构,用户可根据需要选择
5.2数组的顺序表示和实现
例:一个二维数组A,行下标的范围是1到6,列下标的范 围是0到7,每个数组元素用相邻的6个字节存储,存储器按 字节编址。那么,这个数组的体积是 288 个字节。 答: Volume=m*n*L=(6-1+1)*(7- 0 +1)*6=48*6=288 例:已知二维数组Am,m按行存储的元素地址公式是: Loc(aij)= Loc(a11)+[(i-1)*m+(j-1)]*K , 按列存储的公式是?
• 按对角线映射 A[i - 2] i j 1 A[n i 2], i j M (i, j ) A[2 * n i 2], i j - 1 0, otherwise 14 19 5 8 3
A[3j- 2] i j 1 A[3 j 3], i j 2 4 23 7 9 M (i, j ) A[3 j 4], i j - 1 • 按列优先映射 0, ot herwise
5.3.1特殊矩阵
对称矩阵示例:任意两个城市之间的距离可以用一个 6 ×6 的矩阵来表示。矩阵的第i行和第i列代表第i个城市, distance (i, j ) 代表城市i和城市j之间的距离。
5.3.1特殊矩阵
1、对角矩阵 使用二维数组:空间需要n2*sizeof(T) 压缩存储:只存储对角线上的元素 使用一维数组:空间需要n*sizeof(T) M(i,i) =A[i-1] 1 2 3 4 A M 1 2 0 0 0 2 3
5.3.1特殊矩阵
对角矩阵:所有非0元素都在对角线上,即当i≠j 时有M(i, j) = 0 。 三对角矩阵: | i - j | > 1 时有M(i, j ) = 0 下三角矩阵: i < j 时有M (i, j ) = 0 上三角矩阵: i > j 时有M (i, j ) = 0 对称矩阵: M (i, j ) =M (j, i )
5.3.1特殊矩阵
例、将一个A[1..100,1..100]的三对角矩阵,按行优先存入一 维数组B[1…298]中,A中元素a66,65(即该元素下标i=66, j=65)在B数组中的位置k为 B 。 A、198 B、195 C、197 D、196 例、已知有一维数组A[0…m*n-1],若要对应为 m 行、n 列的 矩阵,则下面的对应关系 A.i=k/n, j=k%m 可将元素A[k](0≤k<m*n)表示 B.i=k/m, j=k%m 成矩阵的第 i 行、第j列的元素(0≤i<m,0≤j<n)。
数组基址 aij之前的行数 总列数,即 第2维长度 aij本行前面的 元素个数 单个元 素长度
二维数组列优先存储的通式为: LOC(aij)=LOC(ac1,c2)+[(j-c2)*(d1-c1+1)+i-c1)]*L
5.2数组的顺序表示和实现
例:设二维数组 A[m][n]按行优先顺序存储,假设A[0][0]存放 位置在 644(10), A[2][2]存放位置在 676(10),每个元素占一个空 间,问A[3][3](10)存放在什么位置?脚注(10)表示10进制。 解:设元素A[i][j]存放在起始地址为Loc ( i, j ) 的存储单元中 ∵ Loc ( 2, 2 ) = Loc ( 0, 0 ) + 2 * n + 2 = 644 + 2 * n + 2 = 676. ∴ n = ( 676 - 2 - 644 ) / 2 = 15 ∴ Loc ( 3, 3 ) = Loc ( 0, 0 ) + 3 * 15 + 3 = 644 + 45 + 3 = 692. 例:设二维数组A[10,20]的每个元素占两个字节, A[0][0]的存 储地址为100,若按行优先顺序存储,则元素A[6,6]的存储地址 为 352 ,按列优先顺序存储,元素A[6,6]的存储地址为 232 。 (6*20+6)*2+100=352 (6*10+6)*2+100=232