chap5_数组和广义表

合集下载

数组和广义表

数组和广义表

InitArray(&A, n, bound1, ..., boundn) 操作结果:若维数 n 和各维长度合法,
则构造相应的数组A,并 返回OK。
2013年7月14日星期日
DestroyArray(&A) 操作结果:销毁数组A。
2013年7月14日星期日
Value(A, &e, index1, ..., indexn) 初始条件:A是n维数组,e为元素变量, 随后是n 个下标值。 操作结果:若各下标不超界,则e赋值为
2013年7月14日星期日
a
a1 11 a1 21 a1 31 a1 41
a
三维数组元素的标号由三个数字表示,即行、列、纵三个 方向。a142 表示第1行,第4列,第2纵的元素。如果对A3×4×2
(下标从1开始)采用以行为主序的方法存放,即行下标变
化最慢,纵下标变化最快,则顺序为: a111,a112,a121,a122, …,a331,a332,a341,a342 采用以列为主序的方法存放, 即纵下标变化最慢, 行下 标变化最快, 则顺序为:
同理,三维数组最多可有三个直接前驱和三个直接后继, 三维以上数组可以作类似分析。因此,可以把三维以上 的数组称为多维数组,多维数组可有多个直接前驱和多 个直接后继,故多维数组是一种非线性结构。
2013年7月14日星期日
数组的抽象类型定义
ADT Array { 数据对象: D={aj ,j , ...,,j ,j | ji =0,...,bi -1, i=1,2,..,n } 数据关系: R={R1, R2, ..., Rn} Ri={<aj ,... j ,... j , aj , ...j +1, ...j > | 0 jk bk -1, 1 k n 且k i, 0 ji bi -2, i=2,...,n }

Chapter05_数组和广义表_数据结构(C语言版)_严蔚敏_配套ppt课件

Chapter05_数组和广义表_数据结构(C语言版)_严蔚敏_配套ppt课件

M
1 1 2 3 3 4
1 5 3 1 2 4
3 7 -1 -1 -2 2
N
1 1 2 3 4 5
1 3 3 2 4 1
3 -1 -2 -1 2 7
行列下 标调换
1 5 3 1 2 4
1 1 2 3 3 4
3 7 -1 -1 -2 2
按行下 标排序
法1:
按照矩阵M的列序进行转置,即按三元组A的 第二个字段值(列下标)由小到大的顺序进行转置。 为了找到M中每一列中所有的非零元素,需要对其 三元组表a.data从第一行起整个扫描一遍,由于 a.data是以M的行序为主序来存放每个非零元素 的,对于M中具有相同列下标的非零元来讲,先扫 描到的非零元的行下标一定小于后扫描到的非零元 的行下标,由此得到的恰是b.data应有的顺序。
• 压缩的含义
– 为多个值相同的元素只分配一个存贮空间; – 零元素不分配或少分配存贮空间。
• 特殊矩阵:元素值相同或零元素分布有 一定规律的矩阵。 • 稀疏矩阵:元素值相同或零元素分布没 有规律的矩阵。 • 特殊矩阵的压缩存贮实际是将二维数组 的数据元素压缩到一维数组上。
特殊矩阵的压缩存储
特殊矩阵: 非零元在矩阵中的分布有一定规则
常用的稀疏矩阵的存储方法
三元组表示法 顺序存储 行逻辑联接的顺序表 带辅助行向量的二元组表示法 伪地址表示法 带行指针向量的单链表示法 链接存储 散列存储 行列表示法(十字链表) 多链表示法(正交表)
顺序存储
1、三元组表示法 用一个线性表来表示稀疏矩阵,线性表的每个 结点对应稀疏矩阵的一个非零元素。其中包括三个 域,分别为该元素的行下标、列下标和值。结点间 的先后顺序按矩阵的行优先顺序排列(跳过零元 素),将线性表用顺序的方法存储在连续的存储区 里。

第五章 数组与广义表

第五章 数组与广义表

第五章数组、特殊矩阵和广义表本章介绍的数组与广义表可视为线性表的推广,其特点是数据元素仍然是一个表。

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

5.1 多维数组5.1.1 数组的逻辑结构数组是我们很熟悉的一种数据结构,它可以看作线性表的推广。

数组作为一种数据结构其特点是结构中的元素本身可以是具有某种结构的数据,但属于同一数据类型,比如:一维数组可以看作一个线性表,二维数组可以看作“数据元素是一维数组”的一维数组,三维数组可以看作“数据元素是二维数组”的一维数组,依此类推。

图5.1是一个m行n 列的二维数组。

标识,因此,在数组上不能做插入、删除数据元素的操作。

通常在各种高级语言中数组一旦被定义,每一维的大小及上下界都不能改变。

在数组中通常做下面两种操作:(1)取值操作:给定一组下标,读其对应的数据元素。

(2)赋值操作:给定一组下标,存储或修改与其相对应的数据元素。

我们着重研究二维和三维数组,因为它们的应用是广泛的,尤其是二维数组。

5.1.2 数组的内存映象现在来讨论数组在计算机中的存储表示。

通常,数组在内存被映象为向量,即用向量作为数组的一种存储结构,这是因为内存的地址空间是一维的,数组的行列固定后,通过一个映象函数,则可根据数组元素的下标得到它的存储地址。

对于一维数组按下标顺序分配即可。

对多维数组分配时,要把它的元素映象存储在一维存储器中,一般有两种存储方式:一是以行为主序(或先行后列)的顺序存放,如BASIC、PASCAL、COBOL、C等程序设计语言中用的是以行为主的顺序分配,即一行分配完了接着分配下一行。

另一种是以列为主序(先列后行)的顺序存放,如FORTRAN语言中,用的是以列为主序的分配顺序,即一列一列地分配。

以行为主序的分配规律是:最右边的下标先变化,即最右下标从小到大,循环一遍后,右边第二个下标再变,…,从右向左,最后是左下标。

以列为主序分配的规律恰好相反:最左边的下标先变化,即最左下标从小到大,循环一遍后,左边第二个下标再变,…,从左向右,最后是右下标。

数组和广义表PPT课件

数组和广义表PPT课件
❖ 设在矩阵A中,有s个非零元素。令 e=s/(m*n),称e为矩阵的稀疏因子。通常 认为e≤0.05时称之为稀疏矩阵。
第18页/共57页
5.3.2稀疏矩阵的压缩存储
❖在存储稀疏矩阵时,由于非零元素的分布一般 是没有规律的,因此在存储非零元素的同时,还 必须同时记下它所在的行和列的位置(i,j)。反 之,一个三元组(i,j,aij)惟一确定了矩阵A的一个 非零元。因此,稀疏矩阵可由表示非零元的三元 组及其行列数唯一确定。
a0,0 a0,1 a1,0 a1,1 a1,2
a2,1 a2,2 a2,3 …. ai,j …. an-2,n-3 an-2,n-2 an-2,n-1 an-1,n-2 an-1, n-1
k=? m=?
数组B
a0,0 a0,1 a1,0 ...
ai,j
...
下标
012
k k+1
m
第16页/共57页
k=? m=?
数组B 下标
a1,1 a2,1 a2,2 a3,1 … ai,j
1234
k
… an,n
m
第11页/共57页
5.3.1(续)三角矩阵的压缩存储
❖ 三角矩阵:上(下)三角矩阵是指矩阵的下(上)
三角(不包括对角线)中的元素均为常数或零的n
阶矩阵,即非零元素的分布在矩阵中呈现为三角
形。
❖ 例如:一个4*4的三角矩阵。
❖ 压缩存储:为多个值相同的非零元素只分配 一个存储空间;对零元素不分配空间。
第8页/共57页
5.3.1特殊矩阵的压缩存储
❖ 特殊矩阵:非零元素按照一定的规律分布。 ❖ 常见的特殊矩阵有对称矩阵、三角矩阵、对角矩
阵等。 ➢ 对称矩阵:元素的值按照主对角线对称

第05章 数组和广义表(Java版)

第05章  数组和广义表(Java版)

单元数L确定,则ai的存储地址LOC(ai)就可求出:
LOC(ai)=LOC(a0)+i*L (0≤i<n)
L a0
Loc(a0)
a1
……
ai-1
ai
……
an-1
7
Loc(ai)
2.二维数组
二维数组,又称矩阵(matrix)。二维数组中的每一个元素又 是一个定长的线性表(一维数组),都要受到两个关系即行关 系和列关系的约束,也就是每个元素都同属于两个线性表。例 如,设A是一个有m行n列的二维数组,则A可以表示为:
限制元素类型为字符
线性表——具有相同类型的数据元素的有限序列。
线性表——具有相同类型的数据元素的有限序列。 将元素的类型进行扩充 广 义 线 性 表 (多维)数组——线性表中的数据元素可以是 线性表,但所有元素的类型相同。 广义表——线性表中的数据元素可以是线性表, 且元素的类型可以不相同。
本章学习导读
6
1.一维数组
一维数组可以看成是一个线性表或一个向量,它在计算机 内是存放在一块连续的存储单元中,适合于随机查找。
一维数组记为A[n]或A=( a0,al,…ai,…,an-1) 每个元素只 有 1个下标,a2 是a3的直接前驱,a4是a3的直接后继。 一维数组中,一旦a0的存储地址、一个数据元素所占存储
《数据结构(Java版)(第3版)》
练习题
• 假设以行序为主序存储二维数组 A=array[0..99,0..99],设每个数据元 素占2个存储单元,基地址为10,则 LOC[4,4]=( )。 A. 808 B. 818 C. 1010 D. 1020
《数据结构(Java版)(第3版)》
多维数组的存储结构与寻址

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

第五章数组和广义表

第五章数组和广义表
TransposeSMatrix ( M, &T )
稀疏矩阵M存在
由稀疏矩阵M复制 得到T
稀疏矩阵M与N的行 求稀疏矩阵的和Q 数和列数对应相等 =M+N
稀疏矩阵M与N的行 求稀疏矩阵的差Q 数和列数对应相等 =M-N
稀疏矩阵M的列数 求稀疏矩阵乘积Q
等于N的行数
=M*N
稀疏矩阵M存在
求稀疏矩阵M的转 置矩阵T
M.chead
M.rhead
30 05
113
145
M = 0 -1 0 0
2 000
2 2 -1
312
稀疏矩阵的十字链表存储表示:
typedef struct OLNode { int i, j ; // 非零元的行和列下标 ElemType e ; Struct OLNode *right, *down ; // 该非零元所在行表和列表的后继链域
1 当i

j
a00 a10 a11 a20 k= 0 1 2 3
… an-1, 0 … n(n-1)/2
an-1, n-1 n(n+1)/2-1
ADT SparseMatris { 数据对象:
D = { aij | i = 1, 2, …, m; j =1, 2, … , n; aij∈ElemSet,m和n分别称为矩阵的行数和列数}
第五章 数组和广义表
ADT Array { 数据对象:{ ji = 0, … , bi-1 , i = 1, 2 , … ,
n, D = { aj1j2…jn | n ( > 0 )称为数组的维数, bi是数组第i维的长度, ji是数组元素的第i维下标, aj1j2…jn∈ElemSet } 数据关系:R = { R1, R2, …, Rn }

第5章 数组和广义表总结

第5章 数组和广义表总结

0603
2090
B5×4 = 0 8 0 0
0000
row col val
4000
0 12
0 44
1 06
1 28
2 19
3 03
现在,要通过A的 三元组表求其转置 矩阵B的三元组表。
row col val
0 16 0 33 1 02 1 29 2 18 4 04
16
三元组表的转置
方法1:设矩阵A是m行、n列、t个非0元素 从头到尾扫描A,将第0列的元素依次放入B(行号列号互换); 从头到尾扫描A,将第1列的元素依次放入B(行号列号互换); ...... 从头到尾扫描A,将第n-1列的元素依次放入B(行号列号互换); 扫描A几趟? 矩阵A的列数n
}tritype;
typedef struct { //三元组表
tritype data[MAXSIZE]; //三元组表存储空间
int mu, nu, tu;
//原矩阵的行数、列数、非0元素个数
}Tsmtype, *Tsmlink;
//三元组表说明符
14
三元组表
例 5.3 矩阵的转置。 求矩阵A的转置矩阵B,算法很简单:
ArrayInit(&A, n, d1, d2, ..., dn) ArrayDestroy(&A)
ArrayGet(A, i1, ..., in, &e)
ArrayAssign(&A, i1, ..., in, e) }ADT Array;
数组的基本操作一般不包括插入和删除
4
5.2 数组的存储结构
存储空间是在程序执行时动态分配的
n维数组A[u1][u2]…[un]

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

Chap5 数组与广义表

Chap5 数组与广义表

15 0 0 -7 0 0 0
随机稀疏矩阵的压缩存储方法:
一、三元组顺序表 二、 十字链表
一、三元组顺序表
对于非零元素在矩阵中随机出现的稀疏矩 阵,则在存储非零元素的同时,还必须存储该 非零元素在矩阵中所处的行号和列号。我们将 这种存储方法叫做稀疏矩阵的三元组表示法。
每个非零元素在一维数组中的表示形式 如图所示:
0 12 9 0 0 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 14 0
M6 × 7 =
0 0 24 0 0 0 0
N7×6=
0 18 0 0 0 0 0
15 0 0 -7 0 0 0
0 12 9 0 0 0 0
0 0 0 0 0 0 0
-3 0 0 0 0 18 0 24 0 0 0 0 0 0 0 14 0 0 0 0 0
5.2 数组的顺序表示和实现
类型特点: 1)对于数组A,一旦给定其维数n及各维长度bi (1≤i≤n),则该数组中元素的个数是固定的, 不能对数组做插入和删除操作,不涉及移动元素 操作,因此数组采用顺序存储比较合适; 2) 数组是多维的结构,而存储空间是 一个一维 的结构, 因此有存储次序的约定问题。
L
二维数组Am*n中任一元素ai,j 的存储位置
LOC(i,j)=LOC(1,1) + (m×(j-1)+(i-1))×L
称为基地址或基址。
例:设有二维数组A[10][20],其每个元 素占2个字节,第一个元素A1,1的存储地址 为100,则按行优先顺序存储时元素A6,6的 存储地址为 A 6,6=100+[(6-1)*20+(6-1)]*2=310

ai2 ┇

i ┇ m

第五讲数组和广义表113页PPT

第五讲数组和广义表113页PPT
操作结果:若维数 n 和各维长度合法, 则构造相应的数组A,并 返回OK。
DestroyArray(&A) 操作结果:销毁数组A。
Value(A, &e, index1, ..., indexn)
初始条件:A是n维数组,e为元素变量, 随后是n 个下标值。
操作结果:若各下标不超界,则e赋值为 所指定的A 的元素值,并返 回OK。
基本操作:
InitArray(&A, n, bound1, ..., boundn) DestroyArray(&A) Value(A, &e, index1, ..., indexn) Assign(&A, e, index1, ..., indexn)
InitArray(&A, n, bound1, ..., boundn)
5.3 稀疏矩阵的压缩存储
何谓稀疏矩阵?
假设 m 行 n 列的矩阵含 t 个非零元素, 则称
mtn
为稀疏因子。 通常认为 0.05 的矩阵为稀疏矩阵。
以常规方法,即以二维数组表示 高阶的稀疏矩阵时产生的问题:
1) 零值元素占了很大空间; 2) 计算中进行了很多和零值的运算,
遇除法,还需判别除数是否为零。
Assign(&A, e, index1, ..., indexn)
初始条件:A是n维数组,e为元素变量, 随后是n 个下标值。
操作结果:若下标不超界,则将e的值赋 给所指定的A的元素,并返回 OK。
5.2 数组的顺序表示和实现
类型特点: 1) 只有引用型操作,没有加工型操作; 2) 数组是多维的结构,而存储空间是
5.1 数组的类型定义
ADT Array { 数据对象: D={a | j1,j2, ...,,ji,jn ji =0,...,bi -1, i=1,2,..,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 } 基本操作:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档