数据结构 第5章 数组

合集下载

数据结构第五章 数组与广义表

数据结构第五章 数组与广义表
an-1,n-1
压缩存储方法:只需要存储下三角 (含对角线)上的元素。可节省一 半空间。
可以使用一维数组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中列号
一、三元组顺序表
对于稀疏矩阵,非零元可以用三元组表示, 整个稀疏矩阵可以表示为所有非零元的三元组所 构成的线性表。例如:

《刘大有数据结构》 chapter 5 数组字符串和集合类

《刘大有数据结构》 chapter 5 数组字符串和集合类
Loc(A[i][j])= Loc(A[0][0])+ i *n*C + j*C = Loc(A[0][0])+(i * n + j) *C
再例如三维数组 再例如三维数组D[3][3][4],可以把它看作一维 , 数组 B1[3] = { D[0][3][4],D[1][3][4],D[2][3][4] } , ,
下面我们给出一个 下面我们给出一个Array类的应用例子 类的应用例子. 类的应用例子 例5.1 编写一个函数,要求输入一个整数 , 编写一个函数,要求输入一个整数N, 用动态数组A来存放 来存放2~ 之间所有 之间所有5或 的倍数 的倍数, 用动态数组 来存放 ~N之间所有 或7的倍数, 输出该数组. 输出该数组 说明 : 因为 由用户给出 , 编写程序时无法知 说明:因为N由用户给出 由用户给出, 道需要多大的数组来存放数据, 道需要多大的数组来存放数据,因此采用动态 数组(初始时大小为10) 数组(初始时大小为 ),每当数组满时就调 整数组大小,给它增加10个元素 个元素. 整数组大小,给它增加 个元素
数组在内存中一般是以顺序方式存储的 数组在内存中一般是以顺序方式存储的. 设一维数组 设一维数组A[n]存放在 个连续的存储单元中 , 存放在n个连续的存储单元中 存放在 个连续的存储单元中, 每个数组元素占一个存储单元(不妨设为C个 每个数组元素占一个存储单元 ( 不妨设为 个 连续字节) 如果数组元素A[0]的首地址是 , 的首地址是L, 连续字节). 如果数组元素 的首地址是 则 A[1] 的 首 地 址 是 L+C , A[2] 的 首 地 址 是 L+2C,… …,依次类推,对于 0 ≤ i ≤ n 1 有: , ,依次类推,
B[i]={ A[i][0],A[i][1],…,A[i][n-2],A[i][n-1] } -

数据结构:第5章 数组与广义表1-数组

数据结构:第5章 数组与广义表1-数组

中的元素均为常数。下三角矩阵正好相反,它的主对
数据结构讲义
第5章 数组与广义表
—数组
数组和广义表
数组和广义表可看成是一种特殊的 线性表,其特殊在于,表中的数据 元素本身也是一种线性表。
几乎所有的程序设计语言都有数组 类型。本节重点讲解稀疏矩阵的实 现。
5.1 数组的定义
由于数组中各元素具有统一的类型,并且 数组元素的下标一般具有固定的上界和下 界,因此,数组的处理比其它复杂的结构 更为简单。
nm
aa1221
aa2222
…………....
aam2n2 ………………..
aamm11 aamm22 ………….... aammnn LLoocc(a( iaj)ij=)L=Loco(ca(a111)1+)[+([j(-i1-)1m)n++((i-j1-1)])*]*l l
aa1mn 1 aa2mn2 …………....
其存储形式如图所示:
15137 50800 18926 30251
a00 a10 a 11 a20 a21 a23 ………………..
70613
an-1 0 a n-1 1 a n-1 2 …a n-1 n-1
图 5.1 对称矩阵
在这个下三角矩阵中,第i行恰有i+1个元素,元素总
数为:
n(n+1)/2
5.2 数组的顺序表示和实现
由于计算机的内存结构是一维的,因此用 一维内存来表示多维数组,就必须按某种 次序将数组元素排成一列序列,然后将这 个线性序列存放在存储器中。
又由于对数组一般不做插入和删除操作, 也就是说,数组一旦建立,结构中的元素 个数和元素间的关系就不再发生变化。因 此,一般都是采用顺序存储的方法来表示 数组。

