数据结构-数组和广义表
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
m-1,1
m-1,n-1
1. 可以将二维数组A看成是由m个行向量[X0,X1, …,Xm-1]T组成,其中, Xi=( ai0, ai1, ….,ain-1), 0≤i≤m-1;
2. 可以将二维数组A看成是由n个列向量[y0, y1, ……,yn-1]组成,其中, Yj=(a0j, a1j, …..,am-1j), 0≤j≤n-1。
5.1 数组的定义
n维数组的抽象数据类型定义
ADT Arrayn{ 数据对象:
D={aj1j2…jn| aj1j2…jn ∈ElemSet,其中 ji =0,1,… , bi-1, i =1,…,n}
数据关系:
S={R1 ,R2 ,…… ,Rn}
Ri={<aj1…ji…jn,aj1…ji+1…jn>| 0≤jk≤bk-1,1≤k≤n 且k≠i,
5.3.1 特殊矩阵
一、对称矩阵 定义 若一个n阶方阵A中元素满足下 列条件:
aij=aji (其中 1 ≤i, j≤n)
则称A为对称矩阵。 压缩存储方案
只存下三角 只存上三角
a a a a 11
12
13
1n
a a a a 21
22
23
2n
a a a a 31
32
33
3n
a a a a n1
5.3 矩阵的压缩存储
问题提出:
在科学与工程计算问题中,矩阵是一种常用的数学对象, 在高级语言编制程序时,简单而又自然的方法,就是将 一个矩阵描述为一个二维数组。
矩阵在这种存储表示之下,可以对其元素进行随机存取, 各种矩阵运算也非常简单,并且存储的密度为1。
两类矩阵的压缩存储
特殊矩阵 稀疏矩阵
5.2 数组的顺序表示和实现
(2)列优先顺序存储
LOC(a00)
地址计算公式:
Loc(aij)=Loc(a00)+(j×m+i)L
a0,0 …… am-1,0 …… a0,j …… am-1,j …… a0,n-1 …… am-1,n-1
第0列 第j列 第n-1列
5.2 数组的顺序表示和实现
可以推广到多维数组的列优先顺序存储 列优先顺序存储也称为高下标优先或右边下标优先于 左边下标。 多维数组按列优先存放到内存的规律: ▪ 最右边下标变化最慢,最左边下标变化最快,左边 下标变化一遍,与之相邻的右边下标才变化一次。 ▪ 因此,在算法中,最右边下标可以看成是外循环, 最左边下标可以看成是最内循环。
n2
n3
nn
(1)只存放下三角部分(行优先)
a11
a21 a22
………
ai1
ai2
… aii
i(i 1) j
i≥j
k=
2
…………
an1 an2 an3
ann
j( j 1) i
i<j
2
a11 a21 a22 a31 …
ai1
… aii …
an1
…
k=1 2 3 4 … i(i-1)/2+1
i(i-1)/2+i
0≤ji≤bi-2 ,
aj1…ji…jn,aj1…ji+1…jn∈D}
基本操作:
InitArray(&A,n,bound1,…,boundn)
DestroyArray(&A) value(A,&e,index1,…,indexn) Assign(&A,e,index1,…,indexn)
} ADT Arrayn
方案1:按行主序依次将矩阵非0元存入一维数组sa[0..3n-2]
中。
a a 11 12
0 a a a 21 22 23
i=1 j=1,2 或
3(i 1) 1 j i 2 i=n j=n-1,n 或
k= 2i j 2
1<i<n j=i-1,i,i+1
a a 32 33
0
an 1, n
a a n, n 1
5.3.1 特殊矩阵
特殊矩阵
元素值的排列具有一定规律的矩阵。 常见的这类矩阵有:
对称矩阵 下(上)三角矩阵 对角线矩阵等等。
压缩存储方案:
对于这些特殊矩阵,应该充分利用元素值的分布规律,将其进行压 缩存储。
选择压缩存储的方法应遵循两条原则: 一是尽可能地压缩数据量; 二是压缩后仍然可以比较容易地进行各项基本操作
5.2 数组的顺序表示和实现
优点
只要知道以下三要素 ①开始结点的存放地址(即基地址); ②维数和每维的上、下界; ③每个数组元素所占用的单元数
就可以将数组元素的存放地址表示为其下标的线性函数。 因此:
数组中的任一元素可以在相同的时间内存取,即顺序 存储的数组是一个随机存取结构。
缺点
为了在计算机内存中给数组开辟足够的内存空间,必须 预先确定每个数组下标的上、下界,有时这是比较困难 的。
k=
2
0
i>j
注:数组元素sa[0]中存放的是常数c或0
压缩存储方案
k= c a11 … a1n
0 1… n
a22 a23 … aii … ain n+1
…
an,n
n(n+1)/2
三、对角矩阵
定义
若n阶矩阵A的所有非0元集中在以住对角线为中心的带状 区域内,称A为n阶对角矩阵。
三、对角矩阵
压缩方案:
(1)用i,j表示k的下标变换公式: (2)用k表示i,j的下标变换公式。 注:
题目来源:山东科技大学2004年招收硕士学位研究生 入学考试数据结构试卷
三、对角矩阵
压缩方案
方案2:按列主序存储非0元素 方案3:按对角线存储非0元素
(2)线性表的元素是逻辑意义上不可再分的元素,而数组中 的每个元素还可以是一个数组;
(3)数组的操作主要是向某个下标的数组元素中存放数据和 取某个下标的数组元素,这与线性表的插入和删除操作不
同。
5.1 数组的定义
二维数组
a00
a01 a0n-1
A a10
a11 a1n-1
在此:
a a a m-1,0
n, n
0
其它
注:数组元素sa[0]中存放的是常数c或0
k= c a11 a12 a21 a22 a23 … aii-1
01 2 3 4 5
aii aii+1
…
an,n-1
an,n
3n-3 3n-2
练习:
设有三对角矩阵(aij)n×n,将其三条对角线上的元素aij逐 行地存在于数组b[3n-2]中,使得aij=b[k],求:
教学目标
(1) 了解数组的逻辑结构和存储表示;掌握数组在以 行/列为主的存储结构中的地址计算方法;
(2) 掌握特殊矩阵的压缩存储方式及下标变换公式; (3) 了解稀疏矩阵压缩存储方法的特点和适用范围,
理解以三元组表示的稀疏矩阵进行矩阵运算采用的处理 方法;
(4) 掌握广义表的结构特点极其存储表示方法,以及 对非空广义表进行分解的两种分析方法。
LOC(ai+1)
ቤተ መጻሕፍቲ ባይዱ
ai+1
……
an-1
5.2 数组的顺序表示和实现
2.二维数组及多维数组
(1)行优先顺序存储
LOC(a00)
地址计算公式:
Loc(aij)=Loc(a00)+( i×n+j) L
a00 …… a0n-1 …… ai0 …… ain-1 …… am-1,0 …… am-1,,n-1
… ……
(i 1)(2n i 2) j i 1 i≤j
aii … ain k=
2
…… ann
( j 1)(2n j 2) i j 1 i>j 2
a11 … a1n
k= 1 … n
a22 … a2n … aii n+1 … 2n-1
… ain
…
an,n
n(n+1)/2
问题 :
若按列优先存储上三角的元素,aij<--->sak ?
基本操作:
InitArray(&A,2,m,n)
DestroyArray(&A)
value(A,&e,i,j)
Assign(&A,e,i,j)
} ADT Array2
5.1 数组的定义
三维数组
三维数组最多可有三个直接前驱和三个直接后继,三维 以上数组可以作类似分析。
因此,可以把三维以上的数组称为多维数组,多维数组 可有多个直接前驱和多个直接后继,故多维数组是一种 非线性结构。
第0行 第i行 第m-1行
例1:
一个二维数组A,行下标的范围是1到6,列下标的范围是 0到7,每个数组元素用相邻的6个字节存储,存储器按字 节编址。那么,这个数组的体积是( 288 )个字节。
例2 :
设数组a[1…60, 1…70]的基地址为2000,每个元素占2个 存储单元,若以行序为主序顺序存储,则元素a[32,31]的 存储地址为 ( 6400 ) 。
/blog/archives/416 自然数和有理数的对应
5.2 数组的顺序表示和实现
1.一维数组
地址计算公式: LOC(ai)= LOC(a0)+i×L LOC(ai+1)= LOC( ai )+L
LOC(a0)
a0
L
a1
……
LOC(ai)
ai
由此可知:
二维数组中的每一个元素 最多可有二个直接前驱和两个直接后 继(边界除外),故是一种典型的非线性结构。
5.1 数组的定义
▪ 二维数组的抽象数据类型定义
ADT Array2{
数据对象 :D={aij|aij∈ElemSet,0≤i≤m-1,0≤j≤n-1} 数据关系:S={R1,R2}
R1={< ai,j ,ai,j+1>| 0≤i≤m-1, 0≤j<n-1} R2={< ai,j ,ai+1,j>| 0≤i<m-1, 0≤j≤n-1}
5.2 数组的顺序表示和实现
可以推广到多维数组的行优先顺序存储 行优先顺序存储也称为低下标优先或左边下标优先于 右边下标。 多维数组按行优先存放到内存的规律:
▪ 最左边下标变化最慢,最右边下标变化最 快,右边下标变化一遍,与之相邻的左边 下标才变化一次。
▪ 因此,在算法中,最左边下标可以看成是 外循环,最右边下标可以看成是最内循环。
① 数组中各元素具有统一的类型; ② 数组元素的下标一般具有固定的上界和下界,即数
组一旦被定义,它的维数和维界就不再改变。 ③数组的基本操作比较简单。
问题:数组与线性表的区别与联系?
相同之处:
它们都是若干个相同数据类型的数据元素a0,a1,a2,…,
an-1构成的有限序列。 不同之处:
(1)数组要求其元素占用一块地址连续的内存单元空间,而 线性表无此要求;
5.1 数组的定义
一、数组的基本概念
数组的定义
即数组是由n个具有相同数据类型的数据元素a1, a2 ,…,an组成的有限序列,且该有限序列必须存储
在一块地址连续的存储单元中。 数组的下标:数组元素的位置。
▪ 一维数组 ▪ 二维数组 ▪ 多维数组
注意:
(1)C语言的数组定义下标从0开始。 (2) 数组的处理相比其它复杂的结构要简单。
ai1
… aii …
an1
…
k= 0 1 2 3 … i(i-1)/2+1
i(i-1)/2+i
n(n-1)/2+1
an,n
n(n+1)/2
(2)上三角矩阵
a11 a12 a22
C
a13 … a1n a23 … a2n … ……
aii … ain …… ann
(i 1)(2n i 2) j i 1 i≤j
答:
j( j 1) i
i≤j
k=
2
i(i 1) j
i>j
2
二、三角矩阵
(1)下三角矩阵
a11
a21
a22
c
i(i 1) j
i≥j
k=
2
………
0
i<j
ai1
ai2
… aii
…………
an1
an2
an3
注:数组元素sa[0]中存放的是常数c或0 ann
压缩存储方案
C a11 a21 a22 …
CH5 数组和广义表
5.1 数组的定义 5.2 数组的顺序表示和实现 5.3 矩阵的压缩存储
5.3.1 特殊矩阵 5.3.2 稀疏矩阵
5.4 广义表的定义 5.5 广义表的存储结构
教学内容
本章先介绍数组的定义及基本运算,然后介绍数组的存 储结构及特殊矩阵的压缩存储,之后讨论稀疏矩阵的三 种存储方法,最后介绍广义表的概念、基本运算和存储 结构。
n(n-1)/2+1
an,n
n(n+1)/2
问题 :
若按列优先存储下三角的元素, aij<--->sak ?
答:
k
( j 1)(2n
2
(i
1)(2n
i
2
j 2) 2) (
(i j i
j 1) 1)
i j i j
(2)只存放上三角部分
a11 a12 a13 … a1n
a22 a23 … a2n
5.2 数组的顺序表示和实现
存储结构的选择:
由于对数组一般不做插入和删除操作,也就是说,数组 一旦建立,结构中的元素个数和元素间的关系就不再发 生变化。因此,一般都是采用顺序存储的方法来表示数 组。
由于计算机的内存结构是一维的,因此用一维内存来表 示多维数组,就必须按某种次序将数组元素排成一列序 列,然后将这个线性序列存放在存储器中。