1 / 32

非线性数据结构 -- 图

非线性数据结构 -- 图. 概念 有向图、无向图、网 存储 邻接矩阵、邻接表 遍历 深度优先、广度优先. 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)

Télécharger la présentation

非线性数据结构 -- 图

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 非线性数据结构--图 • 概念 • 有向图、无向图、网 • 存储 • 邻接矩阵、邻接表 • 遍历 • 深度优先、广度优先

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

  3. 一. 图的定义 • 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) } v1 v2 o o o o v4 v3 G1

  4. 2. 有向图、无向图 • 无向图: 图中顶点的偶对是无序的,称此图为无向图,其偶对用(vx,vy)表示。 • 有向图: 图中顶点的偶对是有序的,称此图为有向图,偶对用<vx,vy>表示。 • G2=(V,E) V={ 1,2,3,4} E={〈1,2>,<1,3> ,<3,4>,<4,1>} 1 2 G2 3 4

  5. 3. 边和弧 • 边:无向图中顶点的偶对,写成(Vx,Vy)或(Vy,Vx)。 • 弧:有向图中顶点的偶对,〈Vx,Vy〉表示从Vx到Vy。 • 弧头:弧的终点 • 弧尾:弧的起点 弧 〈Vx,Vy〉 弧尾Vx 弧头Vy

  6. Vx Vy Vx、Vy互为邻接点 Vx Vy Vy是Vx的邻接点 4. 邻接点 • 顶点:图中的结点 • 邻接点: • 无向图中,若边(Vx,Vy)E, 则Vx、Vy互为邻接点。 • 有向图中,若弧(Vx,Vy)E, 则Vy是Vx的邻接点。

  7. 1 2 G2 3 4 5. 顶点的度 • 无向图:顶点的度是连接该顶点的边的条数。 例如,G1中V2的度为3,V4的度为1。 • 有向图 1)入度:以某顶点为弧头的弧的数目。 G2中顶点1的入度为1。 2)出度:以某顶点为弧尾的弧的数目。 顶点1的出度为2。 3)顶点的度=入度+出度。顶点1的度=2+1=3。 v2 o v1 o G1 o o v4 v3

  8. 6.路径、长度 • 路径 图中从顶点Vx到顶点Vy的顶点序列称为从Vx到Vy的路径,路径可能是不唯一的。 例如:G1中V1到V3的路径为:(V1V2V3)或(V1V3) G2中,1到4的路径为<134>。 • 长度 路径上边或弧的数目。 例如,G1中V1到V3的长度为1或2; G2中1到4的长度为2。 o o v2 v1 1 2 G2 G1 o 3 4 o v4 v3

  9. 7.网、权 • 权 若图的边或弧带有与之相关的数,称此数为该边或弧的权。 权通常用来表示从一个顶点到另一个顶点的距离或费用。 • 网 带权的图称为网。 5 V1 V2 3 2 G5 V3 V4 7

  10. 2.6 图类的存储结构 常用的存储结构: • 邻接矩阵表示法 • 邻接表表示法

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

  12. 1.无向图邻接矩阵 • 定义 设图G=(V,E)是有n(n1)个顶点的图,则G的邻接矩阵是具有下述性质的对称阵: 1 (Vi,Vj) E A[i][j]=A[j][i] = 0 (Vi,Vj) E G1的邻接矩阵为: v1 v2 o o o o v3 v4 G1 0 1 1 0 1 0 1 1 1 1 0 0 0 1 0 0 1 2 3 4 G.nodes = A=G.edge = 4x4

  13. 2.有向图邻接矩阵 • 定义 设图G=(V,E)是有n(n  1)个顶点的图,则G的邻接矩阵是具有下述性质的nxn的方阵: 1 〈Vi,Vj> E A[i][j] = 0 〈Vi,Vj> E 例如,G2的邻接矩阵为: 1 2 3 4 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 G.nodes= A= G.Arc= 4x4 1 2 G2 3 4

  14. 3.借助邻接矩阵求顶点的度 • 无向图 • 第i行(或第i列)的元素之和是顶点Vi的度。例,G1中V2的度是3。 • 有向图 • 第i行的元素之和为顶点Vi的出度;第j列的元素之和为顶点Vj的入度。例,G2中,V2的出度为0,V1的入度为1。 G1 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 A= G.Arc= 1 2 G2 3 4

  15. 4.网的邻接矩阵 • 定义: Wij (Vi,Vj)或〈Vi,Vj〉 E A[i][j] =  (Vi,Vj)或〈Vi,Vj〉 E 5 V1 V2 3 2 G5 V3  5  3   2        7  V4 V1 V2 V3 V4 7 G.nodes= A=G.Arc= 4x4 G5的邻接矩阵。

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

  17. adjvex data nextarc 指向Vi的下一个 邻接点的指针 顶点Vi的邻接点 与边或弧有关的权值 Vexdata firstarc 存放Vi信息 指向Vi单链表的第一个结点 二. 邻接表 • 结点组成: • 每个链表附设一个头结点,结构为:

  18. V1 V2 V3 V4 NULL NULL NULL NULL V2 V2 V3 V3 1. 无向图的邻接表 V2 V2 V1 V4 V1 顶点Vi的度恰好就是 第i个单链表中的结点数。 v1 v2 o o G1 o o v3 v4

  19. 2.有向图G2的邻接表 1 2 3 4 3 NULL 2 1 2 NULL G2 NULL 4 3 4 1 NULL

  20. 2.7 图的遍历 • 图的遍历 从指定顶点出发访问图中每一个顶点,使每个顶点都被访问且只被访问一次 • 常用的遍历方法: • 深度优先遍历法 • 广度优先遍历法

  21. 一. 深度优先遍历法 • 算法: • 1)访问图中某个指定顶点V0; • 2) 从V0出发,访问与V0邻接的顶点V1后,再从V1出发,访问与V1邻接且未被访问过的顶点V2。重复上述过程,直到不存在未访问过的邻接点为止。 • 3)回退到尚未访问过的顶点,从该顶点出发,重复1)、2),直到全部被访问过的邻接点都被访问为止。

  22. V1 V4 V3 V2 V5 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. 二. 广度优先遍历算法 • 先访问第1个顶点所有邻接点后,再访问下一个顶点所有未被访问的邻接点。 • 算法 • 1) 访问某个指定顶点V0; • 2) 从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依此从W1,W2,…,Wk出发访问各自未被访问的邻接点。 • 3) 重复2),直到全部顶点都被访问。

  24. 广度优先遍历法举例 遍历过程 访问顶点 所过边 • 起点V1 V1 • 访问V1的未被访问过 • 的所有邻接点 V3,V2,V4 (V1,V3) • (V1,V2) • (V1,V4) • 访问V3的未被访问过 • 的所有邻接点 V5 (V3,V5) • 访问V2的未被访问过 • 的所有邻接点 无 • 访问V4的未被访问过 • 的所有邻接点 V6 (V4,V6) • 所有顶点已被访问,结束 V1 V4 V3 V2 V5 V6 G6

  25. 2.8 树的应用----Huffman树 • Huffman树的概念 • 构造Huffman树 • Huffman编码

  26. 一. Huffman树的概念 • 树的带权路径长度定义为: n WPL = ∑ wklk k = 1 其中: n 是树中叶结点的个数 wi 是第i个结点的权值 li 是第i个结点的路径长度 Huffman树也称为最优树,是带权路径最短的一类二叉树。

  27. Huffman树举例 • 以下三棵树带权路径之和: (c) (a) (b) 2 c 7 a 7 5 2 4 4 5 a b c d d b 2 WPLa =7x2+5x2+2x2+4x2 = 36 c 4 d 7 5 b a WPLb =7x3+5x3+2x1+4x2 = 46 WPLc = 7x1+5x2+2x3+4x3 = 35 √ • 按哈夫曼树构造二叉树,应用于实际问题,可提高处理效率。

  28. 二. 构造Huffman树 • 算法: • 1)将n个带权值wi(i≤n)的结点构成n棵二叉树的集合T={T1,T2,……,Tn},每棵二叉树只有一个根结点。 • 2)在T中选取两个权值最小的结点作为左右子树,构成一个新的二叉树,其根结点的权值取左右子树权值之和; • 3)在T中删除这两棵树,将新构成的树加入到T中; • 4)重复2)、3)步,直到T中只含一棵树为止,该树就是Huffman树。

  29. 构造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 } 11 T2 6 T3 5 6 2 4 b c d 2 4 11 c d T2 T1 5 6 b T1 18 7 11 T1 a T1 18 5 18 b 6 11 7 T2 11 a 7 2 a T2 4 c d 5 6 b T1

  30. 三. Huffman编码 • 编码:用二进制数的不同组合来表示字符。 • 前缀编码:一种非等长编码。任一个字符的编码都不是另一个字符编码的前缀。 编码:A(0) B(10) C(110) D(111) 方法约定: 1)左分支为‘0’ 2)右分支为‘1’ 3)由根到叶路径上字符组成的二进制串就是该叶结点的编码。 1 0 a 0 1 b 0 1 c d • Huffman编码:一种前缀编码。以给定权值的结点构造Huffman树,按二进制前缀编码的方式构成的编码

  31. 2 2 2 2 1 1 1 1 1 1 1 1 4 4 4 3 1 0 2 2 2 1 0 a 1 0 c b d 例:设要传送的电文是: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} W= {3 2 2} W={3 4} 前缀编码 abaccda 0110010101110 a b c d 0 110 10 111 P.31

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

More Related