《数据结构与算法》第五章-数组和广义表学习指导材料

《数据结构与算法》第五章-数组和广义表学习指导材料

《数据结构与算法》第五章数组和广义表本章介绍的数组与广义表可视为线性表的推广,其特点是数据元素仍然是一个表。

本章讨论多维数组的逻辑结构和存储结构、特殊矩阵、矩阵的压缩存储、广义表的逻辑结构和存储结构等。

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)所示。

《数据结构——用C语言描述(第二版)》第5章 数组和广义表

《数据结构——用C语言描述(第二版)》第5章  数组和广义表
是指矩阵的下三角(不含对角线)中的元素均为常数C或零的n阶矩阵,下 三角矩阵则与之相反,如图5.3所示。
第五章 数组和广义表
在压缩存储时,矩阵中值相同的元素C可共享一个存储空间,元素 为零则可不必分配空间,而其余的元素有 n(n+1)/2个,因此三角矩阵 可用一维数组M[n×(n+1)/2+1]来存储,其中常数C放在数组的最后一 个下标变量中。
假设A和B矩阵分别用matrix型指针变量a和b表示,矩阵的转置可以 按以下进行:由于B的行是A的列,所以可按照b->data三元组表的次序在 a->data中找到相应的三元组进行转置,即可按a->data的列序转置,所得 到的转置矩阵B的三元组表b->data必定是按行优先存放的。因此,可以对 三元组表a->data从第一行起扫描,找到A的每一列中所有的非零元素,就 可以实现转置。
LOC ( aij ) =LOC ( a00) +(i×n+j) × c 同理可推导出以列为主序优先存储时数据元素a i j 的存储地址,其计算公式 为:
LOC( a i j ) =LOC( a00 ) +( j × n +i ) × c 对于三维数组Am×n×p而言,若以行为主序优先存储时,则其数据元 素aijk的存储地址可为: LOC ( a i j k) =LOC ( a000) +[ i × m×p +j ×p +k] × c 对于一般的二维数组A[c1…d1,c2…d2]而言,此处c1,c2的值不一定是 0,a i j 的地址为: LOC ( a i j ) =LOC ( a c 1 c 2 ) +[ ( i – c 1 )* ( d 2 – c 2 +1) +j – c 2 ] * c

数据结构第五章数组习题

数据结构第五章数组习题

