数据结构5_数组和广义表

合集下载

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

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

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

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

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

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

它是一维数组的特例。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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章

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

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

数据结构第五章数组和广义表(总6页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--第五章数组和广义表:习题习题一、选择题1.假设以行序为主序存储二维数组A[1..100,1..100],设每个数据元素占两个存储单元,基地址为10,则LOC(A[5,5])=( )。

A. 808B. 818C. 1010D. 10202.同一数组中的元素( )。

A. 长度可以不同 B.不限 C.类型相同 D. 长度不限3.二维数组A的元素都是6个字符组成的串,行下标i的范围从0到8,列下标j的范圈从1到10。

从供选择的答案中选出应填入下列关于数组存储叙述中( )内的正确答案。

(1)存放A至少需要( )个字节。

(2)A的第8列和第5行共占( )个字节。

(3)若A按行存放,元素A[8]【5]的起始地址与A按列存放时的元素( )的起始地址一致。

供选择的答案:(1)A. 90 B. 180 C. 240 D. 270(2) A. 108 B. 114 C. 54 D. 60(3)[8][5] B. A[3][10] [5][8] [O][9]4.数组与一般线性表的区别主要是( )。

A.存储方面B.元素类型方面C.逻辑结构方面D.不能进行插入和删除运算5.设二维数组A[1..m,1..n]按行存储在数组B[1..m×n]中,则二维数组元素A[i,j]在一维数组B中的下标为( )。

A. (i-l)×n+jB. (i-l)×n+j-lC.i×(j-l) D. j×m+i-l6.所谓稀疏矩阵指的是( )。

A.零元素个数较多的矩阵B.零元素个数占矩阵元素中总个数一半的矩阵C.零元素个数远远多于非零元素个数且分布没有规律的矩阵D.包含有零元素的矩阵7.对稀疏矩阵进行压缩存储的目的是( )。

A.便于进行矩阵运算B.便于输入和输出C.节省存储空间D. 降低运算的时间复杂度8.稀疏矩阵一般的压缩存储方法有两种,即( )。

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

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

A. 808B. 818C. 1010D. 10202.同一数组中的元素( )。

A. 长度可以不同 B.不限 C.类型相同 D. 长度不限3.二维数组A的元素都是6个字符组成的串,行下标i的范围从0到8,列下标j的范圈从1到10。

从供选择的答案中选出应填入下列关于数组存储叙述中( )内的正确答案。

(1)存放A至少需要( )个字节。

(2)A的第8列和第5行共占( )个字节。

(3)若A按行存放,元素A[8]【5]的起始地址与A按列存放时的元素( )的起始地址一致。

供选择的答案:(1)A. 90 B. 180 C. 240 D. 270(2) A. 108 B. 114 C. 54 D. 60(3)[8][5] B. A[3][10] [5][8] [O][9]4.数组与一般线性表的区别主要是( )。

A.存储方面B.元素类型方面C.逻辑结构方面D.不能进行插入和删除运算5.设二维数组A[1..m,1..n]按行存储在数组B[1..m×n]中,则二维数组元素A[i,j]在一维数组B中的下标为( )。

A. (i-l)×n+jB. (i-l)×n+j-lC.i×(j-l) D. j×m+i-l6.所谓稀疏矩阵指的是( )。

A.零元素个数较多的矩阵B.零元素个数占矩阵元素中总个数一半的矩阵C.零元素个数远远多于非零元素个数且分布没有规律的矩阵D.包含有零元素的矩阵7.对稀疏矩阵进行压缩存储的目的是( )。

A.便于进行矩阵运算B.便于输入和输出C.节省存储空间D. 降低运算的时间复杂度8.稀疏矩阵一般的压缩存储方法有两种,即( )。

A.二维数组和三维数组B.三元组和散列C.三元组和十字链表D.散列和十字链表9.有一个100×90的稀疏矩阵,非0元素有10个,设每个整型数占两字节,则用三元组表示该矩阵时,所需的字节数是( )。

