第05章 数组和广义表(java版)
TRANSCRIPT
《数据结构( Java版)(第 3版)》
第 5 章 数组和广义表
5.1 数组 5.2 特殊矩阵的压缩存储 5.3 广义表
《数据结构( Java版)(第 3版)》
目的和要求• 目的:线性结构到非线性结构的过渡,了解包含子结构
的线性结构,理解链式存储结构在表达非线性数据结 构中的作用。
• 内容:使用二维数组表示矩阵及运算;三角矩阵、对称矩阵、稀疏矩阵等各种压缩存储方法实现矩阵运算;
广 义表的概念、双链表示和实现。• 要求:理解多维数组的存储结构;熟悉特殊矩阵的压缩存
储方法;掌握稀疏矩阵三元组从顺序表、行的单链表 到十字链表等到多种存储结构的演变过程;理解广义 表的概念,熟悉广义表的存储结构。
• 重点:讨论多种由顺序存储结构和链式存储结构有机结合的存储结构,以矩阵为例,研究在相同的逻辑结构(矩阵)和操作要求(矩阵运算)情况下,根据各
种 矩阵的不同特性,采用多种存储结构实现矩阵运算。• 难点:稀疏矩阵的多种存储和实现,广义表的存储和
实现。• 实验:特殊矩阵和广义表的存储和运算。
《数据结构( Java版)(第 3版)》
5.1 数组5.1.1 一维数组 Loc(ai)= Loc(a0)+ i ×c
5.1.2 多维数组 ( 1 )静态顺序存储
行主序
列主序 cjniaLocaLoc ij )()()( 00
cimjaLocaLoc ij )()()( 00
《数据结构( Java版)(第 3版)》
( 2 )动态二维数组的存储结构
element[0]
element[1]
element[m-1]
…
element a00 a01
a10 a11
… a0,n-1
… a1,n-1
am-1,0 am-1,1
…
… am-1,n-1
数组名 … n-10 1数组第一维
element[i][j]
… … …
《数据结构( Java版)(第 3版)》
【例 5.1 】 矩阵类。
设 ,有设 ,有设 ,有
设 ,有
00 01 0, 1
10 11 1, 1
1,0 1,1 1, 1
¡
¡
¡ ¡ ¡ ¡
¡
n
nm n
m m m n
a a a
a a a
a a a
A
nmnmnm BAC ijijij bac
nmnmnm BAC ijijij bac
lnnmlm BAC
1
0
)(n
kkjikij bac
的转置矩阵nmmn AT jiij at
《数据结构( Java版)(第 3版)》
5.2 特殊矩阵的压缩存储5.2.1 三角矩阵、对称矩阵和对角矩阵
的压缩存储
5.2.2 稀疏矩阵的压缩存储
《数据结构( Java版)(第 3版)》
5.2.1 三角矩阵、对称矩阵和对角矩阵的压缩存储 1. 三角矩阵的压缩存储( 1 )线性压缩存储三角矩阵
1,12,11,10,1
2,21,20,2
1110
00
0
00
000
nnnnnn
nnnn
nn
aaaa
aaa
aa
a
A
nijjii
a
jiaaij
02
)1()(Loc
21)(Loc)(Loc
00
00
《数据结构( Java版)(第 3版)》
( 1 )线性压缩存储上三角矩阵
1,1
1,22,2
1,12,111
1,02,00100
000
00
0
nn
nnnn
nn
nn
nn
a
aa
aaa
aaaa
A
njijini
a
ijinnnaaij
02
)12()(Loc
)1()1()(Loc)(Loc
00
00
《数据结构( Java版)(第 3版)》
( 2 )使用三角形的二维数组压缩存储三角矩阵
《数据结构( Java版)(第 3版)》
2. 对称矩阵的压缩存储
njiijj
a
nijjii
aaij
02
)1()(Loc
02
)1()(Loc
)(Loc
00
00
jiij aa
《数据结构( Java版)(第 3版)》
3. 对角矩阵的压缩存储
1,1
11
00
00
00
00
nn
nn
a
a
a
A
1,11,2
1,22,2
2221
121110
0100
000
000
000
00
000
nnnn
nnnn
nn
aa
aa
aa
aaa
aa
A
《数据结构( Java版)(第 3版)》
5.2.2 稀疏矩阵的压缩存储
1. 表示稀疏矩阵的三元组
{(0,2,11), (0,4,17), (1,1,20), (3,0,19),(3,5,28), (4,4,50)}
5 6
0 0 11 0 17 0
0 20 0 0 0 0
0 0 0 0 0 0
19 0 0 0 0 28
0 0 0 0 50 0
A
行号 列号 元素值row colum
nvalue
《数据结构( Java版)(第 3版)》
2. 稀疏矩阵三元组顺序表
( 1 )稀疏矩阵三元组顺序表类 public class SeqSparseMatrix{ int rows, columns; // 矩阵行数、列数 SeqList<Triple> list; // 三元组顺序表}
list
65
rows columns
smata 0 2 11
0 4 17
0
1
2
3
4
5
…
1 1 20
3 0 19
3 5 28
4 4 50
row column value
Triple
element
6
len
《数据结构( Java版)(第 3版)》
2. 稀疏矩阵三元组顺序表
( 2 )获得或设置稀疏矩阵元素值( 3 )稀疏矩阵描述字符串 ( 4 )稀疏矩阵相加 【例 5.2 】三元组顺序表表示的稀疏矩阵
及其加法运算。
《数据结构( Java版)(第 3版)》
3. 稀疏矩阵三元组单链表
0 2 11 0 4 17 1 1 20 3 5 28 4 4 50
row column value
nextlist
65
rowscolumns
smat
data
∧
Triple
《数据结构( Java版)(第 3版)》
4. 稀疏矩阵行的单链表
( 1 )稀疏矩阵三元组行的单链表类public class LinkedSparseMatrix{ int rows, columns; // 矩阵行数、列数 SeqList<PolySLinkedList<Triple>> list; // 行指针顺序表,元素是多项式排序单链表}
∧
∧4 170
1
2
3
4
∧1 20
5 28
4 50
0
∧
∧
0 2 11
row column value nextlist
65
rows columns
smat
1
3
4
(Triple)data
element
6
len
《数据结构( Java版)(第 3版)》
4. 稀疏矩阵行的单链表
( 2 )获得或设置稀疏矩阵元素值( 3 )稀疏矩阵描述字符串 ( 4 )稀疏矩阵相加 ( 5 )深度拷贝及应用
《数据结构( Java版)(第 3版)》
( 6 )比较两个矩阵是否相等
∧
∧4 170
1
2
3
4
∧1 20
5 28
4 50
0
∧
∧
0 2 11
row column value nextlist
65
rows columns
smat
1
3
4
(Triple)data
调用LinkedSparseMatrix类的equals(obj)方法 调用SeqList类的
equals(obj)方法
调用SinglyLinkedList类的equals(obj)方法 调用Triple类的equals(obj)方法
《数据结构( Java版)(第 3版)》
5. 十字链表
《数据结构( Java版)(第 3版)》
十字链表存储的稀疏矩阵类public class CrossNode // 十字链表结点类{ Triple data; // 数据域表示三元
组 CrossNode right, down; //right 指向行的下
一个结点, down 指向列的下一个结点}public class CrossLinkedSparseMatrix { int rows, columns; // 矩阵行数、列数 CrossNode rowheads[],columnheads[]; // 行、列指针数组 }
《数据结构( Java版)(第 3版)》
5.3 广义表
5.3.1 广义表抽象数据类型5.3.2 广义表的存储结构5.3.3 广义表双链表示的实现 5.3.4 m 元多项式的广义表表示
《数据结构( Java版)(第 3版)》
5.3.1 广义表抽象数据类型1. 广义表定义 GList = (a0, a1,…, an-1)
中国 ( 北京 , 上海 , 江苏 ( 南京 , 苏州 ), 浙江 ( 杭州 ), 广东 ( 广州 )) L= (a, b) // 线性表,长度为 2 ,深度为 1T= (c, L)= (c, (a,b)) //L为 T 的子表, T 的长度为 2 ,深度为 2G = (d, L, T)= (d, (a, b), (c, (a, b))) //L、 T为G 的子表, G 的长度为 3 ,深度为 3S = () // 空表,长度为 0 ,深度为 1S1= (S)= (()) // 元素是一个空表,长度为 1 ,深度为 2Z = (e, Z)= (e, (e, (e, (…))))// 递归表, Z 的长度为 2 ,深度无穷
《数据结构( Java版)(第 3版)》
带表名的广义表表示
L(a,b)T(c, L(a,b))G(d, L(a,b), T(c,
L(a,b)))S()S1(())Z(e, Z(e, Z(e, Z(…))))
《数据结构( Java版)(第 3版)》
2. 广义表的特性
( 1 )线性结构 ( 2 )多层次结构,有深度 ( 3 )可共享 ( 4 )可递归
《数据结构( Java版)(第 3版)》
4. 广义表抽象数据类型 public interface GGenList<T>{ boolean isEmpty(); // 判断广义表是否空 int length(); // 返回广义表长度 int depth(); // 返回广义表深度 GenListNode<T> insert(int i, T x); // 插入原子 x 作为第 i 个元素 GenListNode<T> insert(int i, GenList<T>
glist); // 插入子表作为第 i 个元素 void remove(int i); // 删除第 i 个元素}
《数据结构( Java版)(第 3版)》
5.3.2 广义表的存储结构1. 广义表的单链表示
《数据结构( Java版)(第 3版)》
2. 广义表的双链表示
《数据结构( Java版)(第 3版)》
不带头结点的广义表双链表示对共享子表 L 进行头删除操作产生错误
G d ∧ L T ∧
datachildnext
L a ∧ b ∧ ∧
T c ∧ L ∧
(a)不带头结点的广义表双链表示
G d ∧ L T ∧
L b ∧ ∧ b ∧ ∧
T c ∧ L ∧
(b)对共享子表L进行头删除操作产生错误
a ∧没有改变
改变
《数据结构( Java版)(第 3版)》
5.3.3 广义表双链表示的实现 1. 广义表双链表示的结点类 public class GenListNode<T> { T data; // 数据域 GenList<T> child; // 指向子表 GenListNode<T> next; // 指向后继结
点}
《数据结构( Java版)(第 3版)》
2. 双链表示的广义表类 public class GenList<T> implements GGenList<T> { GenListNode<T> head; // 头指
针}例 5.3 广义表的双链表示及构造算法。
① 由原子数组构造广义表 ② 由广义表表示创建广义表
GGenList广义表接口
GenList广义表类
实现
《数据结构( Java版)(第 3版)》
由“ (d, (a,b), (c,(a,b)))” 创建的广义表没有建立共享子表
G ∧ d ∧ ∧
datachildnext
∧ a ∧ b ∧ ∧
∧ c ∧ ∧
∧ a ∧ b ∧ ∧
《数据结构( Java版)(第 3版)》
5.3.4 m 元多项式的广义表表示
53323204
53223334
8)26()26()315(
86622315),(
yyxxyxxyx
yyxyxyxyxxyxP
head∧
x 3
datachildnext
∧ 2∧
∧ ∧
x-6 2
data
1 y 0 1 y 1 1 y 3 8 y 5
系数 变量 指数
(项Term)
childnext
∧ ∧
x 4∧ -3∧x15 0 ∧ ∧