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

合集下载

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、三元组表示法 用一个线性表来表示稀疏矩阵,线性表的每个 结点对应稀疏矩阵的一个非零元素。其中包括三个 域,分别为该元素的行下标、列下标和值。结点间 的先后顺序按矩阵的行优先顺序排列(跳过零元 素),将线性表用顺序的方法存储在连续的存储区 里。

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

数据结构第五章数组和广义表
typedef elemtype Array2[m][n]; 等价于
typedef elemtype Array1[n]; typedef Array1 Array2[m]; 同理,可以用 n-1 维数组的数据类型来定义 n 维数组。
8
第8页
5.2 数组的顺序存贮结构
一、数组的顺序表示和实现
(1) 类型特点 ① 只有引用型操作,一般不作插入或删除操作; ② 数组是多维的结构,而存储空间是一个一维的结构。
第 17 页
(2) 压缩存储的有关概念 ① 压缩存储:为多个值相同的元素分配一个存储空间,对零 元不分配空间。 ② 特殊矩阵:值相同的元素或零元素在矩阵中的分布有一定 规律。 ③ 稀疏矩阵:值相同的元素或者零元素在矩阵中的分布无规 律。
第 18 页
(3) 特殊矩阵
① 概念:若n阶矩阵 A 中的元满足:aij=aji 1≤i,j≤n,则 称为n 阶对称矩阵。
第1页
第五章 数组和广义表
5. 1 数组的定义 5.2 数组的顺序存储结构 5. 3 矩阵的压缩存储 5. 4 广义表的定义 5.5 广义表的存储结构
第2页
第五章 数组和广义表
前4章介绍的数据结构共同特点: ▲ 都属于线性数据结构; ▲ 每种数据结构中的数据元素,都作为原子数据, 不再进行分解; 本章讨论的两种数据结构:数组和广义表,其共 同特点是: ▲ 从逻辑结构上看它们,可看成是线性结构的一 种扩展; ▲ 数据元素本身也是一个数据结构;
4
第4页
(2) 二维数组的解释
二维数组中的每个元素都受两个 线性关系的约束,即行关系和列关系, 在每个关系中,每个元素aij都有且仅 有一个直接前趋,都有且仅有一个直 接后继。
aa … 00 01

数据结构第5章数组和广义表2广义表ppt课件PPT精品文档33页

数据结构第5章数组和广义表2广义表ppt课件PPT精品文档33页
所以在对应的存储结构中,其存储结点也有相应划分。 对于原子结点,应包含值域; 对于表结点,应包含指示表头的表头指针域(指向
表中的第一个元素)和指示表尾的表尾指针域(指向除 去原表头元素后的广义表)。
4)D=( A , B ,C )
n=3,3个元素都是子表
5)E=(a, E)
n=2,a 为原子,E为子表
D=(A,B,C)=(( ),(e),(a,(b,c,d))),共享表
E=(a,E)=(a,(a,E))= (a,(a,(a,…….))),E为递归表
§5.4 广义表的类型定义
❖试用图形表示下列广义表
§5.4 广义表的类型定义 ❖广义表的特点
▪ 可共享
广义表的元素可以为其他广义表所共享 A = ( a , B ) =( a , ( b , c , d ) )
§5.4 广义表的类型定义
❖例1:求下列广义表的长度
1)A =( )
n=0,因为A是空表
2)B = ( e )
n=1,表中元素e是原子
3)C =( a ,( b , c , d ) ) n=2,a 为原子,(b, c, d)为子表
6. GetHead{ ( ( ) ) }= ( ) .
7. GetTail{ ( ( ) ) }= ( ) .
(a, b)
§5.4 广义表的类型定义 ❖注意:( )和( ( ) )的区别
前者为空表,长度=0,深度=1; 后者长度=1,深度=2,表头、表尾均为( )
§5.5 广义表的存储结构
❖广义表的存储结构
§5.4 广义表的类型定义
❖广义表的特点
▪ 有深度
广义表的深度定义为广义表中括弧的最大重数
如: H = (d, (e,( )))深度为3 注意:(1)空表的深度为1;