第五章数组习题1、假设以行序为主序存储二维数组A=array[1..100,1..100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=()。

A、808B、818C、1010D、10202、数组A[0..5,0..6]的每个元素占五个字节,将其按列优先次序存储在起始地址为1000的内存单元中,则元素A[5,5]的地址是( )。

A、1175B、1180C、1205D、12103、若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[1..(n(n+1))/2]中,则在B中确定a ij(i<j)的位置k的关系为( )。

A、i*(i-1)/2+jB、j*(j-1)/2+iC、i*(i+1)/2+jD、j*(j+1)/2+i4、对稀疏矩阵进行压缩存储目的是()。

A、便于进行矩阵运算B、便于输入和输出C、节省存储空间D、降低运算的时间复杂度5、已知广义表L=((x,y,z), a, (u,t,w)),从L表中取出原子项t的运算是()。

A、head(tail(tail(L)))B、tail(head(head(tail(L))))C、head(tail(head(tail(L))))D、head(tail(head(tail(tail(L)))))6、已知广义表LS=((a,b,c),(d,e,f)),运用head和tail函数取出LS中原子e的运算是( )。

A、head(tail(LS))B、tail(head(LS))C、head(tail(head(tail(LS)))D、head(tail(tail(head(LS))))7、多维数组之所以有行优先顺序和列优先顺序两种存储方式是因为()。

A、数组的元素处在行和列两个关系中B、数组的元素必须从左到右顺序排列C、数组的元素之间存在次序关系D、数组是多维结构,内存是一维结构8、二维数组M[0..7,0..9]的元素是由4个字符组成的串(每个字符占用1个存储单元),存放M需要存储单元数为()。

第5章演示

第5章演示

对称矩阵的压缩存储
(2)压缩存储: ③数组Sa中的元素与矩阵元素aij存在着一一对应的 关系。 假设数组元素Sa[k]中存放的是矩阵元素aij,则它们 之间的对应关系实质上就是下标值k和i、j之间的对应 关系。
对称矩阵的压缩存储的下标转换公式为:
i(i-1)/2+(j-1),当i>=j k= j(j-1)/2+(i-1),当i<j
稀疏矩阵
3、稀疏矩阵的存储结构 (2)算法:将矩阵M转置为矩阵T
M.data M.data[1] 1 2 12 M.data[2] 1 3 9 M.data[3] 3 M.data[4] 3 M.data[5] 4 M.data[6] 5 M.data[7] 6 M.data[8] 6 1 6 3 -3 14 24 T.data T.data[1] 1 3 -3 T.data[2] 1 6 15
稀疏矩阵的三元组表表示法节约了存储空间, 实现了压缩存储。
稀疏矩阵
注意:
稀疏矩阵 唯一 三元组表
不唯一
解决办法:在三元表的基础上,再引入总行数、 总列数和非零元素总个数即可。
稀疏矩阵
3、稀疏矩阵的存储结构 (1)三元组顺序表 以顺序存储结构表示的三元组表。 三元组类型定义: typedef struct { int i,j; elemtype e; }Triple;
5.4 广义表的定义
二、表示 (1)用关系定义表示; (2)用图表示。 说明: ①广义表是一个多层次结构; ②广义表之间可以共享; ③广义表可以递归定义; ④表头可以为原子或子表;表尾只能为子表; ⑤( )与( ( ) )不同。
5.4 广义表的定义 A =( ) B =(e) C =(a, (b,c,d)) D =(A, B, C) E =(a, E) F =(( ))

数据结构第5章

数据结构第5章

第5章:数组和广义表 1. 了解数组的定义;填空题:1、假设有二维数组A 6×8,每个元素用相邻的6个字节存储,存储器按字节编址。

已知A 的起始存储位置(基地址)为1000,则数组A 的体积(存储量)为 288 B ;末尾元素A 57的第一个字节地址为 1282 。

2、三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的 行下标 、 列下标 和 元素值 。

2. 理解数组的顺序表示方法会计算数组元素顺序存储的地址;填空题:1、已知A 的起始存储位置(基地址)为1000,若按行存储时,元素A 14的第一个字节地址为 (8+4)×6+1000=1072 ;若按列存储时,元素A 47的第一个字节地址为 (6×7+4)×6+1000)=1276 。

(注:数组是从0行0列还是从1行1列计算起呢?由末单元为A 57可知,是从0行0列开始!) 2、设数组a[1…60, 1…70]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为 8950 。

答:不考虑0行0列,利用列优先公式: LOC(a ij )=LOC(a c 1,c 2)+[(j-c 2)*(d 1-c 1+1)+i-c 1)]*L 得:LOC(a 32,58)=2048+[(58-1)*(60-1+1)+32-1]]*2=8950选择题:( A )1、假设有60行70列的二维数组a[1…60, 1…70]以列序为主序顺序存储,其基地址为10000,每个元素占2个存储单元,那么第32行第58列的元素a[32,58]的存储地址为 。

(无第0行第0列元素)A .16902B .16904C .14454D .答案A, B, C 均不对 答:此题(57列×60行+31行)×2字节+10000=16902( B )2、设矩阵A 是一个对称矩阵,为了节省存储,将其下三角部分(如下图所示)按行序存放在一维数组B[ 1, n(n-1)/2 ]中,对下三角部分中任一元素a i,j (i ≤j), 在一维数组B 中下标k 的值是:A .i(i-1)/2+j-1B .i(i-1)/2+jC .i(i+1)/2+j-1D .i(i+1)/2+j3、从供选择的答案中,选出应填入下面叙述 ? 内的最确切的解答,把相应编号写在答卷的对应栏内。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

