数组和广义表

合集下载

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

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

数据结构串、数组和广义表知识点总结

数据结构串、数组和广义表知识点总结

数据结构串、数组和广义表知识点总结
数据结构是计算机科学中研究数据如何组织、存储、管理和操作的学科。

三个常见的数据结构串、数组和广义表都是用于存储和操作数据的。

1. 串:
- 串是由0个或多个字符组成的有限序列。

它是一维数组的特例。

- 串的操作包括插入、删除、修改和查找等常见操作。

- 串可以通过数组、链表或动态分配的内存来实现。

2. 数组:
- 数组是一种线性数据结构,它由一组连续的内存空间组成,
存储相同类型的数据。

- 数组的操作包括插入、删除、修改和查找等常见操作。

- 数组的访问时间复杂度为O(1),但插入和删除的时间复杂度
较高。

3. 广义表:
- 广义表是由若干元素组成的有序集合,每个元素可以是原子
或者是一个广义表。

- 广义表可以通过链表来实现,每个节点包含两个指针,一个
指向元素,一个指向下一个节点。

- 广义表的操作包括插入、删除、修改和查找等常见操作。

- 广义表可以表示任意层次的嵌套结构,具有灵活性和扩展性。

总结:
- 串、数组和广义表都是常见的数据结构,用于存储和操作数据。

- 串是字符的有限序列,可以通过数组或链表来实现。

- 数组是一维线性数据结构,存储相同类型的数据,具有常数时间复杂度的访问操作。

- 广义表是由元素组成的有序集合,可以通过链表来实现,能够表示任意层次的嵌套结构。

第五章 数组和广义表

第五章 数组和广义表

第五章数组和广义表一.选择题1.在二维数组A 中引用A[i,j]的时间_________。

A.与i、j的大小有关B.与i、j的大小无关C.与i的大小有关,与j的大小无关D.与i的大小无关,与j的大小有关2.在稀疏矩阵的带行指针向量的链接存储中,每一行单链表中的结点都具有相同的________。

A.行号 B.列号 C.元素值 D.地址3.二维数组A 按行顺序存储,其中每个元素占1个存储单元。

若 A[1][1]的存储地址为420, A[3][3]的存储地址为446,则A[5][5]的存储地址为_______。

A.470 B.471 C.472 D. 4734.在稀疏矩阵的十字链接存储中,每个列单链表中的结点都具有相同的_____。

A.行号 B.列号 C.元素值 D.地址5.下面的说法中,不正确的是________。

A.对称矩阵中只须存放包括主对角线元素在内的下(或上)三角部分的元素即可B.对角矩阵中只须存放的非零元素即可C.稀疏矩阵中值为零的元素较多,因此可以采用三元组表方法存储D.稀疏矩阵中大量值为零的元素分布有规律,因此可以采用三元组表方法存储6.对一些特殊矩阵采用压缩存储的目的主要是为了________。

A.表达变得简单 B.对矩阵元素的存取变得简单C.去掉矩阵中的多余元素 D.减少不必要的存储空间的开销7.若将n 阶对称矩阵 A 按照行序为主序方式将包括主对角线元素在内的下三角形的所有元素依次存放在一个一维数组 B 中,则该对称矩阵在 B 中占用了________个数组元素。

A.n2 B.n*(n-1) C.n*(n+1)/2 D.n*(n-1)8. 稀疏矩阵的三元组顺序表表示的一个三元组中不包括________。

A. 行号B.列号C.元素值D.元素总数9.稀疏矩阵一般的压缩存储方法有两种,即________。

