《数据结构》数组和广义表

合集下载

数据结构第4章 数组和广义表

数据结构第4章  数组和广义表

第4章数组和广义表【例4-1】二维数组A的每一个元素是由6个字符组成的串,其行下标i=0,1,…,8,列下标j=1,2,…,10。

若A以行为主序存储元素,A[8][5]的物理地址与当A按列为主序存储时的元素()的物理地址相同。

设每个字符占一个字节。

A.A[8][5] B.A[3][10] C.A[5][8] D.A[0][9]解:二维数A是一个9行10列的矩阵,即A[9][10]。

按行存储时,A[8][5]是第85个元素存储的元素。

而按列存储时,第85个存储的元素是A[3][10]。

即正确答案为B。

【例4-2】若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[n(n+1)/2]中,则在B中确定的位置k的关系为()。

A.jii+-2)1(*B.ijj+-2)1(*C.jii++2)1(*D.ijj++2)1(*解:如果a ij按行存储,那么它的前面有i-1行,其有元素个数为:1+2+3+…+(i-1)=i(i-1)/2。

同时它又是所在行的第j列,因此它排列的顺序还得加上j,一维数组B[n(n+1)/2]中的位置k与其下标的关系是:jii+-2)1(*。

因此答案为A。

【例4-3】已知n阶下三角矩阵A,按照压缩存储的思想,可以将其主对角线以下所有元素(包括主对角线上元素)依次存放于一维数组B中。

请写出从第一列开始以列序为主序分配方式时在B中确定元素a ij的存放位置的公式。

解:如果a ij按列存储,那么它的前面有j-1列,共有元素:n+(n-1)+(n-2)+ …+[n-(j-2)]=(j-1)*n-2)1)(2(--jj而它又是所在列的第i行,因此在它前的元素个数还得加上i。

因此它在一维数组B中的存储顺序为:(j-1)*n-2)1)(2(--jj+i【例4-4】已知广义表L=((x,y,z),a,(u,t,w)),从L表中取出的原子项ASCII码最大的运算是()。

数据结构——用C语言描述(第3版)教学课件第5章 数组与广义表

数据结构——用C语言描述(第3版)教学课件第5章 数组与广义表
第5章 数组和广义表
5.1 数组的定义和运算 5.2 数组的顺序存储和实现 5.3 特殊矩阵的压缩存储
5.3.1 三角矩阵 5.3.2 带状矩阵 5.3.3 稀疏矩阵 5.4 广义表 5.5 总结与提高
5.1 数组的定义和运算
数组是一种数据类型。从逻辑结构上看,数组可以 看成是一般线性表的扩充。二维数组可以看成是线 性表的线性表。例如:
Am×n=
a12 a12 ┅
a1j
┅ a1n
a21 a22 ┅
a2j
┅ a2n
┇┇
ai1 ai2 ┅
aij
┇┇
┅ ain
am1 am2 ┅
amj
┅ amn
矩阵Am×n看成n个列向量的线性表,即j=(a1j,a2j, …,amj)
我们还可以将数组Am×n看成另外一个线性表: B=(1,,2,,… ,m),其中i(1≤i ≤m)本身也是一个线性表, 称为行向量,即: I= (ai1,ai2, …,aij ,…,ain)。
Loc[j1,j2,j3]=Loc[c1,c2,c3]+ α1*(j1-c1)+ α2*(j2-c2)+ α3(j3-c3)
=Loc[c1,c2,c3]+ Σαi*(ji-ci) (1≤i≤3)
由公式可知Loc[j1,j2,j3]与j1,j2,j3呈线性关系。 对于n维数组A(c1:d1,c2:d2,…,cn,dn),我们只要把上式推 广,就可以容易地得到n维数组中任意元素aj1j2…jn的存储 地址的计算公式。
疏矩阵。
0 12 9 0 0 0 0
0 0 3 0 0 15
0 0 0 00 0 0
12 0 0 0 18 0
M6×7= -3 0 0 0 0 14 0

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

数据结构第五章 数组与广义表
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中列号
一、三元组顺序表
对于稀疏矩阵,非零元可以用三元组表示, 整个稀疏矩阵可以表示为所有非零元的三元组所 构成的线性表。例如:

《数据结构》习题集:第5章

《数据结构》习题集:第5章

第5章数组与广义表一、选择题1.在以下讲述中,正确的是(B )。

A、线性表的线性存储结构优于链表存储结构B、二维数组是其数据元素为线性表的线性表C、栈的操作方式是先进先出D、队列的操作方式是先进后出2.若采用三元组压缩技术存储稀疏矩阵,只要把每个元素的行下标和列下标互换,就完成了对该矩阵的转置运算,这种观点(A )。

A、正确B、错误3.二维数组SA 中,每个元素的长度为3 个字节,行下标I 从0 到7,列下标J 从0 到9,从首地址SA 开始连续存放在存储器内,该数组按列存放时,元素A[4][7]的起始地址为(B)。

A、SA+141B、SA+180C、SA+222D、SA+2254.数组SA 中,每个元素的长度为3 个字节,行下标I 从0 到7,列下标J 从0 到9,从首地址SA 开始连续存放在存储器内,存放该数组至少需要的字节数是( C )。

A、80B、100C、240D、2705.常对数组进行的两种基本操作是(B )。

A、建立与删除B、索引和修改C、查找和修改D、查找和索引6.将一个A[15][15]的下三角矩阵(第一个元素为A[0][0]),按行优先存入一维数组B[120]中,A 中元素A[6][5]在B 数组中的位置K 为( B )。

A、19B、26C、21D、157.若广义表A 满足Head(A)=Tail(A),则A 为(B )。

A、()B、(())C、((),())D、((),(),())8.广义表((a),a)的表头是( C ),表尾是(C )。

A、aB、bC、(a)D、((a))9.广义表((a,b),c,d)的表头是( C ),表尾是(D )。

A、aB、bC、(a,b)D、(c,d)10.广义表((a))的表头是( B ),表尾是(C )。

A、aB、(a)C、()D、((a))11.广义表(a,b,c,d)的表头是(A ),表尾是(D )。

A、aB、(a)C、(a,b)D、(b,c,d)12.广义表((a,b,c,d))的表头是(C ),表尾是(B )。

数据结构:第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)所示。

数据结构(数组和广义表)习题与答案

数据结构(数组和广义表)习题与答案

1、以行序优先顺序存储数组A[5][5];假定A[0][0]的地址为1000, 每个元素占4个字节,下标变量A[4][3]的地址是____。

A.1069B.1092C.1023D.1046正确答案:B2、数组a[1..6][1..5] (无0行0列)以列序优先顺序存储,第一个元素a[1][1]的地址为1000,每个元素占2个存储单元,则a[3][4]的地址是____。

A.1040B.1026C.1046D.1038正确答案:A3、设有一个5行4列的矩阵A,采用行序优先存储方式,A[0][0]为第一个元素,其存储地址为1000,A[2][2]的地址为1040,则A[3][0]的地址为_________。

A.1048B.1024C.1096D.1060正确答案:A4、设有一个10行10列的矩阵A,采用行序优先存储方式,存储全部数据需要400个字节的空间。

如果A[0][0]为第一个元素,其存储地址为1000,则A[3][6]的地址为_________。

A.1036B.1144C.1014D.10565、设有一个10行10列的矩阵A,采用行序优先存储方式。

如果A[0][0]为第一个元素,其存储地址为1000,A[2][3]的存储地址为1069,则存储一个元素需要的单元数是_________。

A.4B.1C.2D.3正确答案:D6、不能够对数据元素进行随机访问的物理结构是_________。

A.三元组顺序表B.对称矩阵的压缩存储C.三对角矩阵的压缩存储D.数组的顺序存储正确答案:A7、对特殊矩阵采用压缩存储的目的主要是_________。

A.表达变得简单B.去掉矩阵中的多余元素C.对矩阵元素的存储变得简单D.减少不必要的存储空间正确答案:D8、对n*n的对称矩阵进行压缩存储,需要保存的数据元素的个数是_________。

A.nB.n(n+1)/2C.n2D.n(n+1)9、设10*10的对称矩阵下三角保存SA[1..55]中,其中A[1][1]保存在SA[1]中,A[5][3] 保存在SA[k]中,这里k等于_________。

数据结构第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、从供选择的答案中,选出应填入下面叙述 ? 内的最确切的解答,把相应编号写在答卷的对应栏内。

数据结构数组与广义表知识点总结

数据结构数组与广义表知识点总结

数据结构数组与广义表知识点总结数组是一种线性数据结构,可以存储多个相同类型的元素。

它的特点是元素的大小固定,并且在内存中是连续存储的。

数组的访问方式是通过下标来访问,下标从0开始。

数组可以在编程中应用于各种情况,比如存储一组数字、一组字符串等。

广义表是一种扩展的线性数据结构,可以存储不同类型的元素。

它由元素和表构成,其中表可以是空表、原子或子表。

广义表可以递归定义,即子表可以包含更多的子表。

广义表的访问方式是通过递归来访问,可以对表的元素进行遍历和操作。

在数据结构中,数组和广义表都有自己的特点和用途,下面对它们的知识点进行总结:1.数组的特点及应用:-数组是一种线性数据结构,可以存储多个相同类型的元素。

-数组的内存分配是连续的,可以通过下标来访问元素。

-数组的大小固定,一旦定义后不能改变。

-数组的访问速度快,可以通过下标直接访问元素。

-数组适合用于存储一组相同类型的数据,比如一组数字、一组字符串等。

-数组的应用场景包括但不限于:排序算法、查找算法、图像处理、矩阵运算等。

2.数组的操作和常用算法:-初始化:可以直接赋值或使用循环初始化数组。

-访问元素:通过下标访问元素,下标从0开始。

-修改元素:直接通过下标修改元素的值。

-插入元素:需要移动插入位置之后的元素。

-删除元素:需要移动删除位置之后的元素。

-查找元素:可以使用线性查找或二分查找等算法。

-排序算法:比如冒泡排序、选择排序、插入排序等。

-数组还有一些常用的属性和方法,比如长度、最大值、最小值等。

3.广义表的特点及应用:-广义表是一种扩展的线性数据结构,可以存储不同类型的元素。

-广义表由元素和表构成,表可以是空表、原子或子表。

-广义表可以递归定义,即子表可以包含更多的子表。

-广义表的访问方式是通过递归遍历和操作。

-广义表适合存储一组不同类型的数据,比如存储学生信息、函数调用栈等。

-广义表的应用场景包括但不限于:函数式编程、树的表示、图的表示等。

数据结构-串、数组和广义表-实验

数据结构-串、数组和广义表-实验

数据结构-串、数组和⼴义表-实验实验四串、数组和⼴义表⼀、⽬的和要求1. 掌握串、数组和⼴义表的逻辑结构定义和各种存储结构的实现。

2. 熟练运⽤串、数组和⼴义表的的各种存储结构以及各种基本操作。

3. 根据实际问题的需要,选择串、数组和⼴义表适合的存储结构解决问题。

⼆、实验环境1.WindowsXP操作系统;2.DEV C++、Visual C++6.0语⾔环境;三、实验内容(⼀)验证性实验(第1、3题⼀组;第2、4题为另⼀组,每个同学选择⼀组完成。

每个⼩题⼀个⽂件夹,所有⽂件夹打在⼀个包中,⽂件名:“学号”+“姓名”,例如: 13131000张三.rar 。

提交码为2014DS4,截⽌时间:2014年12⽉30⽇12:00时。

)1.KMP算法的验证(1)设计测试⽤例,对教材介绍的模式匹配算法进⾏验证,把运⾏结果截屏保存。

(2)修改KMP算法中求失效值的函数,解决原算法中的⽆效匹配问题,提⾼匹配效率。

2.三元组顺序表的验证(1)设计测试⽤例,对三元组顺序表进⾏验证,把运⾏结果截屏保存。

(2)重载加法运算符,实现两个矩阵的加法运算。

3.⼗字链表的验证(1)设计测试⽤例,对⼗字链表进⾏验证,把运⾏结果截屏保存。

(2)增加成员函数Transpose(),实现矩阵的转置运算。

4.⼴义链表的验证(1)设计测试⽤例,对⼴义链表进⾏验证,把运⾏结果截屏保存。

(2)增加成员函数reversal(),实现⼴义表的转置运算。

(⼆)设计性实验(⼩组完成)5.串的链式存储参照教材中串的顺序存储的类String,设计并实现串的链式存储的类LinkString(简称链串)。

在链串中字符串的信息存储在⼀个带头结点的单链表中。

如图1所⽰是字符串“ABCDEF”的链式存储结构⽰意图。

基本要求:完成链串的定义(函数成员与顺序存储的类String类似)和实现,并完成串的相关函数在串类上的实现。

选做内容:为了提⾼存储密度,考虑在链表的⼀个结点中存放多个字符(例如,放4个字符)。

数据结构第五章

数据结构第五章

5.3.1 特殊矩阵
是指非零元素或零元素的分布有一定规律的矩阵。
1、对称矩阵 在一个n阶方阵A中,若元素满足下述性质: aij = aji 0≦i,j≦n-1 则称A为对称矩阵。
对称矩阵中的元素关于主对角线对称,故只 要存储矩阵中上三角或下三角中的元素,这样, 能节约近一半的存储空间。

2013-7-25 第4章 18
5.3 矩阵的压缩存储

在科学与工程计算问题中,矩阵是一种常用 的数学对象,在高级语言编制程序时,常将 一个矩阵描述为一个二维数组。 当矩阵中的非零元素呈某种规律分布或者矩 阵中出现大量的零元素的情况下,会占用许 多单元去存储重复的非零元素或零元素,这 对高阶矩阵会造成极大的浪费。 为了节省存储空间,我们可以对这类矩阵进 行压缩存储:
5.2 数组的顺序表示和实现 由于计算机的内存结构是一维的, 因此用一维内存来表示多维数组,就必 须按某种次序将数组元素排成一列序列 ,然后将这个线性序列存放在存储器中 。 又由于对数组一般不做插入和删除 操作,也就是说,数组一旦建立,结构 中的元素个数和元素间的关系就不再发 生变化。因此,一般都是采用顺序存储 的方法来表示数组。
即为多个相同的非零元素只分配一个存储空间; 对零元素不分配空间。


课堂讨论: 1. 什么是压缩存储? 若多个数据元素的值都相同,则只分配一个元素值的 存储空间,且零元素不占存储空间。 2. 所有二维数组(矩阵)都能压缩吗? 未必,要看矩阵是否具备以上压缩条件。 3. 什么样的矩阵具备以上压缩条件? 一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵, 稀疏矩阵等。 4. 什么叫稀疏矩阵? 矩阵中非零元素的个数较少(一般小于5%)
通常有两种顺序存储方式:
⑴行优先顺序——将数组元素按行排列,第i+1个行 向量紧接在第i个行向量后面。以二维数组为例,按 行优先顺序存储的线性序列为: a11,a12,…,a1n,a21,a22,…a2n,……,am1,am2,…,amn 在PASCAL、C语言中,数组就是按行优先顺序存 储的。 ⑵列优先顺序——将数组元素按列向量排列,第j+1 个列向量紧接在第j个列向量之后,A的m*n个元素按 列优先顺序存储的线性序列为: a11,a21,…,am1,a12,a22,…am2,……,an1,an2,…,anm 在FORTRAN语言中,数组就是按列优先顺序存储的。

数据结构复习数组和广义表

数据结构复习数组和广义表

原子结点 tag=0 atom
例5-2:A=(( ),(e),(a,(b,c,0 +(4*10+5)*2=100+45*2 =190
2、特殊矩阵压缩存储存储及压缩时的下标变换
(1)对称矩阵和上(或下)三角矩阵的压缩存储。
例:下三角矩阵的存储,按行主序方式。
k=i(i+1)/2+j 当i>=j时
k=
0
当i<j时
a[i][j] 在一维数组s[k] 中(i>=j)或为0(i<j)。
2、广义表与线性表的区别
线性表(a1,a2,……,an)中每个元素都具有相同的类型, 有两种存储结构:顺序表和链表。
广义表(d1,d2,……,dn)中每个元素可以是原子,也可以 是子表。可以将广义表看作是线性表的推广。由于原子和子 表的类型不同,所以只能用链式存储结构。
3、广义表的链式存储结构
表结点 tag=1 hp tp
0 12 9 0 0 0
M=
0 0 0 000
-3 0 0 0 0 14
0 0 24 0 0 0
13 9 3 1 -3 3 6 14 4 3 24
二、广义表
1、广义表的定义
广义表 ls=(d1,d2,……,dn)。其中每个元素可以是原子, 也可以是子表。 称d1为表头,d2,……,dn为表尾。 n: 表示广义表的长度,括号层数表示广义表的深度。
数据结构复习 (数组和广义表)
第5章 数组和广义表
一、数组 1、数组的顺序存储方式和地址计算方法
数组的存储方式有:
(1)行优先存储方式 (2) 列优先存储方式 例5-1 二维数组 int a[10][10], 以行优先存储, 第1 个元素 的首址是100, 每个元素的长度为2,求A[4][5]的存储首址。

数据结构(C)严蔚敏(数组与广义表)PPT课件

数据结构(C)严蔚敏(数组与广义表)PPT课件

a00
Am×n
=
a10 ...
am-1,0
a01 a11 ...
am-1,1
a02 a12 ...
am-1,2
... a0,n-1
...
a1,n-1
... ...
... am-1,n-1
Data Structure
03.12.2020
Page 5
按行序为主序存放
0
1
n-1
Am×n
=
a00 a10 ...
a00
Am×n
=
a10 ...
am-1,0
a01 a11 ...
am-1,1
a02 a12 ...
am-1,2
... a0,n-1
...
a1,n-1
... ...
... am-1,n-1
列向量
a00
Am×n
=
a10 ...
am-1,0
a01 a11 ...
am-1,1
a02 a12 ...
初始条件:A 是 n 维数组,e 为元素变量,随后是 n 个下标值。 操作结果:若各下标不超界,则e赋值为所指定的A的元素值,并返回OK。
Assign(&A, e, index1, ..., indexn)
初始条件:A 是 n 维数组,e 为元素变量,随后是 n 个下标值。 操作结果:若下标不超界,则将 e 的值赋给A中指定下标的元素。
a00 a10 ……. am-1,1 a01 a11 …….. am-1,1 ………. a0,n-1 a1,n-1 …….. am-1 ,n-1
Page 7
按行序为主序存放
0
Am×n

数据结构课后习题答案第五章数组与广义表

数据结构课后习题答案第五章数组与广义表

第五章数组与广义表一、假设有二维数组A6*8,每个元素用相邻的6个字节存储,存储器按字节编址。

已知A的起始存储位置(基地址)为1000。

计算:1、数组A的体积(即存储量);2、数组A的最后一个元素a57的第一个字节的地址;3、按行存储时,元素a14的第一个字节的地址;4、按列存储时,元素a47的第一个字节的地址;答案:1、(6*8)*6=2882、loc(a57)=1000+(5*8+7)*6=1282或=1000+(288-6)=12823、loc(a14)=1000+(1*8+4)*6=10724、loc(a47)=1000+(7*6+4)*6=1276二、假设按低下标(行优先)优先存储整数数组A9*3*5*8时第一个元素的字节地址是100,每个整数占四个字节。

问下列元素的存储地址是什么?(1)a0000(2)a1111(3)a3125 (4)a8247答案:(1)100(2)loc(a1111)=100+(1*3*5*8+1*5*8+1*8+1)*4=776(3) loc(a3125)=100+(3*3*5*8+1*5*8+2*8+5)*4=1784(4) loc(a8247)=100+(8*3*5*8+2*5*8+4*8+7)*4=4416五、设有一个上三角矩阵(aij)n*n,将其上三角元素逐行存于数组B[m]中,(m 充分大),使得B[k]=aij且k=f1(i)+f2(j)+c。

试推导出函数f1,f2和常数C(要求f1和f2中不含常数项)。

答:K=n+(n-1)+(n-2)+…..+(n-(i-1)+1)+j-i=(i-1)(n+(n-i+2))/2+j-i所以f1(i)=(n+1/2)i-1/2i2f2(j)=jc=-(n+1)九、已知A为稀疏矩阵,试从空间和时间角度比较采用两种不同的存储结构(二维数组和三元组表)完成∑aii运算的优缺点。

(对角线求和)解:1、二维数组For(i=1;i<=n;i++)S=s+a[i][i];时间复杂度:O(n)2、for(i=1;i<=m.tu;i++)If(a.data[k].i==a.data[k].j) s=s+a.data[k].value;时间复杂度:O(n2)二十一、当稀疏矩阵A和B均以三元组表作为存储结构时,试写出矩阵相加的算法,其结果存放在三元组表C中。

数据结构数组和广义表

数据结构数组和广义表

数据结构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)数组地每个数据元素都与一组唯一地下标值对应。

数据结构05数组和广义表11

数据结构05数组和广义表11

2021/11/8
12
设有m×n二维数组Amn,下面我们看按元素的下标求其 地址的计算:
以“行为主序”的分配为例:设数组的基址为LOC(a11), 每个数组元素占据l个地址单元,那么aij 的物理地址可用一 线性寻址函数计算:
LOC(aij) = LOC(a11) + ( (i-1)*n + j-1 ) * l 在C语言中,数组中每一维的下界定义为0,则:
(1) 取值操作:给定一组下标,读其对应的数据元素。
(2) 赋值操作:给定一组下标,存储或修改与其相对应的
数据元素。
我们着重研究二维和三维数组,因为它们的应用是广泛的,
尤其是二维数组。
2021/11/8
9
5.1.3 数组的存储结构
• 通常,数组在内存中被映象为向量,即用向量作为数组的 一种存储结构,这是因为内存的地址空间是一维的,数组的行 列固定后,通过一个映象函数,则可根据数组元素的下标得到 它的存储地址。
• 任一数据元素的存储地址可由公式算出:
Loc(a i,j)=loc(a 0,0)+(i*n+j)*L
– 以列序为主序的顺序存储
• 在以列序为主序的存储方式中,数组元素按列向量排列, 即第j+1个列向量紧接在第j个列向量之后, 把所有数组 元素顺序存放在一块连续的存储单元中。
• 任一数据元素的存储地址可由公式算出
–Loc(a i,j)=loc(a c1,c2)+[(j-c1)*(d1-c1+1)+(i-c1)]*L
2021/11/8
8
5.1.2 数组的基本操作
数组一旦被定义,它的维数和维界就不再改变。因此,除了 结构的初始化和销毁之外,数组的基本操作一般不会含有元素 的插入或删除等操作,数组只有访问数组元素和修改元素值的 操作。

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

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

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)以行序为主序(行优先,先行后列):先存储行号较小 的元素,行号相同者先存储列号较小的元素;

考研《数据结构》考试大纲

考研《数据结构》考试大纲

理工大学2020年硕士学位研究生招生考试业务课考试大纲考试科目:数据结构代码:991考试的总体要求考查学生对数据的逻辑结构和物理结构的基本概念的掌握,对基本的数据结构和算法的掌握;考查学生利用基本数据结构和算法,使用C语言来解决实际科学和理论问题的思想和能力。

基本内容一、线性表1.线性表的概念及特点2.线性表的逻辑结构3.线性表的顺序及链式存储结构4.相关的各种基本运算二、栈和队列1.栈的概念、特点及存储结构2.栈的基本运算3.栈的应用4.队列的概念、特点及存储结构5.链队列、循环队列6.队列的应用及基本运算三、数组和广义表1.数组的顺序存储结构(二维及三维数组的元素地址计算)2.稀疏矩阵的压缩存储结构(三元组表、十字链表)四、树和二叉树1.二叉树的定义、性质及存储结构2.遍历二叉树和线索二叉树3.二叉树的应用五、图1.图的定义及存储结构(邻接矩阵表示和邻接表表示。

)2.图的遍历3.最小生成树4.拓扑排序六、查找1.静态表查找2.动态表查找(二叉排序树、平衡二叉树、B-树和B+树)3.哈希表的构造、哈希表的查找及分析、处理哈希冲突的方法七、内部排序1.插入排序、快速排序、选择排序、归并排序、基数排序等内部排序的特点与算法,各类排序方法的比较,时、空复杂度分析2.相关排序的应用考试题型:选择题(15%)、填空题(20%)、判断题(10%)、应用题(35%)、算法设计题(20%);其中算法设计题将着重考查学生使用C语言编程解决实际问题的能力,需要有一定的实际编程基础,而不是只会解书上的习题。

数据结构讲义第5章-数组和广义表

数据结构讲义第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

《数据结构》数组和广义表 (2)

《数据结构》数组和广义表  (2)
2
顺序存储方式:按低地址优先(或高地址优先)顺序存入一维 数组。 (难点是多维数组与一维数组的地址映射关系)
补充:
链式存储方式:用带行指针向量的单链表来表示。 行指针向量
a11
… …
a12

a1n ^
am1
^
am2

amn ^
注:数组的运算参见下一节实例(稀疏矩阵的转置)
3
5.3 矩阵的压缩存储
(( 1,2,12) ,(1,3,9), (3,1,-3), (3,5,14),
(4,3,24), (5,2,18) ,(6,1,15), (6,4,-7))
6
法2:用三元组矩阵表示:
i
j
value
0
6
6
8
1
1
2
12
2
1
3
9
3
3
1
-3
4
3
5
14
5
4
3
24
6
5
2
18
7
6
1
15
8
6
4
-7
0 12 9 0 0 0 0 0 0000 -3 0 0 0 14 0 0 0 24 0 0 0 0 18 0 0 0 0 15 0 0 -7 0 0
0 0 –3 0 0 15 12 0 0 0 18 0
9 0 0 24 0 0 T
0 0 0 0 0 -7 0 0 14 0 0 0 0 0 0 0 00
(1, 3, -3) (1, 6, 15) (2, 1, 12) (2, 5, 18) (3, 1, 9) (3, 4, 24) (4, 6, -7) (5, 3, 14)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
按行序为主序(row major order)。首先,存放数组的 第一行,然后,按顺序存放数组的各行;
按列序为主序(column major order)。首先,存放数组 的第一列,然后,按顺序存放数组的各列,
如图5.2所示。大多数程序设计语言是按行主序来排列 数组元素的,但列主序也是常见的。
(a)二维数组
k
i(i j(
1) j 2 j 1)
i
2
i j i j
存储示意:
对于任意给出的数组下标(i,j),均可以在sa[]中找到 矩阵元素aij,反之,对所有的k=1,2,…,n(n+1)/2,都 能确定sa[k]中的矩阵元素在矩阵中的位置(i,j)。由 此,称sa[n(n+1)/2]为n阶对称矩阵A的压缩存储,如 图5.3所示。
αj =(a0j ,a1j ,a2j ,…,am-1j) 或者αi 是一个行向量的线性表:
αi =(ai0 ,ai1 ,ai2 ,…,ain-1) 这种定义二维数组的方法也可以推广到n维数组,即认 为n维数组是一个线性表,它的每一个数据元素是一个n-1 维数组。
在数组结构最常用的操作:给定数组的下标i,对相应 元素ai作取数、赋值的操作,操作方法根据其存储结构决 定。
(b)行序
(c)列序
图5.2 二维数组的两种存储方式
数组的顺序存储方式,给对数组元素的随机存取带来
方便。因为,数组是同类型数据元素的集合,所以,每一 个数据元素所占用的内存空间的单元数是相同的,故只要 给出首地址,可以使用统一的地址公式,求出数组中任意 元素的地址。这里以二维数组的行主序为例,讨论数组元 素的地址计算方法。 二维数组aij(m×n)
R={ROW,COL}是数据元素上关系的集合。 ROW={<aij,aij+1>|0≤i≤m-1,0≤j≤n-2}每一行上的列关系。 COL={<aij,ai+1j>|0≤i≤m-2,0≤j≤n-1}每一个列上的行关 系。 行列关系跟线性表已经大不相同了,见图5.1所示。
a01 a02 … a0n-1
5.3.1 特殊矩阵
a.对称矩阵 定义:若有一个n阶矩阵A中的元素满足下述性质
aij=aji 1≤i,j≤n 则称为n阶对称矩阵。对称矩阵可以只给每一对对称 元素分配一个存储空间,则可将n×n的二维矩阵,压 缩存储到n(n+1)/2个元的空间中。在这里讨论以行序 为主序存储其下三角(包括对角线)中的对称矩阵元素。 假设以一维数组s[n(n+1)/2]作为n阶对称矩阵A的存储 结构,数组元素s[k]于矩阵元素aij之间转换公式如下。
可将概念依次类推,可以写出n维数组地址计算方法。
5.3 矩阵的压缩存储
在工程应用中,矩阵有着重要的作用。许 多实际问题的解决需要大量数据的综合计算, 而这些大量数据之间总是表现出二维数组的逻 辑结构。而这种二维数组结构在数学上称为矩 阵。
为了使矩阵的各种运算能有效地进行,必 须在算法的空间和时间复杂度上下功夫。首先 我们考虑如何减少空间复杂度,即找一种高效 的存储方法,再在相应的存储结构上找高效的 算法。许多矩阵的数据分布是有特征的,那就 要利用这种特征,尽量减少数据的存储量。
a11 a12 … a1n-1
… ………
am-11 am-12 … am-1n-1
图5.1 二维数组元素关系
二维数组中的每一个元素aij都受到两个关系的约束: ROW(行关系)和COL(列关系)。aij+1是aij在行关系中的直 接后续元素;而ai+1j是aij在列关系中的直接后续元素。和 线性表一样,所有的数据元素属于同一数据类型。每个数 据元素对应于一组下标(i,j)。将这个概念依次类推,可以
算法5.2 压缩存储的对称矩阵中的赋值算法。 void Matrix_Set(int s[],int i,int j,int value)
第5章 数组和广义表
5.1 数组的定义与运算 5.2 数组的顺序存储结构 5.3 矩阵的压缩存储 5.4 广义表 习题
5.1 数组的定义与运算
数组定义:类似于线性表,一个两维数组的逻辑结构 可形式地表示为
2_Array=(D,R) 其中D={aij|i=0,1,…,m-1,j=0,1,…,n-1},aij是同类型数据元 素的集合。
写出n维数组的逻辑结构,但最常用的是二维数组。
也可以从另一个角度来定义二维数组,即将二维数组
看成这样一个线性表:它的每一个数据元素是一个线性表 (一维数组)。例如,图5.1所示的是一个二维数组,以m行n 列的矩阵形式表示。它可以看成是一个线性表:
A =(α0 ,α1 ,α2 ,α3 ,…,αP) (p=m-1或n-1) 其中每一个数据元素αj 是一个列向量的线性表
a00
a10Biblioteka a11 …k= 1 2 3
an1 …
an-1n-1 n(n+1)/2-1
图5.3 对称矩阵的压缩存储
运算
算法5.1 压缩存储的对称矩阵中的取值算法。
/* 取对称矩阵s中第i行第j列的元素 */
int Matrix_Get(int s[],int i,int j) { if(i>=j) return(s[i*(i+1)/2+j]); else return(s[j*(j+1)/2+i]); }
LOC(i,j)=LOC(0,0)+(i×n+j)×s (0≤i≤m-1, 0≤j≤n-1) 其中,s是每个数据元素所占存储单元的个数。
可将二维数组的元素想象为一个一维数组,大小为p, 则推出三维数组的地址计算方法。
三维数组aijk(m×n×p): LOC(i,j,k)=LOC(0,0,0)+(i×n+j)×s×p+k×s LOC(i,j,k)=LOC(0,0,0)+(i×n×p+j×p+k)×s (0≤i≤m-1, 0≤j≤n-1,0≤k≤p-1)
5.2 数组的顺序存储结构
由于数组一般不作插入或删除操作,也就是说,一旦 建立了数组,则结构中的数据元素个数和元素之间的关系 就不再发生变动,因此,采用顺序存储结构表示数组。
顺序结构即是用一组连续的存储单元来存放数组结构。 内存地址是一维的,而数组结构可能是多维的。如何将多 维的数组挤入一维的地址中,就有了策略问题:
相关文档
最新文档