i 0
j 2
aij 1
i 0
j 2
aij 1
1
2 3 4 5 5
1
0 3 4 5 6
2
3 5 6 7 4
1
2 3 3 4 5 5
1
0 3 5 4 5 6
2
3 5 8 6 7 8
执行:A[i][j]=x 算法如下: int Value(TSMatrix &t,ElemType x,int i,int j) { int k=0,k1; if (i>=t.rows || j>=t.cols) return 0; 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++; //查找列
A[0][1][1][0], A[0][1][1][1], A[1][0][0][0],
A[1][0][0][1], A[1][0][1][0], A[1][0][1][1], A[1][1][0][0], A[1][1][0][1], A[1][1][1][0], A[1][1][1][1]
按列优先的存储次序:
#define MaxSize
typedef struct { int r; int c; ElemType d; } TupNode; typedef struct { int rows;
100
//矩阵中非零元素最多个数
//行号 //列号 //元素值 //三元组定义 //行数值
int cols;
a[i][j] ←→ b[k]
i(i 1) +j 2 j(j 1) +i 2
i≥j
k=
i< j
上三角矩阵:
i * ( 2n i 1) + j – i i≤j时 2
k=
n( n 1) 2
i> j时
下三角矩阵:
i * ( i 1) +j 2
i≥j时
k=
n( n 1) 2
i< j 时
对于二维数组来说 , 由于计算机的存储结构是线性的 , 如 何用线性的存储结构存放二维数组元素就有一个行/列次 序排放问题。
以行序为主序的存储方式:即先存储第1行,然后紧接着 存储第 2 行 , 最后存储第 m 行。此时 , 二维数组的线性排列次 序为: a1,1,a1,2,…,a1,n,a2,1,a2,2,…,a2,n,…,am,1,am,2,…am,n
对一个已知以行序为主序的计算机系统中 ,当二维数组第
一个数据元素a1,1的存储地址LOC(a1,1)和每个数据元素所占用 的存储单元 k 确定后 ,则该二维数组中任一数据元素 ai,j 的存储
地址可由下式确定:
LOC(ai,j)=LOC(a1,1)+[(i-1)*n+(j-1)]*k
其中n为列数。
int nums; } TSMatrix;
//列数值
//非零元素个数 //三元组顺序表定义
TupNode data[MaxSize];
其中,data域中表示的非零元素通常以行序为主序顺序 排列,它是一种下标按行有序的存储结构。 这种有序存储结构可简化大多数矩阵运算算法。 下面的讨论假设data域按行有序存储。
同理可推出在以列序为主序的计算机系统中有: LOC(ai,j)=LOC(a1,1)+[(j-1)*m+(i-1)]*k 其中m为行数。
例5.1 按行优先顺序和按列优先顺序列出四维数
组A[2][2][2][2]所有元素在内存中的存储次序。
解: 按行优先的存储次序: A[0][0][0][0], A[0][0][0][1], A[0][0][1][0], A[0][0][1][1], A[0][1][0][0], A[0][1][0][1],
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++; } return 1;
}
(2)三元组元素赋值 先在三元组t中找到适当的位置k,将k~t.nums个元素后移一位,将 指定元素x插入到t.data[k]处。
0 0 3 0 0 0 0 2 0 0 0 0 1 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 4 0 0 3 0 0 0 0 2 0 0 0 0 1 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 8 4
A[0][0][0][0], A[1][0][0][0], A[0][1][0][0],
A[1][1][0][0], A[0][0][1][0], A[1][0][1][0], A[0][1][1][0], A[1][1][1][0], A[0][0][0][1], A[1][0][0][1], A[0][1][0][1], A[1][1][0][1], A[0][0][1][1], A[1][0][1][1], A[0][1][1][1],
对于一个m行n列的二维数组Am×n,有:
Amn
a1,1 a 2 ,1 ... am,1
a1, 2 a2, 2 ... am , 2
... a1,n ... a2,n ... ... ... am,n
将Am*n简记为A,可以看成是这样的一维数组: A=(a1,a2,…,ai…,am) 其中,ai=(ai,1,ai,2,…,ai,n) (1≤i≤m)。
A[1][1][1][1]
例5.2 对二维数组float a[5][4]计算: (1)数组a中的数组元素数目;
(2)若数组 a的起始地址为 2000,且每个数组元素长度为 32位(即4个字节),数组元素a[3][2]的内存地址。
解:该数组的元素数目共有5*4=20个。 又由于C语言采用行序为主序的存储方式,则有: LOC(a3,2)=LOC(a0,0)+(i*n+j)*k
第5章 数组和稀疏矩阵
5.1 数组 5.2 稀疏矩阵
《数据结构基础》第2章2.5和2.6节 p58-77
5.1.1 数组的基本概念
从逻辑结构上看,数组A是n(n>1)个相同类型数据元 素a1,a2,…,an构成的有限序列,其逻辑表示为: A=(a1,a2,…,an) 其中,ai(1≤i≤n)表示数组A的第i个元素。 一个二维数组可以看作是每个数据元素都是相同类型的 一维数组的一维数组。以此类推,任何多维数组都可以看作 一个线性表,这时线性表中的每个数据元素也是一个线性表。 多维数组是线性表的推广。 推广到d(d≥3)维数组,不妨把它看作一个由d-1维数组 作为数据元素的线性表;或者这样理解,它是一种较复杂的 线性表结构,由简单的数据结构即线性表——辗转合成而 得。。
稀疏矩阵中的每一个非零元素需由一个三元组:
(i, j, ai,j)
唯一确定,稀疏矩阵中的所有非零元素构成三元组线性表。
假设有一个6×7阶稀疏矩阵A(为图示方便,所取的行列 数都很小),A中元素如下图所示。则对应的三元组线性表为: ((0,2,1),(1,1,2),(2,0,3),(3,3,5), (4,4,6),(5,5,7),(5,6,4))
2. 对角矩阵的压缩存储 若一个n阶方阵A满足其所有非零元素都集中在以主对角
线为中心的带状区域中,则称其为n阶对角矩阵。
其主对角线上下方各有b条次对角线,称b为矩阵半带 宽 ,(2b+1) 为矩阵的带宽。对于半带宽为 b(0≤b≤(n-1)/2) 的对
角矩阵,其|i-j|≤b的元素ai,j不为零,其余元素为零。
=2000+(3*4+2)*4=2056
几种特殊矩阵:
(1)对称矩阵
(2)上三角矩阵/下三角矩阵
(3)对角矩阵
它们都是方阵,即行数和列数相同。
1. 对称矩阵的压缩存储 若一个n阶方阵A[n][n]中的元素满足ai,j=aj,i(0≤i,j≤n-1),则 称其为n阶对称矩阵。 由于对称矩阵中的元素关于主对角线对称,因此在存储时
0 0 0 0 6 0
0 0 0 0 0 7
0 0 0 0 0 4
A67
0 0 3 0 0 0
0 2 0 0 0 0
1 0 0 0 0 0
0 0 0 5 0 0
0 0 0 0 6 0
0 0 0 0 8 0 7
0 0 0 0 0 4
可只存储对称矩阵中上三角或下三角中的元素 ,使得对称的
元素共享一个存储空间。这样 ,就可以将n2个元素压缩存储 到个元素的空间中。不失一般性,我们以行序为主序存储其
下三角(包括对角线)的元素。
n2个元素←→ n(n+1)/2个元素
A[0..n-1,0..n-1] ←→ B[0..n(n+1)/2-1]
(1) 从一个二维矩阵创建其三元组表示 以行序方式扫描二维矩阵A,将其非零的元素插入到三元组t 的后面。
i 0 j 2 1 aij 1 2
相关文档
最新文档