A.二维数组和三维数组 B.三元组和散列C. 三元组和十字链表 D.散列和十字链表10.有一个 10 阶对称矩阵 A,采用压缩存储方式(以行序为主存储,且A[0 Ⅱ0]=1),则A[8][5]的地址是________。

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

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

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

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

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) 矩阵Am×n看成n个列向量的线性表
2) 每个列向量:αj=(a1j, a2j, a3j, …, amj )(0≤j ≤n-1) 3) ai,j在列方向上有一个前驱ai-1,j, 有一个后继ai+1,j
• 或者,可以看成是一个线性表:A=(a0,a1,……,am-1)
• 其中每个数据元素aj是一个行向量形式的线性表: A
}ADT Array
• • • N维数组含有元素的个数: b1 × b2 × … × bn 第i维的长度: bi 元素下标(j1 , j2, … ,jn),0 ≤ ji ≤ bi -1
5.1 数组示例:
数组的定义
a00 a01 …….. a10 a11 …….. am-1,n-1 …….. a0,n-1 a1,n-1 am-1,n-1
1 2 … i-1 aij
*(A.base + off) = e;
return OK; }
5.3 矩阵的压缩存储 特殊矩阵和稀疏矩阵
特殊矩阵:矩阵中很多值相同的元素并且它们的分布 有一定的规律。 稀疏矩阵:矩阵中有很多零元素。 压缩存储的基本思想是: ⑴ 为多个值相同的元素只分配一个存储空间;
⑵ 对零元素不分配存储空间。
5.3.1 3 6 4 7 8
普通高等教育“十一五”国家级规划教材
设一个系统中二维数组采用行序为主的存储方式,已知二 维数组a[10][8]中每个元素占用四个存储单元,且第一 个数据元素地址是1000,求a[4][5]的存储地址?
解: Loc(a[4][5])=Loc(a[0][0])+(i*m+j)*k =1000+(4*8+5)*4 =1148
L:每个数据元素占用的存储单元

数据结构教程李春葆课后答案第6章数组和广义表

数据结构教程李春葆课后答案第6章数组和广义表

3. 如果某个一维数组 A 的元素个数 n 很大,存在大量重复的元素,且所有元素值相同 的元素紧挨在一起,请设计一种压缩存储方式使得存储空间更节省。
答:设数组的元素类型为 ElemType,采用一种结构体数组 B 来实现压缩存储,该结构 体数组的元素类型如下:
struct { ElemType data;
解:从二维数组 B 的右上角的元素开始比较。每次比较有三种可能的结果:若相等, 则比较结束;若 x 大于右上角元素,则可断定二维数组的最上面一行肯定没有与 x 相等的 数据,下次比较时搜索范围可减少一行;若 x 小于右上角元素,则可断定二维数组的最右 面一列肯定不包含与 x 相等的数据,下次比较时可把最右一列剔除出搜索范围。这样,每 次比较可使搜索范围减少一行或一列,最多经过 m+n 次比较就可找到要求的与 x 相等的元 素。对应的程序如下:
{ printf("不是对角矩阵\n");
return false;
}
for (int i=0;i<a.nums;i++)
if (a.data[i].r==a.data[i].c) //行号等于列号
sum+=a.data[i].d;
return true;
}
11. 设计一个算法 Same(g1,g2),判断两个广义表 g1 和 g2 是否相同。 解:判断广义表是否相同过程是,若 g1 和 g2 均为 NULL,则返回 true;若 g1 和 g2 中一个为 NULL,另一不为 NULL,则返回 false;若 g1 和 g2 均不为 NULL,若同为原子 且原子值不相等,则返回 false,若同为原子且原子值相等,则返回 Same(g1->link,g2->link), 若同为子表,则返回 Same(g1->val.sublist,g2->val.sublist) & Same(g1->link,g2->link)的 结果,若一个为原子另一个为子表,则返回 false。对应的算法如下:

第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 =(( ))

第8章 数组和广义表

第8章 数组和广义表

第8章数组和广义表[能力要求](1)计算机基础知识:掌握线性表的概念以及顺序表和链表的基本操作。

(2)分析问题:针对具体的问题,要能够运用线性表去进行分析,逐步找到解决问题的方法。

(3)具有概念化和抽象化能力:针对具体的应用和实际的问题,能够运用线性表对问题进行抽象,提取它的逻辑结构和存储结构。

(4)发现问题和表述问题:在具体的工程中,能够发现工程中涉及到顺序表和链表的问题,并能够明确表述。

(5)建模:在具体的工程中,能够使用线性表进行建模,设计合理的数据结构和相应的算法。

(6)解决方法和建议:在具体工程应用中,发现了关于线性表的问题,要能够解决问题,并提出合理的建议。