大学数据结构课件--第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 ) ( ( ( (
① 数组中的元素都具有统一的类型; ② 数组元素的下标一般都具有固定的上界和下界,即数组一旦 被定义,它的维数和维界就不再发生改变; ③ 数组的基本操作简单:初始化、销毁、存取元素和修改元素值
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、稀疏矩阵的压缩存储
二、稀疏矩阵的操作
问题: 如果只存储稀疏矩阵中的非零元素,那这些元素的位置信息 该如何表示? 解决思路: 对每个非零元素增开若干存储单元,用来存放其所在的行号
和列号,便可准确反映该元素所在位置。
实现方法: 将每个非零元素用一个三元组(i,j,aij)来表示,则每个 稀疏矩阵可用一个三元组表来表示。
2014-12-17 11
即Ci信息保存区
注意: 本章所讨论的数组与高级语言中的数组有所区别: 高级语言中的数组只是顺序结构;而本章的数组既可以是顺 序的,也可以是链式结构,用户可根据需要选择。 补充:数组的链式存储方式—用带行指针向量的单链表来表示。 行指针向量
a11 a12 … a1n ^
… …
i
NUM( i) POS( i )
0 0 -3 0 0 15
0
12 0 0 0 18 0
9 0 0 24 0 0
0 0 0 0 0 -7
0 0 14 0 0 0
0 0 0 0 0 0
1 2 1
2 2 3
3 2 5
4 1 7
5 1 8
6 0 9
1 2 3 4 5 6 7 8
POS(i)如何计算? 用途后续 POS(1)=1 POS(i)=POS(i-1)+NUM(i-1)
2014-12-17 8
例2:一个二维数组A,行下标的范围是1到6,列下标的范围
是0到7,每个数组元素用相邻的6个字节存储,存储器按字节 编址。那么,这个数组的体积是 288 个字节。
答: Volume=m*n*L=(6-1+1)*(7- 0 +1)*6=48*6=288
Loc(aij)= Loc(a11)+[(i-1)*m+(j-1)]*K , 请问按列存储的公式相同吗?
(a) 下三角矩阵
(b) 存储说明
(c) 计算方法
对称矩阵的压缩存储
0 1 2 3 4 5
k … aij … a n1 a n2 …
n(n+1)/2-1
a11
第02
第2行
a33
ann
第1行
第n-1行
对于下三角中的元素aij(i≥j),在数组SA中的下标k 与i、j的关系为:k=i×(i-1)/2+j -1。 上三角中的元素aij(i<j),因为aij=aji,则访问和 它对应的元素aji即可,即:k=j×(j-1)/2+i -1 。
2014-12-17
6
无论规定行优先或列优先,只要知道以下三要素便可随时求出 任一元素的地址(意义:数组中的任一元素可随机存取): ①开始结点的存放地址(即基地址) ②维数和每维的上、下界; ③每个数组元素所占用的单元数 Amn=
计算二维数组元素地址的通式
a0,0 … a0,b2-1 … aij … ab1-1,0 … ab1-1,b2-1
am1 am2 … amn ^
^ 注:链式数组的运算请参见“稀疏矩阵的转置”
2014-12-17 12
5.3 矩阵的压缩存储
1. 什么是压缩存储?
若多个数据元素的值都相同,则只分配一个元素 值的存储空间,且零元素不占存储空间。
2. 所有二维数组(矩阵)都能压缩吗?
未必,要看矩阵是否具备以上压缩条件。
稀疏矩阵压缩存储的缺点:
2014-12-17 20
将失去随机存 取功能 !
法3:用带辅助向量的三元组表示。 用途:便于高效访问稀疏矩阵中任一非 零元素。
方法: 增加2个辅助向量: ① 记录每列非0元素个数,用NUM(i)表示; ② 记录稀疏矩阵中每列第一个非0元素在三元组中 的恰当位置,用POS(i)表示。
i
0 1 2 3
j 6 2 3 1 5 3
value 8 12 9 -3 14 24
6 1 1 3 3 4
0 0 -3 0 0 15
12 0 0 0 18 0
9 0 0 24 0 0
0 0 0 0 0 -7
0 0 14 0 0 0
0 0 0 0 0 0
4
5 6 7 8
5
6 6
2
1 4
18
15 -7
注意:为更可靠描述, 通常再加一行“总体” 信息:即总行数、总 列数、非零元素总个 数
3. 什么样的矩阵具备以上压缩条件?
一些特殊矩阵,如:对称矩阵,对角矩阵,三角 t 矩阵,稀疏矩阵等。
4. 什么叫稀疏矩阵? 稀疏因子= m*n
矩阵中非零元素的个数较少(稀疏因子<=5%)
2014-12-17 13
特殊矩阵和稀疏矩阵
特殊矩阵:矩阵中很多值相同的元素并且它们的 分布有一定的规律。
例3:已知二维数组Am,m按行存储的元素地址公式是:
答:尽管是方阵,但公式仍不同。应为:
Loc(aij)=Loc(a11)+[(j-1)*m+(i-1)]*K
2014-12-17
9
例4 :〖考研题〗 :设数组a[1…60, 1…70]的基地址为
2048,每个元素占2个存储单元,若以列序为主序顺序存储, 8950 。 则元素a[32,58]的存储地址为 答:请注意审题! 根据列优先公式 Loc(aij)=Loc(a11)+[(j-1)*m+(i-1)]*K 得:LOC(a32,58)=2048+[(58-1)*60+(32-1)]*2=8950 想一想:若数组是a[0…59, 0…69],结果是否仍为8950?
N维数组的特点: n个下标,每个元素受到n个关系约束
一个n维数组可以看成是由若干个n-1维数组组成的线性表。
2014-12-17
3
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 } 基本操作:构造数组、销毁数组、读数组元素、写数组元素
稀疏矩阵:矩阵中有很多零元素。
压缩存储的基本思想是: ⑴ 为多个值相同的元素只分配一个存储空间; ⑵ 对零元素不分配存储空间。
特殊矩阵的压缩存储——对称矩阵
A=
3 6 4 7 8
6 2 8 4 2
4 8 1 6 9
7 4 6 0 5
8 2 9 5 7
对称矩阵特点:aij=aji
如何压缩存储? 只存储下三角部分的元素。
2014-12-17 21
i 6 1 1 3 3 4 5 6 6
j 6 2 3 1 5 3 2 1 4
v 8 12 9 -3 14 24 18 15 -7
法4:用十字链表表示
用途:方便稀疏矩阵的加减运算 方法:每个非0元素占用5个域 3 0 0 5 0 -1 0 0 2 0 0 0
i
j
v right
2014-12-17
23
例3:下面的三元组表表示一个稀疏矩阵,试还原出它
的稀疏矩阵。
i
0 1 2 3 4 5 6
j
value
6 1
2 3
4 2
1 1
6 2
12 3
4
5 6
4
3 1
4
6 16
0 12 0 3 0 0 0 16 0
2 0 0 0 0 0 0
0 0 0 0 6 0 0
0 0 0 4 0 0 0
维界虽未变,但此时的a[32,58]不 再是原来的a[32,58]
2014-12-17 10
N维数组的顺序存储表示(见教材P93)
#define MAX_ARRAY_DIM 8 //假设最大维数为8 typedef struct{ ELemType *base; //数组元素基址 int dim; //数组维数 int *bound; //数组各维长度信息保存区基址 int *constants; //数组映像函数常量的基址 }Array; 数组的基本操作函数说明(有5个) (请阅读教材P93-95)
1
5.1 数组的定义
数组: 由一组名字相同、下标不同的变量构成 注意: 这里讨论的数组与高级语言中的数组有所区别:高级 语言中的数组是顺序结构;而这里的数组既可以是顺序的, 也可以是链式结构,用户可根据需要选择。
判断:“数组的处理比其它复杂的结构要简单”,对吗?
答:对的。因为—— ① 数组中各元素具有统一的类型; ② 数组元素的下标一般具有固定的上界和下界,即数组一 旦被定义,它的维数和维界就不再改变。 ③数组的基本操作比较简单,除了结构的初始化和销毁之 外,只有存取元素和修改元素值的操作。
对称矩阵的压缩存储
1 … j
1 …

n
第 1行 第2行
每行元素个数
1 2 … i-1 aij
… 第i-1行
i n
aij
aij在一维数组中的序号 =阴影部分的面积 = i×(i-1)/2+ j ∵一维数组下标从0开始 ∴aij在一维数组中的下标 k= i×(i-1)/2+ j-1
aij在本行中的序号
3 a(0,3)
a(1,0)
…… …… ……
a(1,1)
…… …… ……
……
…… a(3,2) ……
a(1,3)
…… …… ……
……
a(6,0)
……
……
……
……
……
a(6,3)
要事先确定: ①是行优先方式还是列优先方式? 列优先, ②数组的首地址是多少? 首地址为100, ③每个元素的长度? 每个元素占2个字节。
相关文档
最新文档