第七章 树(2)

有向树

定义

有向树: 基图为无向树的有向图
根树: 有一个顶点入度为0, 其余的入度均为1的非平凡的有向树
树根: 有向树中入度为0的顶点
树叶: 有向树中入度为1, 出度为0的顶点
内点: 有向树中入度为1, 出度大于0的顶点
分支点: 树根与内点的总称
顶点v的层数: 从树根到v的通路长度
树高: 有向树中顶点的最大层数

在这里插入图片描述

上图中
v 1 v_1 v1为树根
v 2 , v 3 , v 4 , v 7 , v 11 v_2,v_3,v_4,v_7,v_{11} v2,v3,v4,v7,v11为内点
v 5 , v 6 , v 8 , v 9 , v 10 , v 12 , v 13 v_5,v_6,v_8,v_9,v_{10},v_{12},v_{13} v5,v6,v8,v9,v10,v12,v13为内点
v 2 , v 3 , v 4 , v_2,v_3,v_4, v2,v3,v4,为层数为1 的顶点
v 5 , v 6 , v 7 , v 8 , v 9 , v_5,v_6,v_7,v_8,v_9, v5,v6,v7,v8,v9,为层数为2 的顶点
v 10 , v 11 , v 12 v_{10},v_{11},v_{12} v10,v11,v12为层数为3 的顶点
v 13 v_{13} v13为层数为4 的顶点
上述树高为4

树的家族关系

定义 把根树看作一棵家族树:
(1) 若顶点 a 邻接到顶点 b, 则称 b 是 a 的儿子, a 是b 的父亲;
(2) 若b和c为同一个顶点的儿子, 则称b和c是兄弟;
(3) 若ab且a可达b, 则称a是b的祖先, b是a的后代

设v为根树的一个顶点且不是树根, 称v及其所有后代的导出子图为以v为根的根子树。

根树的分类

有序树: 将根树同层上的顶点规定次序
r叉树:根树的每个分支点至多有r个儿子
r叉正则树: 根树的每个分支点恰有r个儿子
r叉完全正则树: 树叶层数相同的r元正则树
r叉有序树: 有序的r叉树
r叉正则有序树: 有序的r叉正则树
r叉完全正则有序树: 有序的r叉完全正则树

最优2叉树

定义 设2叉树T有t片树叶 v 1 , v 2 , … , v t v_1, v_2, …, v_t v1,v2,,vt, 树叶的权分别 为 w 1 , w 2 , … , w t , w_1, w_2, …, w_t, w1,w2,,wt, W ( T ) = ∑ i = 1 t w i × l ( v i ) W(T)=\sum_{i=1}^t w_i \times l(v_i) W(T)=i=1twi×l(vi) 为T的权, 其中 l ( v i ) l(v_i) l(vi) v i v_i vi的层数。

在所有权为$w_1, w_2, …, w_t $的t片树叶的2叉树中, 权最小的2叉树称为最优 2叉树。

Huffman算法

Huffman算法
给定实数 w 1 , w 2 , … , w t , w_1, w_2, …, w_t, w1,w2,,wt,
① 作t片树叶, 分别以 w 1 , w 2 , … , w t w_1, w_2, …, w_t w1,w2,,wt为权
② 在所有入度为0的顶点(不一定是树叶)中选出两个权最小的顶点, 添加一个新分支点, 以这2个顶点为儿子, 其权等于这2个儿子的权之和
③ 重复②, 直到只有1个入度为0 的顶点为止
W(T)等于所有分支点的权之和。

算法思想:每次合并最小的两个权值,直到只剩下一个顶点为止(即为树根)

例子1
在这里插入图片描述
例子2
在这里插入图片描述
值得注意

最优二叉树的权值为分支点求和
W ( T ) = 分 支 点 总 和 = ∑ i = 1 t w i × l ( v i ) W(T)=分支点总和=\sum_{i=1}^t w_i \times l(v_i) W(T)==i=1twi×l(vi)

因为:

42=19+8+11+4(分支点总和)
=(8+11)+(4+4)+(5+6)+(1+3)
=((4+4)+(5+6))+((1+3)+4)+(5+6)+(1+3)
=1*3+3*3+4*2+5*2+6*2( ∑ i = 1 t w i × l ( v i ) \sum_{i=1}^t w_i \times l(v_i) i=1twi×l(vi)

最优前缀码

在计算机及通讯事业中,常用二进制编码来表示符号。

例如,可用00、01、10、11 分别表示字母A、B、C、D,这称作等长编码。这在四个字母出现频率基本相等的情况下是非常合理的。 但当四个字母出现的频率很不一样,如A出现的频率为50%,B 出现的频率为25%,C 出现的频率为20%,D 出现的频率为5% 时,使用等长编码就不是最优的方式了。

如果此时我们使用不等长编码,如用000 表示字母D,用001 表示字母C,01 表示B,1 表示A。在同样传输100个字母的情况下,等长编码需2100 = 200 个二进制位,而不等长编码仅需3 *5 + 3 * 20 + 2*25 + 1 * 50 = 175 个二进制位。

但不等长编码不能随意定义,否则会引起问题,如当我们用1 表示A,用00 表示B,用001 表示C,用000表示D 时,如果接收到的信息为001000,则无法辨别它是CD 还是BAD。

所以我们需要前缀码概念 。

定义

在这里插入图片描述

如 {0,10,110, 1111}, {10,01,001,110}是2元前缀码
{0,10,010, 1010} 不是前缀码

用二元树产生二元前缀码

给定一棵二元树T,假设它有t 片树叶。设v 是T 任意一个分支点,则v 至少有一个儿子, 至多有两个儿子。若v 有两个儿子,则在由v 引出的两条边上,左边的标上0,右边的标上1;若v 只有一个儿子,在v 引出的边上可标0 也可标1。设w 为T 的任意一片树叶,从树根到w 的通路上各边的标号组成的符号串放在w 处,t 片树叶处的t 个符号串组成的集合为一个二元前缀码。
在这里插入图片描述

最优前缀码

设要传输的电文中含有t个字符, 字符ai出现的频率为 p i p_i pi, 它的编码的长度为 l i l_i li, 那么100个字符的电文的编码的期望长度是 100 × ∑ i = 1 t l i × p i 100 \times \sum_{i=1}^t l_i \times p_i 100×i=1tli×pi称编码期望长度最小的2元前缀码为最佳2元前缀码

在用2叉树产生2元前缀码时, 每个二进制串的长度等于它所在树叶的深度, 因而权为 100 p 1 , 100 p 2 , . . . . . , 100 p t 100p_1, 100p_2, ....., 100p_t 100p1,100p2,.....,100pt的最优2叉树产生的2元前缀码是最佳2元前缀码。 于是, 给定字符出现的频率, 可以用Huffman算法产生最佳2元前缀码。

例子1

例子2
在通信中,设八进制数字出现的频率如下:
0:25% 1:20% 2:15% 3:10%
4:10% 5:10% 6:5% 7:5%
采用2元前缀码, 求传输数字最少的2元前缀码 , 并求传输10n(n2)个按上述比例出现的八进制数字需要多少个二进制数字?若用等长的 (长为3) 的码字传输需要多少个二进制数字?

解 用Huffman算法求以频率(乘以100)为权的最优2叉树。
这里 w1=5, w2=5, w3=10, w4=10, w5=10, w6=15, w7=20, w8=25
在这里插入图片描述

参考文献:《离散数学 第五版》耿素云 ,屈婉玲。清华大学出版社
参考视频:中国慕课国家精品课,离散数学 电子科技大学出品

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 什么是二? 二是一种形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。 2. 什么是二搜索? 二搜索是一种特殊的二,其中左子节点的值小于等于父节点的值,右子节点的值大于等于父节点的值。 3. 什么是完全完全是一种特殊的二,除了最后一层外,每一层都必须填满,且最后一层从左到右依次填入节点。 4. 什么是平衡二? 平衡二是一种特殊的二搜索,其左右子高度差不超过1。 5. 什么是二的遍历? 二的遍历是指按照某种顺序依次访问二中的每个节点,常见的遍历方式包括前序遍历、中序遍历和后序遍历。 6. 什么是二的前序遍历? 二的前序遍历是指按照根节点、左子、右子的顺序依次访问二中的每个节点。 7. 什么是二的中序遍历? 二的中序遍历是指按照左子、根节点、右子的顺序依次访问二中的每个节点。 8. 什么是二的后序遍历? 二的后序遍历是指按照左子、右子、根节点的顺序依次访问二中的每个节点。 9. 什么是二的层序遍历? 二的层序遍历是指按照从上到下、从左到右的顺序依次访问二中的每个节点。 10. 如何判断一个二是否为二搜索? 可以通过中序遍历得到二中所有节点的值,然后判断这些值是否按照升序排列即可判断是否为二搜索
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小邹子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值