(7)定义功能、概念和结构:使用线性表这种逻辑结构处理一些具体问题,实现系统的功能。

(8)设计过程的分段与方法:采取不同的阶段去设计(概念设计、详细设计)一个具体的线性表的应用项目。

(9)软件实现过程:了解系统中各个模块中的关于线性表的设计;讨论算法(数据结构、控制流程、数据流程);使用编程语言实施底层设计(编程)。

8.1知识点:数组的定义和顺序存储一、选择题1①常对数组进行的两种基本操作是()。

A.建立与删除 B.索引和修改C.对数据元素的存取和修改D.查找与索引2①下面说法中,不正确的是()。

A.数组是一种线性结构B.数组是一种定长的线性表结构C.除了插入与删除操作外,数组的基本操作还有存取、修改、检索和排序等D.数组的基本操作有存取、修改、检索和排序等,没有插入与删除操作3②数组A中,每个元素的长度为3个字节,行下标I从1到8,列下标J从1到10,从首地址SA开始连续存放在存储器内,该数组占用的字节数为()。

A.80 B.100 C.240 D.2704②在二维数组A[9][10]中,每一个数组元素A[i][j] 占用3个存储空间,所有数组元素相继存放于一个连续的存储空间中,则存放该数组至少需要的存储空间是()。

A. 80 B.100 C.240 D.2705②设有一个n*n的对称矩阵A,将其下三角部分按行存放在一个一维数组B中,A[0][0]存放于B[0]中,那么第I行的对角元素A[I][I]存放于B中()处。

数据结构第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.广义表的特点及应用:-广义表是一种扩展的线性数据结构,可以存储不同类型的元素。

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

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

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

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

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

数据结构第五章

数据结构第五章

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语言中,数组就是按列优先顺序存储的。

大学数据结构课件--第5章 数组和广义表