计算机基础综合PPT课件之数据结构-数组与广义表

计算机基础综合PPT课件之数据结构-数组与广义表

数组的定义(3)
基本操作: InitArray(&A, n, bound1,…boundn) //构造数 组A,维数n,各维长度bound1,…boundn DestroyArray(&A) //销毁数组A Value(A, &e, index1,…indexn) //将指定的A元素赋给e Assign(&A, e, index1,…indexn) //将e的值赋给所指定的A的元素
} //for arow } //if return OK; }
链式存储结构
• 带行指针向量的单链表表示法 – 每行的非0元素链成一个单链表 – 每行的头指针组成一个表头指针数组
链式存储结构(2)
• 十字链表表示法
– 在链表中每个非0元素用一个含5个域的结点表示. – 每行的头指针组成一个一维数组 – 每列的头指针组成一个一维数组
零元素的位置
else cb=B.tu+1;
// brow为B的最后一行
for (q=B.rpos[brow];q<cb;++q) {
ccol=B.data[q].j;
//乘积元素在Q中列号
ctemp[ccol]= ctemp[ccol]+A.data[p].e*B.data[q].e;
} //for q
a00
a01 ... a0, n 1
Am n
a10
...
a11
...
a1, n 1
... ... ...
am 1,0
am 1,1
...
am
1,
n
1
数组的定义(2)
• 数组定义方式2(抽象数据类型数组)

第五部分数组和广义表教学课件

第五部分数组和广义表教学课件

的 压
常数。下三角矩阵正好相反,它的主对角线上方均为常数, 如图所示。在大多数情况下,三角矩阵常数为零。


a00 0 0 …….. 0

a10 a11 0 …….. 0
…………………. 0 an-10 an-11 an-12…….. an-1n-1
三角矩阵中的重复元素c可共享一个存储空间,其

余的元素正好有n(n+1)/2个,因此,三角矩阵可压缩
ji =0,...,bi -1, i=1,2,..,n
}
数据关系:
R1={ 0
a a <

j1 … ji…,jn jk bk -1,
1j1


kji+1…njn
>| 且k i,
0 ji bi -2, i=2,...,n, 0 ji bi -2,}
二维数组的定义:
数 数据对象:


以行序为主序(低下标优先)
以列序为主序(高下标优先)
0
a00
按行序为主序存放
1
a01

…….
组 的
n-1 a0n-1

n
a10
序 表 示
a00 a01 …….. a0n-1 a10 a11 …….. a0n-1
a11 ……..

a1n-1

………………….
……….

am-10am-11 …….. am-1n-1

10
11
1 n-2

A
=
m* n
...
... ...
...
a
a

数据结构课件PPT数组和广义表

数据结构课件PPT数组和广义表
T.mu=M.nu; T.nu=M.mu; T.tu=M.tu; if (T.tu)
{ q=1; for (col=1;col<=T.mu;++col) for(p=1;p<=M.tu;++p) if ( M.data[p].j==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; ++q; } }
(row) (col) (value)
[0] 1 4 22
[0] 1 5 91
[1] 1 7 15
[1] 2 2 11
[2] 2 2 11
[2] 3 6 28
[3] 2 [4] 3来自6 17 4 -6[3] 4 [4] 4
1 22 3 -6
[5] 4 6 39
[5] 6 2 17
[6] 5 1 91
[6] 6 4 39
cpot[1]=1 cpot[col]=cpot[col-1]+num[col-1]
稀疏矩阵的快速转置(算法5.2)
Status FastTransposeSMatrix(TSMatrix M,TSMatrix &T) { T.mu=M.nu; T.nu=M.mu; T.tu=M.tu;
if (T.tu) { for (col=1;col<=M.nu;++col) num[col]=0; for (t=1;t<=M.tu;++t) ++num[M.data[t].j]; cpot[1]=1; for ( col=2;col<=M.nu;++col) cpot[col]=cpot[col-1]+num[col-1]; for (p=1;p<=M.Tu;++p) { col=M.data[p].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]; } }

