非线性数据结构 -- 图
-
Upload
calista-goodman -
Category
Documents
-
view
116 -
download
6
description
Transcript of 非线性数据结构 -- 图
1/32
非线性数据结构 -- 图概念
•有向图、无向图、网存储
•邻接矩阵、邻接表遍历
•深度优先、广度优先
2/32
2.5 图的逻辑结构
图是对结点的前趋和后继个数不加限制的数据结构 , 用来描述元素之间“多对多”的关系。
3/32
一 . 图的定义
1. 定义 : 图 G =(V , E) 其中: V: 顶点的非空集合 E: 顶点的偶对 --- 边的集合例 V={v1,v2,v3,v4} E={ ( v1,v2),(v1,v3), ( v2,v1),(v2,v3), ( v2,v4),(v3,v1), ( v3,v2),(v4,v2) }
o o
oo
v1 v2
v3 v4
G1
4/32
2. 有向图、无向图无向图 : 图中顶点的偶对是无序的,称此图为无向图,其偶对用 (vx , vy) 表示。
有向图 : 图中顶点的偶对是有序的,称此图为有向图 ,偶对用 <vx,vy> 表示。
G2= ( V, E) V={ 1,2,3,4} E={ 〈 1,2>,<1,3> ,<3,4>,<4,1>} 1
33
2
4
G2
5/32
3. 边和弧边 : 无向图中顶点的偶对,写成( Vx , Vy )或( Vy , Vx )。
弧 : 有向图中顶点的偶对 ,〈 Vx,Vy 〉表示从 Vx到 Vy 。
弧头 : 弧的终点弧尾 : 弧的起点 弧 〈 Vx , Vy 〉 弧尾 Vx 弧头 Vy
6/32
4. 邻接点顶点 : 图中的结点 邻接点 :
–无向图中,若边 (V x, V y)E , 则V x、V y互为邻接点。–有向图中,若弧 (V x, V y)E , 则V y是V x的邻接点。
VxVx VyVy
V x 、V y 互为邻接点VxVx VyVy
V y 是V x 的邻接点
7/32
5. 顶点的度无向图 :顶点的度是连接该顶点的边的条数。 例如, G1 中 V2 的度为 3 , V4 的度为 1 。有向图 1) 入度 : 以某顶点为弧头的弧的数目。
G2 中顶点 1的入度为 1。 2) 出度 :以某顶点为弧尾的弧的数目。 顶点 1的出度为 2。 3) 顶点的度 = 入度 + 出度。顶点 1的度 =2+1=3 。o o
oo
v1 v2
v3 v4
G1
1
33 4
2
G2
8/32
6. 路径、长度路径 图中从顶点 Vx 到顶点 Vy 的顶点序列称为从 Vx到 Vy 的路径 ,路径可能是不唯一的。
例如 :G1 中 V1 到 V3 的路径为 :(V1V2V3) 或 (V1V3)
G2 中, 1到 4的路径为 <134> 。长度 路径上边或弧的数目。 例如, G1 中 V1 到 V3 的长度为 1或 2; G2 中 1到 4的长度为 2。
1
33
2
4
G2
o o
oo
v1 v2
v3 v4
G1
9/32
7. 网、权
权 若图的边或弧带有与之相关的数,称此数为该边或弧的权。
权通常用来表示从一个顶点到另一个顶点的距离或费用。
网 带权的图称为网。
V1V1 V2V2
V3V3V4V4
G523
5
7
10/32
2.6 图类的存储结构
常用的存储结构:
–邻接矩阵表示法–邻接表表示法
11/32
一 . 邻接矩阵
图为 V和 E的集合 ,因此 :–用一个一维数组存放所有顶点;–用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵。
–邻接矩阵又分为有向图邻接矩阵和无向图邻接矩阵。
12/32
1. 无向图邻接矩阵定义 设图 G=(V,E) 是有 n(n1) 个顶点的图,则 G的邻接矩阵是具有下述性质的对称阵:
1 (Vi , Vj ) E A[i][j]=A[j][i] = 0 (Vi , Vj ) E G1 的邻接矩阵为:
G.nodes =
1234
A=G.edge =
0 1 1 0 1 0 1 1 1 1 0 0 0 1 0 0 4x4
o o
oo
v1 v2
v3 v4
G1
13/32
2. 有向图邻接矩阵 定义 设图 G= ( V, E)是有 n( n 1 )个顶点的
图,则 G的邻接矩阵是具有下述性质的 nxn 的方阵: 1 〈 Vi , Vj> E A[i][j] = 0 〈 Vi , Vj> E 例如, G2的邻接矩阵为:
G.nodes=
1234
A= G.Arc=
0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 4x4
1
33
2
4
G2
14/32
3. 借助邻接矩阵求顶点的度
–无向图 – 第 i 行(或第 i列)的元素之和是顶点 Vi的度。例, G1中 V2 的度是 3。
–有向图 – 第 i 行的元素之和为顶点 Vi 的出度;第j 列的元素之和为顶点 Vj 的入度。例, G2中, V2 的出度为 0, V1 的入度为 1。G1
A= G.Arc=
0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0
1
33
2
4
G2
15/32
4. 网的邻接矩阵 定义: Wij ( Vi,Vj )或〈 Vi,Vj 〉 E
A[i][j] = ( Vi,Vj )或〈 Vi,Vj 〉 E
G.nodes=
V1
V2
V3
V4
A=G.Arc=
5 3 2 7 4x4
G5 的邻接矩阵。
V1V1 V2V2
V3V3V4V4
G523
5
7
16/32
二 . 邻接表
图的链式存储结构 1) 为每个顶点建立一个单链表, 2) 第 i 个单链表中包含顶点 Vi 的所有邻接顶点。
17/32
二 . 邻接表
结点组成:
每个链表附设一个头结点,结构为:
adjvex data nextarcadjvex data nextarc
顶点 Vi的邻接点 与边或弧有关的权值
指向 Vi的下一个邻接点的指针
Vexdata firstarcVexdata firstarc
指向 Vi单链表的第一个结点存放 Vi信息
18/32
1. 无向图的邻接表
V1
V2
V3
V4
V2
顶点 Vi 的度恰好就是第 i 个单链表中的结点数。o o
oo
v1 v2
v3 v4
G1
NULLNULLV3V2
NULLNULLV2
NULLNULLV2V1
V1 V4 NULLNULLV3
19/32
2. 有向图 G2的邻接表
1
2
3
4
NULLNULL2 3
1
NULL1
33
2
4
G2
NULLNULL4
NULL
20/32
2.7 图的遍历
图的遍历 从指定顶点出发访问图中每一个顶点,使每个顶点都被访问且只被访问一次
常用的遍历方法:–深度优先遍历法–广度优先遍历法
21/32
一 . 深度优先遍历法
算法:– 1) 访问图中某个指定顶点 V0;– 2) 从 V0 出发,访问与 V0 邻接的顶点 V1 后,再从 V1 出发,访问与 V1 邻接且未被访问过的顶点 V2 。重复上述过程,直到不存在未访问过的邻接点为止。
– 3) 回退到尚未访问过的顶点 , 从该顶点出发,重复 1) 、 2) ,直到全部被访问过的邻接点都被访问为止。
22/32
V1V1
V3 V2
V5
V4
V6
G6
深度优先遍历法举例
遍历过程 访问顶点 所过边•起点 V1 V1 •V1 的第 1 个邻接点 V3 V3 ( V1 , V3 )•V3 的第 1 个邻接点 V1 已访问,取下 一个邻接点 V5 V5 ( V3 , V5 )•V5 的第 1 个邻接点 V3 已访问,取下 一个邻接点 V2 V2 ( V5 , V2 )•V2 的两个邻接点均被访问, 回退到 V5 , V5 的邻接点均被访问, 回退到 V3 , V3 的邻接点均被访问 , 回退到 V1 , V1 的另一个邻接点 V4 未被访问 V4 ( V1 , V4 )•V4 的第一个邻接点 V1 已被访问, 另一个邻接点 V6 未被访问 V6 ( V4 , V6 )•V6 的邻接点被访问,回退到 V4
•V4 的邻接点均被访问•回退到 V1 ,返回到出发点,遍历结束。
23/32
二 . 广度优先遍历算法
先访问第 1个顶点所有邻接点后,再访问下一个顶点所有未被访问的邻接点。
算法– 1) 访问某个指定顶点 V0;– 2) 从 V0 出发,访问 V0的各个未曾访问的邻接点 W1, W2 ,… ,Wk; 然后 ,依此从 W1,W2,…,Wk 出发访问各自未被访问的邻接点。
– 3) 重复 2) ,直到全部顶点都被访问。
24/32
广度优先遍历法举例
遍历过程 访问顶点 所过边•起点 V1 V1 •访问 V1 的未被访问过 的所有邻接点 V3,V2,V4 (V1,V3) (V1,V2) (V1,V4)•访问 V3 的未被访问过 的所有邻接点 V5 (V3,V5)•访问 V2 的未被访问过 的所有邻接点 无•访问 V4 的未被访问过 的所有邻接点 V6 (V4,V6)•所有顶点已被访问 , 结束
V1V1
V3 V2
V5
V4
V6
G6
25/32
2.8 树的应用 ----Huffman 树
Huffman 树的概念构造 Huffman 树Huffman 编码
26/32
一 . Huffman 树的概念
树的带权路径长度定义为:
WPL = ∑ wklkk = 1
n
其中: n 是树中叶结点的个数 wi 是第 i 个结点的权值 li 是第 i 个结点的路径长度
Huffman 树也称为最优树,是带权路径最短的一类二叉树。
27/32
Huffman 树举例 以下三棵树带权路径之和:
( a ) ( b)
( c)a
b
c d
a b c d
a
c
b
d7
7
7
5
5
52
2
2
4 4
4WPLa =7x2+5x2+2x2+4x2
= 36WPLb =7x3+5x3+2x1+4x2
= 46
WPLc =
7x1+5x2+2x3+4x3
= 35 √ 按哈夫曼树构造二叉树,应用于实际问题,可提高处理效率。
28/32
二 . 构造 Huffman 树
算法 :
– 1 )将 n 个带权值 wi ( i≤n )的结点构成 n棵二叉树的集合 T={T1 , T2 ,……, Tn} ,每棵二叉树只有一个根结点。
– 2 )在 T 中选取两个权值最小的结点作为左右子树,构成一个新的二叉树,其根结点的权值取左右子树权值之和;
– 3 )在 T 中删除这两棵树,将新构成的树加入到 T 中;
– 4 )重复 2 )、 3 )步,直到 T 中只含一棵树为止,该树就是 Huffman 树。
29/32
构造 Huffman 树举例
以权值分别为7,5,2,4的结点a、b、c、d构造Huffman树。
(1)T= { a b c d }
(2)T= { a b T3 }
(3)T= { a T2 }
(4)T={ T1 }
c d
T3
b T1
T2
2 4
6
65
11
b
T2
65
11
c d2 4
18
a T2
7 11
T118
a7
T1
b T1
T2
65
11
18
a7
T1
b5
11
c d2
6
4
30/32
三 . Huffman 编码
编码:用二进制数的不同组合来表示字符。 前缀编码:一种非等长编码。任一个字符的编码都
不是另一个字符编码的前缀。
a0
b0
1
c d0
1
1
编码: A( 0 )
B ( 10 )
C ( 110 )
D ( 111 )
方法约定:1 )左分支为‘ 0’
2 )右分支为‘ 1’
3 )由根到叶路径上字符组成的二进制串就是该叶结点的编码。
Huffman 编码:一种前缀编码。以给定权值的结点构造 Huffman 树,按二进制前缀编码的方式构成的编码
31/32
P.31
例:设要传送的电文是: abaccda ,有 4 个字符 abcd ,可分别编码为 00 、 01 、 10 、 11 ,则电文是: 00010010101100 ,共 14 位,可采用哈夫曼编码缩短长度: 字母 abcd 出现频率分别为: 3 、 1 、 2 、 1 。
W={3 1 2 1} 3 1 2 1
W={3 2 2}1 1
2 W= {3 2 2}
1 1
22
4
W={3 4}
1 1
22
4
1 1
22
43a
c
b d
0 1
0
0
1
1
a b c d 0 110 10 111
abaccda 0110010101110
前缀编码
32/32
作业、思考题
1 、思考题: 3 、 4、 182 、第 2章作业 8 、 13 、 20