大学数据结构课件--第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 ) ( ( ( (
① 数组中的元素都具有统一的类型; ② 数组元素的下标一般都具有固定的上界和下界,即数组一旦 被定义,它的维数和维界就不再发生改变; ③ 数组的基本操作简单:初始化、销毁、存取元素和修改元素值

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

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

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

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

数据结构讲义第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
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
将其3条对角线上的元素存于数组B[3n-2-1] 中,使得B[k] = A[i][j] ,A[i][j]与B[k] 的对应 关系如下(请推导):
k = f(i, j)= ? k=2i+j |i-j|<=1
a1,0 a1,1 a1,2
L
二维数组A中任一元素ai,j 的存储位置
LOC(i,j) = LOC(0,0) + (b2×i+j)× L
称为基地址或基址。
11
推广到一般情况,可得到 n 维数组数据元 素存储位置的映象关系
n
LOC(j1, j2, ..., jn ) = LOC(0,0,...,0) + ∑i=1ci ji 其中 cn = L,ci-1 = bi ×ci , 1 < i n。
称为 n 维数组的映象函数。数组元素 的存储位置是其下标的线性函数
12
课堂练习
• 假设c语言中有二维数组A6×8,每个元素 用相邻的6个字节存储,存储器按字节编 址。已知A的起始存储位置为1000,计算:
(1)数组A的体积(即存储量) (2)数组A的最后一个元素a57的第一个字
节的地址; (3)假设按行存储时,元素a14的第一个字
数组和广义表
5.1 数组的类型定义 5.2 数组的顺序表示和实现 5.3 稀疏矩阵的压缩存储 5.4 广义表的类型定义 5.5 广义表的表示方法 5.6 广义表操作的递归函数
2
5.1 数组的类型定义
ADT Array {
数据对象:
D={a | j1,j2, ...,,ji,jn ji =0,...,bi -1, i=1,2,..,n } 数据关系:
配一个存储空间,则可将n2个元素压缩 存储到n(n+1)/2个元的空间中。我们可以 参照下三角以行优先存储。
A[i][j]与B[k] 的对应关系如下:
k=
i*(i+1)/2+j j*(j+1)/2+i
当i>=j ,0<=(i, j)<=n
(下三角)
当i<j, 0<=(i, j)<=n
(上三角)
21
三对角矩阵
操作结果:若各下标不超界,则e赋值为 所指定的A 的元素值,并返 回OK。
8
Assign(&A, e, index1, ..., indexn)
初始条件:A是n维数组,e为元素变量, 随后是n 个下标值。
操作结果:若下标不超界,则将e的值赋 给所指定的A的元素,并返回 OK。
9
5.2 数组的顺序表示和实现
D = {aij | 0≤i≤b1-1, 0 ≤j≤b2-1} 数据关系:
R = { ROW, COL }
ROW = {<ai,j,ai+1,j>| 0≤i≤b1-2, 0≤j≤b2-1} COL = {<ai,j,ai,j+1>| 0≤i≤b1-1, 0≤ j≤b2-2}
4
基本操作:
InitArray(&A, n, bound1, ..., boundn) DestroyArray(&A) Value(A, &e, index1, ..., indexn) Assign(&A, e, index1, ..., in] 的对应关 系如下:
k= i*(i+1)/2+j
0<=(i,j)<n
②上三角矩阵中有A[i][j]与B[k] 的对应关 系如下:
k=i*(2*n-i+1)/2+j-i 0<=(i,j)<n
20
对称矩阵
满足性质:aij=aji 0<=(i, j)<=n
在存储时我们可以为每一对对称元素分
1) 零值元素占了很大空间; 2) 计算中进行了很多和零值的运算, 遇乘法,白乘;遇除法,还需判别除数
是否为零; 怎样才能解决这些问题16 ?
解决问题的原则:
1) 尽可能少存或不存零值元素;
2) 尽可能减少没有实际意义的运算;
3) 操作方便; 即: a.能尽可能快地找到与下标值(i,j)
对应的元素; b.能尽可能快地找到同一行或同
节的地址; (节4)的假地设址按。列存储时,元素a47的第一个字
13
(1)数组A的体积(即存储量) 解:存储量=6×8×6=288
(2)数组A的最后一个元素a57的第一个字 节的地址;
解:LOC( a57 )=1000+288-6=1282
14
(3)假设按行存储时,元素a14的第一个 字节的地址;
解:LOC(a14)=LOC(a00)+(8×1+4)×6 =1000+72=1072
(4)假设按列存储时,元素a47的第一个 字节的地址; 解:LOC(a47)=LOC(a00)+(6×7+4)×6
=1000+276=1276
15
5.3 矩阵的压缩存储
以常规方法,即以二维数组表示 高阶的稀疏矩阵时产生的问题:
5
InitArray(&A, n, bound1, ..., boundn) 操作结果:若维数 n 和各维长度合法,
则构造相应的数组A,并 返回OK。
6
DestroyArray(&A) 操作结果:销毁数组A。
7
Value(A, &e, index1, ..., indexn)
初始条件:A是n维数组,e为元素变量, 随后是n 个下标值。
R={R1, R2, ..., Rn}
Ri={<a , a > | j1,... ji,... jn j1, ...ji +1, ...jn 0 jk bk -1, 1 k n 且k i, 0 ji bi -2, i=2,...,n }
基本操作:
} ADT Array
3
二维数组的定义: 数据对象:
类型特点: 1) 只有引用型操作,没有加工型操作; 2) 数组是多维的结构,而存储空间是
一个一维的结构。
有两种顺序映象的方式: 1)以行序为主序(低下标优先); 2)以列序为主序(高下标优先);
10
以“行序为主序”的存储映象 例如:
a0,0 a0,1 a0,2
a0,0 a0,1 a0,2 a1,0 a1,1 a1,2
一列的非零值元; 17
有两类矩阵:
1) 特殊矩阵 值相同的元素或零元素在矩阵中的
分布有一定规率 例如: 三角矩阵 对角矩阵
2) 稀疏矩阵 非零元极少且在矩阵中随机出现
18
特殊矩阵 三角矩阵
k=1+2+…+i+j k=n+(n-1)+…+(n-i)+(j-i)
19
三角矩阵
将A[n][n],把它的非0元按行优先, 逐行、逐个存入 B[n*(n+1)/2]中)
相关文档
最新文档