320 likes | 405 Views
非线性数据结构 -- 图. 概念 有向图、无向图、网 存储 邻接矩阵、邻接表 遍历 深度优先、广度优先. 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)
E N D
非线性数据结构--图 • 概念 • 有向图、无向图、网 • 存储 • 邻接矩阵、邻接表 • 遍历 • 深度优先、广度优先
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) } v1 v2 o o o o v4 v3 G1
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
3. 边和弧 • 边:无向图中顶点的偶对,写成(Vx,Vy)或(Vy,Vx)。 • 弧:有向图中顶点的偶对,〈Vx,Vy〉表示从Vx到Vy。 • 弧头:弧的终点 • 弧尾:弧的起点 弧 〈Vx,Vy〉 弧尾Vx 弧头Vy
Vx Vy Vx、Vy互为邻接点 Vx Vy Vy是Vx的邻接点 4. 邻接点 • 顶点:图中的结点 • 邻接点: • 无向图中,若边(Vx,Vy)E, 则Vx、Vy互为邻接点。 • 有向图中,若弧(Vx,Vy)E, 则Vy是Vx的邻接点。
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
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
7.网、权 • 权 若图的边或弧带有与之相关的数,称此数为该边或弧的权。 权通常用来表示从一个顶点到另一个顶点的距离或费用。 • 网 带权的图称为网。 5 V1 V2 3 2 G5 V3 V4 7
2.6 图类的存储结构 常用的存储结构: • 邻接矩阵表示法 • 邻接表表示法
一.邻接矩阵 • 图为V和E的集合,因此: • 用一个一维数组存放所有顶点; • 用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵。 • 邻接矩阵又分为有向图邻接矩阵和无向图邻接矩阵。
1.无向图邻接矩阵 • 定义 设图G=(V,E)是有n(n1)个顶点的图,则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
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
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
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的邻接矩阵。
二. 邻接表 • 图的链式存储结构 • 1) 为每个顶点建立一个单链表, • 2) 第i个单链表中包含顶点Vi的所有邻接顶点。
adjvex data nextarc 指向Vi的下一个 邻接点的指针 顶点Vi的邻接点 与边或弧有关的权值 Vexdata firstarc 存放Vi信息 指向Vi单链表的第一个结点 二. 邻接表 • 结点组成: • 每个链表附设一个头结点,结构为:
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
2.有向图G2的邻接表 1 2 3 4 3 NULL 2 1 2 NULL G2 NULL 4 3 4 1 NULL
2.7 图的遍历 • 图的遍历 从指定顶点出发访问图中每一个顶点,使每个顶点都被访问且只被访问一次 • 常用的遍历方法: • 深度优先遍历法 • 广度优先遍历法
一. 深度优先遍历法 • 算法: • 1)访问图中某个指定顶点V0; • 2) 从V0出发,访问与V0邻接的顶点V1后,再从V1出发,访问与V1邻接且未被访问过的顶点V2。重复上述过程,直到不存在未访问过的邻接点为止。 • 3)回退到尚未访问过的顶点,从该顶点出发,重复1)、2),直到全部被访问过的邻接点都被访问为止。
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,返回到出发点,遍历结束。
二. 广度优先遍历算法 • 先访问第1个顶点所有邻接点后,再访问下一个顶点所有未被访问的邻接点。 • 算法 • 1) 访问某个指定顶点V0; • 2) 从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依此从W1,W2,…,Wk出发访问各自未被访问的邻接点。 • 3) 重复2),直到全部顶点都被访问。
广度优先遍历法举例 遍历过程 访问顶点 所过边 • 起点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
2.8 树的应用----Huffman树 • Huffman树的概念 • 构造Huffman树 • Huffman编码
一. Huffman树的概念 • 树的带权路径长度定义为: n WPL = ∑ wklk k = 1 其中: n 是树中叶结点的个数 wi 是第i个结点的权值 li 是第i个结点的路径长度 Huffman树也称为最优树,是带权路径最短的一类二叉树。
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 √ • 按哈夫曼树构造二叉树,应用于实际问题,可提高处理效率。
二. 构造Huffman树 • 算法: • 1)将n个带权值wi(i≤n)的结点构成n棵二叉树的集合T={T1,T2,……,Tn},每棵二叉树只有一个根结点。 • 2)在T中选取两个权值最小的结点作为左右子树,构成一个新的二叉树,其根结点的权值取左右子树权值之和; • 3)在T中删除这两棵树,将新构成的树加入到T中; • 4)重复2)、3)步,直到T中只含一棵树为止,该树就是Huffman树。
构造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
三. 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树,按二进制前缀编码的方式构成的编码
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
作业、思考题 1、思考题: 3、4、18 2、第2章作业 8、13、20