离散数学及其应用课件第9章第3节
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
定义9.3.6 如果将根树每一层上的结点都规定次序,这样的 根树称为有序根树。
在有序根树中,每一层上的结点按从左到右的次序排序。 如二元有序树的一个分支点有两个子结点,则从左到右称 这两个子结点为左儿子和右儿子。以这两个子结点为根所 产生的根子树分别称为左子树和右子树。
有序根树
a
b de hi
c
fg j
例如
45 1 63
W(T1)=47
3
4
6 35
5 1 6 W(T2)=54
14 W(T3)=43
25
求最优2元树的算法
哈夫曼(Huffman)算法 给定t个实数按从小到大顺序排列,即w1w2 … wt , ① 连接以w1,w2 为权的两片树叶,得一分支点,其权为 w1+w2 ; ② 在w1+w2 ,w3 ,… wt中选出两个最小的权,连接它们对应 的结点(不一定都是树叶),得分支点及其所带的权; ③ 重复(2),直到形成一棵有t−1个分支点,t片树叶的树为止。
a(根)
c
bd
e
f
g
h
称这两个结点为兄弟。
定义9.3.4 设T为一棵根树,vi为T中一个结 点,且vi不是树根,称vi及其后代的导出子 图为T的以vi为根的子树,简称根子树。
5
m元树
定义9.3.5 在根树中,如果每个结点的出度小于或等于m, 则称这棵树为m元树。m=2时称为二元树或二叉树。如果每 个分支点的出度都等于m ,则称这棵树为m元正则树。所有 树叶级(层)数相同的m元正则树称为完全m元正则树。
它硬币的不等,要在这4枚硬币中找出伪币,需要用天平秤多少次?
解 将4枚硬币分成两组,任取一组2个硬币在天平上称重,结果
可能是:质量相同和质量不同。因此可用二元决策树解决这个问
题。
设4枚硬币为A,B,C,D,用A:B 表示将A和B放在天平上称重, “=”表示平衡,“≠”表示不平衡。 决策树是有4片树叶的二元树, 用天平秤2次可以找出伪币。
对应该决策的每种可能结果,称这样的根数为决策树。
如图是排序3个不同数的决策树,用根树表示对3个不同数
排序的比较判断过程。
a:b
a>b
a<b
a:c
b:c
a>c a<c
b>c b<c
b:c
b>c
a:c
c>a>b
b<c
a>c
y c>b>a
a<c
a>b>c a>c>b b>a>c b>c>a
例题
例9.4.5 有4枚外观相同的硬币,其中1枚是伪币,伪币的质量和其
2,,m)中只有0,1两个符号,则称B为二元前缀码。 例如,{0,10,110,111},{11,00,010,011}都是二元前 缀码,而{1,01,010,110}不是前缀码。
前缀码和二元树
定理9.4.1 任何一棵二元树的树叶可对应一个前缀码。 证明 对于给定的一棵二元树,每个分支点至少有一个子结点, 至多有两个子结点。若分支点有两个子结点,在分支点和左 子结点连接的边上标0,和右子结点连接的边上标1;若分支 点只有1个子结点,在分支点和它的子结点连接的边上标0或1 都可以。
14
例题
例
中序遍历: b a ((f d g) c e) 前序遍历: a b (c (d f g) e) 后序遍历: b ((f g d) e c) a 带下划线的是(子)树根, 一对括号内是一棵子树
15
2元有序根树
用2元有序根树表示算术运算算式如下: 将运算符放在分支 点上, 数放在树叶上, 每个运算符对它所在分支点的2棵子 树进行运算, 并规定左子树是被除数或被减数. 例2 右图表示算式 ((b+(c+d))a)((ef)(g+h)(ij)) 前序遍历 b + c d a e f + g h i j 后序遍历 b c d + + a e f g h + i j
实例
根树的画法:树根放最上方,省去所有有向边上的箭头 右图中
a是树根 b,e,f,h,i是树叶 c,d,g是内点 a,c,d,g是分支点 a为0层;1层有b,c; 2层有d,e,f; 3层有g,h; 4层有i. 树高为4
4
有向根树
定义9.3.3 在根树T中,
(1) 若结点vi到结点vj可达,则称vi是vj的祖 先,vj是vi的后代; (2) 若结点vi邻接到结点vj,则称vi是vj的父 亲,vj是vi的儿子; (3) 若两个节点同为一个结点的儿子,则
A:B
≠ A:C ≠=
= A:C
≠=
A
BCD
采用2元前缀码, 求传输数字最少的2元前缀码 (称作最佳 前缀码), 并求传输100个按上述比例出现的八进制数字需 要多少个二进制数字?若用等长的 (长为3) 的码字传输需 要多少个二进制数字? 解 用Huffman算法求以频率(乘以100)为权的最优2元树. 这里w1=5,w2=5,w3=10,w4=10,w5=10,w6=15,w7=20,w8=25.
需要注意的是,结点的中序遍历结果可存在二义性为了让这样的表达式无歧义, 遇到运算时,按中序遍历算法得到的表达式要包含括号,括号中是子树的表达式16 。
wk.baidu.com
波兰符号法与逆波兰符号法(续)
波兰符号法(前缀符号法): 按前序遍历访问, 不加括号. 从右到左进行, 每个运算符对其后面紧邻两个数进行运算. 逆波兰符号法(后缀符号法): 按后序遍历访问, 不加括号. 从左到右进行, 每个运算符对前面紧邻两数运算.
26
例题
例9.4.3求以1,3,4,5,6为权的最优2元树, 并计算它的权 解
4
13 (a)
8
4 4
13 (b)
8 11
4 45 6
13 (c)
19
8
11
4 45 6
13 (d)
W(T)=4+8+11+19=42
27
例题
例9.4.4 在通信中,设八进制数字出现的频率(%)如下: 0: 25, 1: 20, 2: 15, 3: 10, 4: 10, 5: 10, 6: 5, 7: 5
这样,每片树叶将对应一个由0和1组成的序列,该序列 由树根到这片树叶的通路上各边的标记组成。由于每片树叶 对应的标记序列都不是另一片树叶标记序列的前缀,因而由 所有树叶的标记序列构成一个前缀码。
例题
例 前缀码 {00, 11, 011, 0100}
前缀码和二元树
定理9.4.2 任何一个前缀码都对应一个棵二元树。 证明 1. 设给定一个前缀码,h表示前缀码中最长序列的长度。画
定理9.3.3
定理9.3.3在高度为h的m元树里至多有mh片树叶。 证明 用归纳法对高度h进行归纳证明。 假设高度h=1。高度h=1的m元树由根结点及其不超过m个子结 点组成,每个子结点都是树叶。因此高度为h的m元树里至多有 m1=m片树叶。 假设高度h=k-1时结论成立,即高度为k-1的m元树里至多有m k-1 片树叶。 高度h=k时,在高度为k-1的m元树中给每片树叶添加至多m个子 结点,就是高度为k的m元树,最多需要添加m(m k-1)= m k片树 叶。因此,高度h=k时,至多有mk片树叶,结论成立。
三元树
三元正则树
完全二元正则树
定理9.3.1
定理9.3.1 有i个分支点的 m元正则树有n=mi+1个结点。 证明 除根之外的每个结点都是分支点的儿子。因为每个分 支点都有m个儿子,所以,在树中除根之外还有mi个结点。 因此,这棵树共有mi+1个结点。
定理9.3.2
定理9.3.2一个m元正则树T 1. 若T有n个结点,则有i=(n−1)/m个分支点和l=[(m−1)n+1]/m
片树叶; 2. 若T有i个分支点,则有n=mi+1个结点和l=(m−1)i+1片树叶; 3. 若T有l片树叶,则有n=(ml−1)/(m−1)个结点和i=(l−1)/(m−1)
个分支点。
定理9.3.2
证明 (1) 若T有n个结点,利用定理9.3.1,n=mi+1,则分支点i= (n−1)/m,树叶数l = n−i ,将i的表达式代入l = n−i , 得l= [(m−1)n+1]/m。 (2) 若T有i个分支点,利用定理9.3.1,有n=mi+1个结点;树 叶数l = n−i,将n的表达式代入得l=(m−1)i+1; (3) 若T有l片树叶,i = n− l ,代入n=mi+1,则有n=m (n− l) +1, 整理得n=(ml−1)/(m−1),而分支点数i = n−l=(ml−1)/(m−1) − l=(l−1)/(m−1)。
例2(续) 波兰符号法 b+cdaef+ghij 逆波兰符号法 bcd++aefgh+ij
17
例题
例 用2元有序树表示命题公式:(pq)(pq),写出它
的波兰记法和逆波兰记法。
解 由底向上构造二元有序树。首先构造pq,p和q的子树,
然后构造(pq),pq的子树,最后用这两个子树分别作为
左子树和右子树,以为根结点的二元有序树就是所求的表示命
出一棵高度为h的二元正则树,在分支点和子结点连接的 两条边上分别标记0和1; 2. 对长度不超过h的每一个二进制序列必对应这棵二元树上 的一个结点。将对应于前缀码的每一个结点的所有后代结 点及其关联的边都删去; 3. 最后再删去没有和任一前缀码对应的树叶,得到一棵二元 树; 这棵二元树的树叶就对应给定的前缀码。
28
例题(续) 编码: 0---01 1---11 2---001 3---100 4---101 5---0001 6---00000 7---00001 传100个按比例出现的八进制数字需W(T)=285个二进制数 字, 用等长码(长为3)需要用 300个数字.
29
9.4.3 决策树
在根树中,每个分支点都对应一个决策,分支点的子树
有序根树
b de hi
左子树
c fg
j
右子树
9.3.2 有序根树的遍历
系统地访问有序根树的每个结点,使得每个结点恰好访 问一次,进行数据存取的过程称为遍历算法。 三种遍历2元有序根树的算法: ①前序遍历算法:树根、前序遍历左子树、前序遍历右子树 ②中序遍历算法:中序遍历左子树、树根、中序遍历右子树 ③ 后序遍历算法:后序遍历左子树、后序遍历右子树、树根
9.3 根树
9.3.1 有向根树和有序根数 9.3.2 有序根树的遍历
9.3.1 有向根树和有序根数
定义9.3.1 一个有向图G,如果略去有向边的方向所得 无向图为一棵无向树,则称G为有向树。
2
有向根树
定义9.3.2 一棵非平凡的有向树,如果有一个结点的入度为 0,其余结点的入度均为1,则称此有向树为有向根树。称 入度为0的结点为树根,称出度为0的结点为树叶,称出度 不为0的结点(含根)为分支点(内点)。 在根树中,从树根到任意结点vi只有唯一的一条简单路,这 条路的长度称为vi的级(层)数。级数最大的结点的级数称为 树的高度。
定义9.4.2 设2元树T有t片树叶v1, v2, …, vt, 树叶的权分别为 t
w1, w2, …, wt, 称 W (t) wil(vi )为T的权, 记作W(T), 其中 i1
l(vi)是vi的层数. 在所有有t片树叶, 带权w1, w2, …, wt 的 2元 树中, 权最小的2元树称为最优2元树
例题
例1 画出前缀码{00,10,010,111,1101}对应的二元树。
01
01 01 0 1 0 10 10 0 1 0 1 0 1 0 1 0 1 0 1 0 10 1 0 1
01 0 1
01
01
01
01
0 01 00 0
010
1 01 10 0 1
1 111
1101
9.4.2 最优二元树和Huffman编码
题公式:(pq)(pq)的有序树。
﹁
˅
前序遍历得波兰记法: pqpq 后序遍历得逆波兰记法:pqpq
˄ pq
p﹁ q
9.4 根树的应用
9.4.1 前缀码 9.4.2 最优二元树和Huffman编码 9.4.3 决策树
9.4.1 前缀码
定义9.4.1 设 =a1a2a3an为长度为n的符号串,称a1,a1a2, ,a1a2a3an-1分别为符号串 的长度为1,2,,n-1的前 缀;设B={1,2,,m}为一个字符串集合,若对任意的i, jB,ij,i,j互不为前缀,则称B为前缀码;若i(i=1,
推论
推论若一个高度为h的m元树T有l片树叶,则 h logm l 。 证明 根据定理9.3.3,在高度为h的m元树中,树叶数lmh,取 以m为底的对数,得 h logm l ,因为h是整数,所以有 h logm l
当m 元树的所有树叶的高度都是h时,等号成立,即 h logm l
有序根树
在有序根树中,每一层上的结点按从左到右的次序排序。 如二元有序树的一个分支点有两个子结点,则从左到右称 这两个子结点为左儿子和右儿子。以这两个子结点为根所 产生的根子树分别称为左子树和右子树。
有序根树
a
b de hi
c
fg j
例如
45 1 63
W(T1)=47
3
4
6 35
5 1 6 W(T2)=54
14 W(T3)=43
25
求最优2元树的算法
哈夫曼(Huffman)算法 给定t个实数按从小到大顺序排列,即w1w2 … wt , ① 连接以w1,w2 为权的两片树叶,得一分支点,其权为 w1+w2 ; ② 在w1+w2 ,w3 ,… wt中选出两个最小的权,连接它们对应 的结点(不一定都是树叶),得分支点及其所带的权; ③ 重复(2),直到形成一棵有t−1个分支点,t片树叶的树为止。
a(根)
c
bd
e
f
g
h
称这两个结点为兄弟。
定义9.3.4 设T为一棵根树,vi为T中一个结 点,且vi不是树根,称vi及其后代的导出子 图为T的以vi为根的子树,简称根子树。
5
m元树
定义9.3.5 在根树中,如果每个结点的出度小于或等于m, 则称这棵树为m元树。m=2时称为二元树或二叉树。如果每 个分支点的出度都等于m ,则称这棵树为m元正则树。所有 树叶级(层)数相同的m元正则树称为完全m元正则树。
它硬币的不等,要在这4枚硬币中找出伪币,需要用天平秤多少次?
解 将4枚硬币分成两组,任取一组2个硬币在天平上称重,结果
可能是:质量相同和质量不同。因此可用二元决策树解决这个问
题。
设4枚硬币为A,B,C,D,用A:B 表示将A和B放在天平上称重, “=”表示平衡,“≠”表示不平衡。 决策树是有4片树叶的二元树, 用天平秤2次可以找出伪币。
对应该决策的每种可能结果,称这样的根数为决策树。
如图是排序3个不同数的决策树,用根树表示对3个不同数
排序的比较判断过程。
a:b
a>b
a<b
a:c
b:c
a>c a<c
b>c b<c
b:c
b>c
a:c
c>a>b
b<c
a>c
y c>b>a
a<c
a>b>c a>c>b b>a>c b>c>a
例题
例9.4.5 有4枚外观相同的硬币,其中1枚是伪币,伪币的质量和其
2,,m)中只有0,1两个符号,则称B为二元前缀码。 例如,{0,10,110,111},{11,00,010,011}都是二元前 缀码,而{1,01,010,110}不是前缀码。
前缀码和二元树
定理9.4.1 任何一棵二元树的树叶可对应一个前缀码。 证明 对于给定的一棵二元树,每个分支点至少有一个子结点, 至多有两个子结点。若分支点有两个子结点,在分支点和左 子结点连接的边上标0,和右子结点连接的边上标1;若分支 点只有1个子结点,在分支点和它的子结点连接的边上标0或1 都可以。
14
例题
例
中序遍历: b a ((f d g) c e) 前序遍历: a b (c (d f g) e) 后序遍历: b ((f g d) e c) a 带下划线的是(子)树根, 一对括号内是一棵子树
15
2元有序根树
用2元有序根树表示算术运算算式如下: 将运算符放在分支 点上, 数放在树叶上, 每个运算符对它所在分支点的2棵子 树进行运算, 并规定左子树是被除数或被减数. 例2 右图表示算式 ((b+(c+d))a)((ef)(g+h)(ij)) 前序遍历 b + c d a e f + g h i j 后序遍历 b c d + + a e f g h + i j
实例
根树的画法:树根放最上方,省去所有有向边上的箭头 右图中
a是树根 b,e,f,h,i是树叶 c,d,g是内点 a,c,d,g是分支点 a为0层;1层有b,c; 2层有d,e,f; 3层有g,h; 4层有i. 树高为4
4
有向根树
定义9.3.3 在根树T中,
(1) 若结点vi到结点vj可达,则称vi是vj的祖 先,vj是vi的后代; (2) 若结点vi邻接到结点vj,则称vi是vj的父 亲,vj是vi的儿子; (3) 若两个节点同为一个结点的儿子,则
A:B
≠ A:C ≠=
= A:C
≠=
A
BCD
采用2元前缀码, 求传输数字最少的2元前缀码 (称作最佳 前缀码), 并求传输100个按上述比例出现的八进制数字需 要多少个二进制数字?若用等长的 (长为3) 的码字传输需 要多少个二进制数字? 解 用Huffman算法求以频率(乘以100)为权的最优2元树. 这里w1=5,w2=5,w3=10,w4=10,w5=10,w6=15,w7=20,w8=25.
需要注意的是,结点的中序遍历结果可存在二义性为了让这样的表达式无歧义, 遇到运算时,按中序遍历算法得到的表达式要包含括号,括号中是子树的表达式16 。
wk.baidu.com
波兰符号法与逆波兰符号法(续)
波兰符号法(前缀符号法): 按前序遍历访问, 不加括号. 从右到左进行, 每个运算符对其后面紧邻两个数进行运算. 逆波兰符号法(后缀符号法): 按后序遍历访问, 不加括号. 从左到右进行, 每个运算符对前面紧邻两数运算.
26
例题
例9.4.3求以1,3,4,5,6为权的最优2元树, 并计算它的权 解
4
13 (a)
8
4 4
13 (b)
8 11
4 45 6
13 (c)
19
8
11
4 45 6
13 (d)
W(T)=4+8+11+19=42
27
例题
例9.4.4 在通信中,设八进制数字出现的频率(%)如下: 0: 25, 1: 20, 2: 15, 3: 10, 4: 10, 5: 10, 6: 5, 7: 5
这样,每片树叶将对应一个由0和1组成的序列,该序列 由树根到这片树叶的通路上各边的标记组成。由于每片树叶 对应的标记序列都不是另一片树叶标记序列的前缀,因而由 所有树叶的标记序列构成一个前缀码。
例题
例 前缀码 {00, 11, 011, 0100}
前缀码和二元树
定理9.4.2 任何一个前缀码都对应一个棵二元树。 证明 1. 设给定一个前缀码,h表示前缀码中最长序列的长度。画
定理9.3.3
定理9.3.3在高度为h的m元树里至多有mh片树叶。 证明 用归纳法对高度h进行归纳证明。 假设高度h=1。高度h=1的m元树由根结点及其不超过m个子结 点组成,每个子结点都是树叶。因此高度为h的m元树里至多有 m1=m片树叶。 假设高度h=k-1时结论成立,即高度为k-1的m元树里至多有m k-1 片树叶。 高度h=k时,在高度为k-1的m元树中给每片树叶添加至多m个子 结点,就是高度为k的m元树,最多需要添加m(m k-1)= m k片树 叶。因此,高度h=k时,至多有mk片树叶,结论成立。
三元树
三元正则树
完全二元正则树
定理9.3.1
定理9.3.1 有i个分支点的 m元正则树有n=mi+1个结点。 证明 除根之外的每个结点都是分支点的儿子。因为每个分 支点都有m个儿子,所以,在树中除根之外还有mi个结点。 因此,这棵树共有mi+1个结点。
定理9.3.2
定理9.3.2一个m元正则树T 1. 若T有n个结点,则有i=(n−1)/m个分支点和l=[(m−1)n+1]/m
片树叶; 2. 若T有i个分支点,则有n=mi+1个结点和l=(m−1)i+1片树叶; 3. 若T有l片树叶,则有n=(ml−1)/(m−1)个结点和i=(l−1)/(m−1)
个分支点。
定理9.3.2
证明 (1) 若T有n个结点,利用定理9.3.1,n=mi+1,则分支点i= (n−1)/m,树叶数l = n−i ,将i的表达式代入l = n−i , 得l= [(m−1)n+1]/m。 (2) 若T有i个分支点,利用定理9.3.1,有n=mi+1个结点;树 叶数l = n−i,将n的表达式代入得l=(m−1)i+1; (3) 若T有l片树叶,i = n− l ,代入n=mi+1,则有n=m (n− l) +1, 整理得n=(ml−1)/(m−1),而分支点数i = n−l=(ml−1)/(m−1) − l=(l−1)/(m−1)。
例2(续) 波兰符号法 b+cdaef+ghij 逆波兰符号法 bcd++aefgh+ij
17
例题
例 用2元有序树表示命题公式:(pq)(pq),写出它
的波兰记法和逆波兰记法。
解 由底向上构造二元有序树。首先构造pq,p和q的子树,
然后构造(pq),pq的子树,最后用这两个子树分别作为
左子树和右子树,以为根结点的二元有序树就是所求的表示命
出一棵高度为h的二元正则树,在分支点和子结点连接的 两条边上分别标记0和1; 2. 对长度不超过h的每一个二进制序列必对应这棵二元树上 的一个结点。将对应于前缀码的每一个结点的所有后代结 点及其关联的边都删去; 3. 最后再删去没有和任一前缀码对应的树叶,得到一棵二元 树; 这棵二元树的树叶就对应给定的前缀码。
28
例题(续) 编码: 0---01 1---11 2---001 3---100 4---101 5---0001 6---00000 7---00001 传100个按比例出现的八进制数字需W(T)=285个二进制数 字, 用等长码(长为3)需要用 300个数字.
29
9.4.3 决策树
在根树中,每个分支点都对应一个决策,分支点的子树
有序根树
b de hi
左子树
c fg
j
右子树
9.3.2 有序根树的遍历
系统地访问有序根树的每个结点,使得每个结点恰好访 问一次,进行数据存取的过程称为遍历算法。 三种遍历2元有序根树的算法: ①前序遍历算法:树根、前序遍历左子树、前序遍历右子树 ②中序遍历算法:中序遍历左子树、树根、中序遍历右子树 ③ 后序遍历算法:后序遍历左子树、后序遍历右子树、树根
9.3 根树
9.3.1 有向根树和有序根数 9.3.2 有序根树的遍历
9.3.1 有向根树和有序根数
定义9.3.1 一个有向图G,如果略去有向边的方向所得 无向图为一棵无向树,则称G为有向树。
2
有向根树
定义9.3.2 一棵非平凡的有向树,如果有一个结点的入度为 0,其余结点的入度均为1,则称此有向树为有向根树。称 入度为0的结点为树根,称出度为0的结点为树叶,称出度 不为0的结点(含根)为分支点(内点)。 在根树中,从树根到任意结点vi只有唯一的一条简单路,这 条路的长度称为vi的级(层)数。级数最大的结点的级数称为 树的高度。
定义9.4.2 设2元树T有t片树叶v1, v2, …, vt, 树叶的权分别为 t
w1, w2, …, wt, 称 W (t) wil(vi )为T的权, 记作W(T), 其中 i1
l(vi)是vi的层数. 在所有有t片树叶, 带权w1, w2, …, wt 的 2元 树中, 权最小的2元树称为最优2元树
例题
例1 画出前缀码{00,10,010,111,1101}对应的二元树。
01
01 01 0 1 0 10 10 0 1 0 1 0 1 0 1 0 1 0 1 0 10 1 0 1
01 0 1
01
01
01
01
0 01 00 0
010
1 01 10 0 1
1 111
1101
9.4.2 最优二元树和Huffman编码
题公式:(pq)(pq)的有序树。
﹁
˅
前序遍历得波兰记法: pqpq 后序遍历得逆波兰记法:pqpq
˄ pq
p﹁ q
9.4 根树的应用
9.4.1 前缀码 9.4.2 最优二元树和Huffman编码 9.4.3 决策树
9.4.1 前缀码
定义9.4.1 设 =a1a2a3an为长度为n的符号串,称a1,a1a2, ,a1a2a3an-1分别为符号串 的长度为1,2,,n-1的前 缀;设B={1,2,,m}为一个字符串集合,若对任意的i, jB,ij,i,j互不为前缀,则称B为前缀码;若i(i=1,
推论
推论若一个高度为h的m元树T有l片树叶,则 h logm l 。 证明 根据定理9.3.3,在高度为h的m元树中,树叶数lmh,取 以m为底的对数,得 h logm l ,因为h是整数,所以有 h logm l
当m 元树的所有树叶的高度都是h时,等号成立,即 h logm l
有序根树