数据结构第五章 数组和广义表
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
474 head
04a
11b 23c
36d^
第五章 递归和广义表
40
稀疏矩阵的行指针三元组链表
➢ 给三元组链表的每一行设计一个头指针, 这些头指针构成一个指针数组,指针数 组中的每一行的指针指向该行的三元组 链表。
➢ 由于链表中每一行的行下标均相同,所 有此时也可以去掉三元组中的行下标
第五章 递归和广义表
0
半带宽为b的对角矩阵
第五章 递归和广义表
19
三对角矩阵
a00 a01
0
0
a10
a11
a源自文库2
A= 0
0
a a a (n 2)(n 3) (n 2)(n 2) (n 2)(n 1)
0
0
a a (n 1)(n 2) (n 1)(n 1)
第五章 递归和广义表
20
41
0000a00
0
0b00000
1
000c000
2
0 0 0 0 0 0 d 4×7 3
4a^ 1b^ 3c^ 6 d^
第五章 递归和广义表
42
稀疏矩阵的十字链表存储结构
➢ 为稀疏矩阵的每一行设置一个单独链表, 同时也为每一列设置一个单独链表。
第五章 递归和广义表
43
i j num down right
k=
2
j( j 1) i i< j
2
第五章 递归和广义表
13
➢ n阶下三角矩阵:行列均为n的矩阵中, 上三角(不包括对角线)中的数据元素 均为常数c或0。
第五章 递归和广义表
14
a00 0 ...... 0
A=
a10 a11 ...... 0
an-1,0...... an-1,n-1
i(i 1) j 当i≥j时
Loc(ai)=Loc(a0)+i*k (0≤i<n)
第五章 递归和广义表
3
➢ 二维数组的“行优先存储”:即一行存 完后再存放下一行。
a1,1 a1,2...... a1,n
A=
A2,1 a2,2...... a2,n
am,1 am,2...... am,n
b1=m b2=n
A1,1 a1,2...... a1,n a2,1 a2,2...... a2,n ...... am,1...... am,n
第五章 递归和广义表
7
解:由于C语言中数组的行、列下界均为0, 该数组行上界为5-1=4,列上界为4-l=3,所以该数 组的元素数目共有(4-0+1)*(3-0+1)=5*4=20个。
又由于C语言采用行序为主序的存储方式,则 有:
LOC(a3,2)=LOC(a0,0)+(i*n+j)*k
=2000+(3*4+2)*4=2056
第五章 递归和广义表
9
对称矩阵的压缩存储
➢ n阶对称矩阵若一个n阶矩阵A中的数据 元素满足aij=aji (0≤i,j ≤n-1) 。
a00 a01...... a0,n-1
A=
a10 a11...... a1,n-1
an-1,0...... an-1,n-1
第五章 递归和广义表
10
➢ 在存储时可只存储对称矩阵中的上三角 或下三角的数据元素,即让对称的数据 元素共享一个存储空间,这样就可将n² 个数据元素压缩存储到n(n+1)/2个数据元 素空间中。
第五章 递归和广义表
26
5.2 稀疏矩阵
第五章 递归和广义表
27
➢ 稀疏矩阵:矩阵中的零元素非常多的矩 阵称作稀疏矩阵。对于一个m×n的矩阵, 设s为矩阵元素的个数,有s=m*n,设t为 矩阵中非零元素的总和,满足t<<s的矩 阵。
➢ 稠密矩阵:一个不稀疏的矩阵称作稠密 矩阵。
第五章 递归和广义表
➢ 列数
:n
➢ 非零个数 : num
➢ 三元组空间: 三元组1 三元组2 ……
第五章 递归和广义表
31
例如:
0000a00 0b00000 000c000 0 0 0 0 0 0 d 4×7
按行存储三元组
row:4 col: 7 num:4 (0,4,a) (1,1,b) (2,3,c) (3,6,d)
第五章 递归和广义表
11
SA a00a10 a11...... an-1,0 an-1,1 ...... an-1,n-1
第五章 递归和广义表
12
a00 a01...... a0,n-1
A=
a10 a11...... a1,n-1
an-1,0...... an-1,n-1
i(i 1) j i>=j
k=
2
n(n 1) 当i< j时
2
第五章 递归和广义表
15
➢ n阶上三角矩阵:行列均为n的矩阵中, 下三角(不包括对角线)中的数据元素 均为常数c或0。
第五章 递归和广义表
16
a00 a01...... a0,n-1
A=
0 a11...... a1,n-1
0 ...... an-1,n-1
i(2n i 1) j i 当i≥j时
24
解: 按行优先的存储次序:
A[0][0][0][0], A[0][0][0][1], A[0][0][1][0], A[0][0][1][1], A[0][1][0][0], A[0][1][0][1], A[0][1][1][0], A[0][1][1][1], A[1][0][0][0], A[1][0][0][1], A[1][0][1][0], A[1][0][1][1], A[1][1][0][0], A[1][1][0][1], A[1][1][1][0], A[1][1][1][1]
234 h3
h4
第五章 递归和广义表
46
5.3 广义表的定义
第五章 递归和广义表
47
➢ 广义表:n个元素的一个序列,若n=0时 则称为空表。设ai为广义表的第i个元素, 则广义表GL的一般表示为:
GL=(a1,a2,…,ai,…,an) ➢ N为广义表的长度,n≥0。
k=
2
n(n 1) 2
当i< j时
第五章 递归和广义表
17
对角矩阵的压缩存储
➢ n阶对角矩阵:一个n阶矩阵满足其所有 的非零元素都集中在以主对角线为中心 的带状区域中的矩阵。
➢ 矩阵半带宽b:主对角线上下方各有b条 次对角线,则矩阵的带宽为(2b+1)。
第五章 递归和广义表
18
b条
...
0
b条
...
第五章 递归和广义表
8
5.1.3 特殊矩阵的压缩存储
➢ 特殊矩阵是指非零元素或零元素的分布 有一定规律的矩阵,为了节省存储空间,特 别是在高阶矩阵的情况下,可以利用特殊 矩阵的规律,对它们进行压缩存储,也就是 说,使多个相同的非零元素共享同一个存 储单元,对零元素不分配存储空间。
➢ 特殊矩阵的主要形式有对称矩阵、对角 矩阵等,它们都是方阵,即行数和列数相同。
第五章 递归和广义表
32
假设有一个6×7阶稀疏矩阵A(为图示方便,我 们所取的行列数都很小),A中元素如下图所示。则 对应的三元组线性表为:
((0,2,1),(1,1,2),(2,0,3),(3,3,5), (4,4,6),(5,5,7),(5,6,4))
0 0 1 0 0 0 0
0 2 0 0 0 0 0
3 0 0 0 0 0 0 A67 0 0 0 5 0 0 0
0 0 0 0 6 0 0
0 0 0 0 0 7 4
第五章 递归和广义表
一个稀疏矩阵A
33
稀疏矩阵相加
0000200
+ 0 3 0 0 0 0 0
0004000 0 0 0 0 0 0 5 4×7
0700400 0005000 0004000 0 0 9 0 0 0 2 4×7
第五章 递归和广义表
22
3. 本行第3个元素:k=2+3(i-1)+2=3i+1 而j=i+1,则k=2i+(i+1)=2i+j;
总之:k=2i+j
第五章 递归和广义表
23
例5.2 按行优先顺序和按列优先顺序列出 四维数组A[2][2][2][2]所有元素在内存中的 存储次序。
第五章 递归和广义表
7 ×4
第五章 递归和广义表
36
转置算法思想: (1) m , n 互换;(2) i , j 互换; (3) 重排三元组顺序;
(ije)
(ije)
(001) (042) (113) (234) (355) (366) m n num 47 6
(001) (113) (324) (402) (535) (636) m n num 74 6
i j next down right
i j value down right
十字链头结点结构 行、列头结点结构
结点结构
第五章 递归和广义表
44
一个稀疏矩阵
1 0 0 2 B34 0 0 3 0
0 0 0 4
第五章 递归和广义表
45
h0
h1
h2
h3
h4
34 hm
0 01 h1
h2
03 2 1 23
(135)
(329)
(238)
m n num
(362)
(329)
47 4
m n num
(367)
47 6
m n num
47 7
M1
M2
M
第五章 递归和广义表
35
稀疏矩阵转置运算
T 1 0 0 0 2 0 0
0300000 0004000 0000056
=
4×7
1000 0300 0000 0040 2000 0005 0006
➢ 第0行和第n-1行 2个非零元素
➢ 其余各行
3个非零元素
➢ 若把非零元素存放在数组SA中
第五章 递归和广义表
21
➢ 对于不在第0行的非零元素aij: 1. 本行第1个元素:k=2+3(i-1)=3i-1
而j=i-1,则k=2i+(i-1)=2i+j;
2. 本行第2个元素:k=2+3(i-1)+1=3i 而j=i,则k=2i+i=2i+j;
第五章 递归和广义表
37
5.2.2 稀疏矩阵的三元组链表
➢ 头结点的行号域存储了稀疏矩阵的行数, 列号域存储了稀疏矩阵的列数。
➢ 用链指针依次把稀疏矩阵中非零元的三 元组链接起来就构成了最简单的三元组 链表。
第五章 递归和广义表
38
m n num head
……
第五章 递归和广义表
39
0000a00 0b00000 000c000 0 0 0 0 0 0 d 4×7
28
三元组顺序表
稀疏矩阵的压缩 存储结构
三元组链表
一般链表 行指针数组的链表
行列指针的十字链表
第五章 递归和广义表
29
➢ 三元组顺序表:用顺序表存储的三元组表。
➢ 三元组链表:用链表存储的三元组表。 行号 列号 元素值
第五章 递归和广义表
30
5.2.1 稀疏矩阵的三元组顺序存储 结构
➢ 行数
:m
第五章 递归和广义表
4
➢ 设a1,1是第1行第1列的数组元素,Loc(a1,1) 是a1,1的存储地址,k是每个数据元素所 需的存储单元,则数组中任一数据元素 aij的存储地址Loc(aij)可由下边公式求出:
Loc(ai,j)=Loc(a1,1)+((i-1)*n+(j-1))*k
(0 <i ≤ m,0 <j ≤ n)
5.1 数组
第五章 递归和广义表
1
5.1.1 数组的定义
➢ 数组(Array) :是n(n>1)个相同数据类型的 数据元素a1,a2,a3,…,an构成的占用一块地址连 续的内存单元的有限序列。
第五章 递归和广义表
2
5.1.2 数组的存储结构
➢ 对一个有n个数据元素的一维数组,设a0 是下标为0的数组元素,Loc(a0)是a0的存 储地址,k是每个数据元素所需的存储单 元,则数组中任一数据元素ai的存储地址 Loc(ai)可由下边公式求出:
0700600
= 0305000 0008000
0 0 9 0 0 0 7 4×7
第五章 递归和广义表
34
(ije)
(ije)
(ije)
p1 ( 0 4 2 ) p2 ( 0 1 7 )
p( 0 1 7 )
+ = ( 1 1 3 )
(234)
(044) (135)
(046) (113)
(365)
(234)
第五章 递归和广义表
25
按列优先的存储次序: A[0][0][0][0], A[1][0][0][0], A[0][1][0][0], A[1][1][0][0], A[0][0][1][0], A[1][0][1][0], A[0][1][1][0], A[1][1][1][0], A[0][0][0][1], A[1][0][0][1], A[0][1][0][1], A[1][1][0][1], A[0][0][1][1], A[1][0][1][1], A[0][1][1][1], A[1][1][1][1]
第五章 递归和广义表
5
同理可推出在以列序为主序的计算机系统中有: LOC(ai,j)=LOC(a1,1)+[(j-1)*m+(i-1)]*k 其中m为行数。
第五章 递归和广义表
6
例5.1 对二维数组float a[5][4]计算:
(1) 数组a中的数组元素数目;
(2) 若数组a的起始地址为2000,且每个数组 元素长度为32位(即4个字节),数组元素a[3][2] 的内存地址。