非线性数据结构 -- 图

32
1/32 非非非非非非非 -- 非 非非 非非非 非非非非 非 、、 非非 非非非非 非非非 非非 非非非非 非非非非

description

非线性数据结构 -- 图. 概念 有向图、无向图、网 存储 邻接矩阵、邻接表 遍历 深度优先、广度优先. 2.5 图的逻辑结构. 图是对结点的前趋和后继个数不加限制的数据结构 , 用来 描述元素之间“多对多”的关系。. 一 . 图的定义. 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) - PowerPoint PPT Presentation

Transcript of 非线性数据结构 -- 图

Page 1: 非线性数据结构 -- 图

1/32

非线性数据结构 -- 图概念

•有向图、无向图、网存储

•邻接矩阵、邻接表遍历

•深度优先、广度优先

Page 2: 非线性数据结构 -- 图

2/32

2.5 图的逻辑结构

图是对结点的前趋和后继个数不加限制的数据结构 , 用来描述元素之间“多对多”的关系。

Page 3: 非线性数据结构 -- 图

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

Page 4: 非线性数据结构 -- 图

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

Page 5: 非线性数据结构 -- 图

5/32

3. 边和弧边 : 无向图中顶点的偶对,写成( Vx , Vy )或( Vy , Vx )。

弧 : 有向图中顶点的偶对 ,〈 Vx,Vy 〉表示从 Vx到 Vy 。

弧头 : 弧的终点弧尾 : 弧的起点 弧 〈 Vx , Vy 〉 弧尾 Vx 弧头 Vy

Page 6: 非线性数据结构 -- 图

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 的邻接点

Page 7: 非线性数据结构 -- 图

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

Page 8: 非线性数据结构 -- 图

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

Page 9: 非线性数据结构 -- 图

9/32

7. 网、权

权 若图的边或弧带有与之相关的数,称此数为该边或弧的权。

权通常用来表示从一个顶点到另一个顶点的距离或费用。

网 带权的图称为网。

V1V1 V2V2

V3V3V4V4

G523

5

7

Page 10: 非线性数据结构 -- 图

10/32

2.6 图类的存储结构

常用的存储结构:

–邻接矩阵表示法–邻接表表示法

Page 11: 非线性数据结构 -- 图

11/32

一 . 邻接矩阵

图为 V和 E的集合 ,因此 :–用一个一维数组存放所有顶点;–用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵。

–邻接矩阵又分为有向图邻接矩阵和无向图邻接矩阵。

Page 12: 非线性数据结构 -- 图

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

Page 13: 非线性数据结构 -- 图

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

Page 14: 非线性数据结构 -- 图

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

Page 15: 非线性数据结构 -- 图

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

Page 16: 非线性数据结构 -- 图

16/32

二 . 邻接表

图的链式存储结构 1) 为每个顶点建立一个单链表, 2) 第 i 个单链表中包含顶点 Vi 的所有邻接顶点。

Page 17: 非线性数据结构 -- 图

17/32

二 . 邻接表

结点组成:

每个链表附设一个头结点,结构为:

adjvex data nextarcadjvex data nextarc

顶点 Vi的邻接点 与边或弧有关的权值

指向 Vi的下一个邻接点的指针

Vexdata firstarcVexdata firstarc

指向 Vi单链表的第一个结点存放 Vi信息

Page 18: 非线性数据结构 -- 图

18/32

1. 无向图的邻接表

V1

V2

V3

V4

V2

顶点 Vi 的度恰好就是第 i 个单链表中的结点数。o o

oo

v1 v2

v3 v4

G1

NULLNULLV3V2

NULLNULLV2

NULLNULLV2V1

V1 V4 NULLNULLV3

Page 19: 非线性数据结构 -- 图

19/32

2. 有向图 G2的邻接表

1

2

3

4

NULLNULL2 3

1

NULL1

33

2

4

G2

NULLNULL4

NULL

Page 20: 非线性数据结构 -- 图

20/32

2.7 图的遍历

图的遍历 从指定顶点出发访问图中每一个顶点,使每个顶点都被访问且只被访问一次

常用的遍历方法:–深度优先遍历法–广度优先遍历法

Page 21: 非线性数据结构 -- 图

21/32

一 . 深度优先遍历法

算法:– 1) 访问图中某个指定顶点 V0;– 2) 从 V0 出发,访问与 V0 邻接的顶点 V1 后,再从 V1 出发,访问与 V1 邻接且未被访问过的顶点 V2 。重复上述过程,直到不存在未访问过的邻接点为止。

– 3) 回退到尚未访问过的顶点 , 从该顶点出发,重复 1) 、 2) ,直到全部被访问过的邻接点都被访问为止。

Page 22: 非线性数据结构 -- 图

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 ,返回到出发点,遍历结束。

Page 23: 非线性数据结构 -- 图

23/32

二 . 广度优先遍历算法

先访问第 1个顶点所有邻接点后,再访问下一个顶点所有未被访问的邻接点。

算法– 1) 访问某个指定顶点 V0;– 2) 从 V0 出发,访问 V0的各个未曾访问的邻接点 W1, W2 ,… ,Wk; 然后 ,依此从 W1,W2,…,Wk 出发访问各自未被访问的邻接点。

– 3) 重复 2) ,直到全部顶点都被访问。

Page 24: 非线性数据结构 -- 图

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

Page 25: 非线性数据结构 -- 图

25/32

2.8 树的应用 ----Huffman 树

Huffman 树的概念构造 Huffman 树Huffman 编码

Page 26: 非线性数据结构 -- 图

26/32

一 . Huffman 树的概念

树的带权路径长度定义为:

WPL = ∑ wklkk = 1

n

其中: n 是树中叶结点的个数 wi 是第 i 个结点的权值 li 是第 i 个结点的路径长度

Huffman 树也称为最优树,是带权路径最短的一类二叉树。

Page 27: 非线性数据结构 -- 图

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 √ 按哈夫曼树构造二叉树,应用于实际问题,可提高处理效率。

Page 28: 非线性数据结构 -- 图

28/32

二 . 构造 Huffman 树

算法 :

– 1 )将 n 个带权值 wi ( i≤n )的结点构成 n棵二叉树的集合 T={T1 , T2 ,……, Tn} ,每棵二叉树只有一个根结点。

– 2 )在 T 中选取两个权值最小的结点作为左右子树,构成一个新的二叉树,其根结点的权值取左右子树权值之和;

– 3 )在 T 中删除这两棵树,将新构成的树加入到 T 中;

– 4 )重复 2 )、 3 )步,直到 T 中只含一棵树为止,该树就是 Huffman 树。

Page 29: 非线性数据结构 -- 图

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

Page 30: 非线性数据结构 -- 图

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 树,按二进制前缀编码的方式构成的编码

Page 31: 非线性数据结构 -- 图

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

前缀编码

Page 32: 非线性数据结构 -- 图

32/32

作业、思考题

1 、思考题: 3 、 4、 182 、第 2章作业 8 、 13 、 20