大学数据结构课件--第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

《数据结构》第5章数组和广义表.ppt

《数据结构》第5章数组和广义表.ppt

28
28
5.3.2(续)三元组顺序表上的转置(二)
2019/12/8
9
9
5.3 矩阵的压缩存储
压缩存储:为多个值相同的非零元素只分 配一个存储空间;对零元素不分配空间。
2019/12/8
10
10
5.3.1特殊矩阵的压缩存储
特殊矩阵:非零元素按照一定的规律分布。
常见的特殊矩阵有对称矩阵、三角矩阵、对角矩 阵等。 对称矩阵:元素的值按照主对角线对称
列优先顺序——先排最左下标,从右向左, 最后排最左下标。
例如:三维数组Am*n*p以行优先方式顺序 存储,则 LOC(aijk)=LOC(a111)+[(i-1)*m*n+ (j-1)*n+(k-1)]*d
2019/12/8
8
8
数组存储的特点
只要知道开始结点的存放地址(即基地址)、维 数和每维的上、下界,以及每个数组元素所占用 的单元数,就可以将数组元素的存放地址表示为 其下标的线性函数。因此,数组中的任一元素可 以在相同的时间内存取,即顺序存储的数组是一 个随机存取结构。
二维数组A可以看成是由m个行向量组成的向量, 也可以看成是n个列向量组成的向量。
数组一旦被定义,它的维数和维界就不再改变。 因此,除了结构的初始化和销毁之外,数组只 有存取元素和修改元素值的操作。
2019/12/8
4
4
5.2 数组的顺序表示
由于计算机的内存结构是一维的,因此用一维 内存来表示多维数组,就必须按某种次序将数 组元素排成一列序列,然后将这个线性序列存 放在存储器中。
数组一旦建立,结构中的元素个数和元素间的 关系就不再发生变化。因此,一般采用顺序存 储的方法来表示数组。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
储,则二维数组 A 中任一元素 aij 的存储位置可以由下面定位公式 确定
LOC (A[i],[ j]) = LOC (A[1], [1]) + n*(i-1)+(j-1) 其中:
1
第 5 章 数组和广义表
5.15.数1 数组组的的逻逻辑辑结结构构 5.25.数2 数组组的的顺顺序序存存储储结结构构 5.35.矩3 矩阵阵的的压压缩缩存存储储 5.45.广4 广义义表表
2
5.1 数组的逻辑结构
数组 (array) 是最常用的ห้องสมุดไป่ตู้据结构之一。几乎所有 的程序设计语言都把数组类型设定为固有类型。
顺序存储的定位公式 数组的顺序存储表示 基本操作的算法描述
5.2.1 顺序存储的定位公式 10
用顺序存储结构来存储数组中的元素,一定要按照 某种次序将元素排成一个线性序列。有两种存储方式:
(1) 以列为主序 ( column major order ) 的存储方式, 即按列优先,逐列顺序存储。
(2) 以行为主序 ( row major order ) 的存储方式,即 按行优先,逐行顺序存储。
B=(β1β2β3 … , βm) βi = ( ai 1 , ai 2 , … , ai, n )
Am×n = ( ( a11 a12 … a1, n ) ,
1≤i ≤m
( a21 a22 … a2, n ) , … , …, ( am, 1am, 2… am, n ) )
6
数组一旦被定义,它的维数和维界就 不再改变。因此,除了结构的初始化和销 毁之外,数组只有存取数据元素和修改数 据元素值的操作。
数组的地址计算
14
(1)一维数组的地址计算:
设一维数组为:A=(a1,a2,…,ai,…,an),数组中每个元 素占size个存储单元,则元素ai的存储地址为:
Loc(A[i])=Loc(A[1])+(i-1)*size。
⑵二维数组的地址计算
15
假设每个数据元素占 1 个存储单元,且以行序为主序的进行存
5.1.2 数组的抽象类型定义
ADT Array { D={aj1j2j3…..jn|n>0, 称 为 数 组 的 维 数 , ji 是 数 组 的 第 i 维 下
标,1≤ ji ≤bi, bi为数组第i维的长度, aj1j2j3…..jn∈ElementSet} 数据关系:R ={R1,R2, …….Rn}
可以把二维数组看成是这样一个定长线性表:它的 每个数据元素也是一个定长线性表。
例如,下面是一个二维数组,且以 m 行 n 列的矩阵 形式表示。
a11 a12 a13 … a 1.n
a21 a22 a23 … a2, n
Am×n =


………
am1 am2 am3 … am, n
二维数组 A 还可以看成是一个线性表:
12
a11
(1)
A1
a12

(1)
a11,.nn
LO(AC 2 )LO(a2 C1 )
a21
(1)
A2
a22

a2, n
(1)
LO(AC m)LO(aC m,1)
(1)
Am
行主次序存放

am, 1 am, 2
……
amm,, nn
13
对于数组,一旦规定了它 的维数和各维的长度,便可以 为它分配存储空间。反之,只 要给出一组下标,便可以求得 相应数组的存储位置。
线性结构中的数据都是非结构的原子类型,元素的 值是不再分解的。而数组可以看成是线性表在下述含义 上的扩展: 表中的数据元素本身也是一种数据结构。
数组的定义 数组的基本操作
5.1.1 数组的定义
3
数组是由下标和值组成的序对集合。在数组中,一 旦给定下标,都存在一个与其相对应的值,这个值就称 为数组元素。
(1)
LO(AC 1 )LO(a1 C 1 )
11
a11
(1)
A1
a21

(1)
aAmm, ,1
LO(AC 2 )LO(a1 C 2 )
a12
(1)
A2
a22

am, 2
(1)
LO(A C n )LO(aC 1n)

a1, n
列主次序存放
(1)
An
a2, n

amm, nn
(1)
LO(AC 1 )LO(a1 C 1 )
5.1.2 数组的抽象类型定义 8
•DestroyArray(A):销毁数组A。
•GetValue(A,e, index1, … , indexn ): 初始条件:A 是 n 维数组,e 为元素变量,随后是
n 个下标值。 操作结果:若各下标合法,则用e返回数组A中由 由index1,… indexn所指定的元素的值.
Ri=<aj1…ji….jn,aj1…ji+1…jn>| 1≤jk ≤bk, 1≤k≤n 且 k≠i, 1≤ji ≤bi-1, aj1…j2….jn,aj1…ji+1…jn∈D,i=1,…n}
基本操作:
• InitArray (A, n, bound1, … , boundn ); 操作结果:如果维数 n 和各维长度合法,则构造 相应的数组 A,并且返回 TRUE。
• SetValue ( A, e, index1, … , indexn ); 初始条件:A 是 n 维数组,e 为元素变量,随后是 n 个下标值。 操作结果:若各下标合法,则将数组A中由
index1,… indexn所指定的元素的值置为e.
9
5.2 数组的顺序存储结构
由于内存储器的结构是一维的。一维数组可直接采 用顺序存储。用一维的内存存储表示多维数组时,需按 某种次序将数组中元素排成一线性序列,再将这个线性 序列存放在一维的内存中,即数组的顺序存储结构表示。
也可以说,数组中的每个数据元素都对应于一组下 标( j1 , j2 , … , jn ),每个下标取值范围是 1≤ji≤bi , bi 称 为第 i 维的长度( i = 1, 2, …, n)。显然,当 n = 1 时,n 维数组就退化为定长的线性表。反之,n 维数组也可以看 成是线性表的推广。
4
5
A = (α1, α 2, … , α n )
每个数据元素α j是一个列向量形式的线性表
α j = ( a1j , a2j , … , am, j )
1≤j ≤n
a11
a21
Am×n =

am,1
a12 a22 …
am, 2
a13 a23 ……
am, 3
a1, n a2, n …
am, n
每个数据元素是一个行向量形式的线性表
相关文档
最新文档