编程教学-哈夫曼树及其应用
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4
A 2
C
2
1
1
B
D
下面对哈夫曼树进行编码,每一个结点的左分支上 面标1,右分支上面标0。
0
7
1
3
04
A
2
2
C
1
1
B
D
下面对哈夫曼树进行编码,每一个结点的左分支上 面标1,右分支上面标0。
0
7
1
3
04
1
A
2
2
C
1
1
B
D
下面对哈夫曼树进行编码,每一个结点的左分支上 面标1,右分支上面标0。
0
7
1
4
2
2
3
C
A
1
1
B
D
对于字符串“ABACCDA”,共有7个字符,4种字符。 其中A、B、C、D出现的次数分别为3、1、2、1。根 据权值{3,1,2,1} 构造哈夫曼树
3
4
A 2
C
2
1
1
B
D
对于字符串“ABACCDA”,共有7个字符,4种字符。 其中A、B、C、D出现的次数分别为3、1、2、1。根 据权值{3,1,2,1} 构造哈夫曼树
从根结点到各个叶子结点,所经分支上面的0、1 序列,就是该叶子结点所代表字符的编码。
0
7
1
3
04
1
A 2
C
2
0
1
1
1
B
D
A:0 B:110 C:10 D:11
从根结点到各个叶子结点,所经分支上面的0、1 序列,就是该叶子结点所代表字符的编码。
0
7
1
3
04
1
A 2
C
2
0
1
1
1
B
D
A:1 B:110 C:10 D:111
AB C D 00 01 10 11
0
1
0
10
1
A
B
C
D
1.各种编码方式
(2)变长编码 当A、B、C、D按照如下形式进行编码时。
AB C D 0 110 10 111
那么字符串“ABACCDA”的编码将为 “0110010101110”,总长度为13位,比第二种方 式又要短。
采取这种变长编码方式,需要遵循一个原则, 即每一个字符的编码都不应该是另一个字符编码 的前缀。否则就会出现二义性。
WPL=w1*L1+w2*L2+w3*L3+w4*L4
那么如何选择L1、L2、L3、L4的值,使得WPL最 小呢?
1.各种编码方式
(3)哈夫曼编码
可以看出,该公式与哈夫曼树满足的公式一模 一样,那么我们可以采取构造哈夫曼树的方式来求 编码的长度。
对于字符串“ABACCDA”,共有7个字符,4种字符。 其中A、B、C、D出现的次数分别为3、1、2、1。根 据权值{3,1,2,1} 构造哈夫曼树
B
D
E
如左边树的路径长度为: C Len(A-B)+ Len(A-C)+ Len(A-
D)+ Len(A-E)+ Len(A-F)+ Len(A-G)
F
G
=1+1+2+2+3+3=12
A
B7
C
5
D
E3
4
F
G
1
2
结点的权值:在某些应用 中,树中结点往往要和 一定的数值联系起来, 那么这个数值通常称为 该结点的权值,简称权。
0
7
1
3
04
1
A 2
C
2
0
1
1
1
B
D
A:0
从根结点到各个叶子结点,所经分支上面的0、1 序列,就是该叶子结点所代表字符的编码。
0
7
1
3
04
1
A 2
C
2
0
1
1
1
B
D
A:0 B:1
从根结点到各个叶子结点,所经分支上面的0、1 序列,就是该叶子结点所代表字符的编码。
0
7
1
3
04
1
A 2
C
2
0
1
1
1
B
D
0
0
3
7
0
0
0
4
8
0
0
0
5
14
0
0
0
6
23
0
0
0
7
3
9
0
0
8
11
0
0
0
9
-
0
0
0
10
-
0
0
0
11
-
0
0
0
12
-
0
0
0
13
-
0
0
0
14
-
0
0
0
15
-
0
0
0
weight parent lchild rchild
1
5
9
0
0
2
29
0
0
0
3
7
0
0
0
4
8
0
0
0
5
14
0
0
0
6
23
0
0
0
7
3
9
0
0
8
11
0
0
0
9
8
这八个权值作为叶子结点,最终形成的哈夫曼树 应共有2*8-1=15个结点。采用双亲孩子表示法 来存储哈夫曼树。
(2)初始化
weight parent lchild rchild
1
5
0
0
0
2
29
0
0
0
3
7
0
0
0
4
8
0
0
0
5
14
0
0
0
6
23
0
0
0
7
3
0
0
0
8
11
0
0
0
9
-
0
0
0
10
-
0
0
0
11
-
0
0
1.各种编码方式
(1)定长编码---根据出现的字符种数进行编码 字符串“ABACCDA”中共出现4种字符,那么
可以用2位表示。
AB C D 00 01 10 11
那么字符串“ABACCDA”的编码将为 “00010010101100”,总长度为7*2=14位
1.各种编码方式
(1)定长编码---根据出现的字符种数进行编码 这种编码方式可以对应到二叉树,如右图所式
18
7
11
5
6
2
4
(2)哈夫曼算法的语言描述
① 根据给定的n个权值{w1,w2,…,wn}构成n棵二叉 树的集合F={T1,T2,…,Tn},其中每棵二叉树Ti中 只有一个带权为wi的根结点,其左右子树为空。
② 在F中选取两棵根结点的权值最小的树作为左右 子树构造一棵新的二叉树,且置新的二叉树的根 结点的权值为其左右子树上根结点的权值之和。
过程。
当权值为{7,5,2,4}时,构造哈夫曼树。
2
4
5
7
当权值为{7,5,2,4}时,构造哈夫曼树。
6
2
4
5
7
当权值为{7,5,2,4}时,构造哈夫曼树。
5
6
7
2
4
当权值为{7,5,2,4}时,构造哈夫曼树。
11
5
6
7
2
4
当权值为{7,5,2,4}时,构造哈夫曼树。
7
11
5
6
2
4
当权值为{7,5,2,4}时,构造哈夫曼树。
③ 在F中删除这两棵树,同时将新得到的二叉树加 入F中。
④ 重复②和③,直到F只含一棵树为止。这棵树便 是哈夫曼树。
6.6.2 哈夫曼编码
对于字符串“ABACCDA”,共有7个字 符,4种字符。其中A、B、C、D出现的次 数分别为3、1、2、1。
现在要对字符串进行0、1编码,有哪 些方法?哪一种编码的长度最短?
也可以看出,每一个可用的编码都可以转化成二叉树的形式, 这样编码理论便可以与二叉树的一些性质结合起来,就可 以应用二叉树的理论知识来解决编码问题。
1.各种编码方式
(3)哈夫曼编码 假设编码过程中有以下对应关系:
字符
ABCD
权重(字符出现次数) w1 w2 w3 w4
编码长度
L1 L2 L3 L4
那么总的编码长度为:
之所以会出现二义性,是因为出现了A的编码是C 的编码的前缀; B的编码是D的编码的前缀.
1.各种编码方式
(2)变长编码
这样,这些编码恢复成二叉树的形式时,不会形成A,B,C,D恰好 为二叉树的叶子结点,如右图
AB C D 0 11 01 111
0
A 1
1 1
C
B
1
D
1.各种编码方式
从上面的分析可以看出,一个可用的编码必须满足每个字符 的编码不能是其他编码的前缀。
1.各种编码方式
(2)变长编码 这种编码方式也可以对应到二叉树,如右图所式
AB C D 0 110 10 111
0
1
A
0
1
C
0
1
B
D
1.各种编码方式
(2)变长编码 如当A、B、C、D按照如下形式进行编码时。 AB C D 0 11 01 111 请将“0111”翻译成字符串。试一试,有哪些
翻译方式。
2
1
1
2
3
B
D
C
A
对于字符串“ABACCDA”,共有7个字符,4种字符。 其中A、B、C、D出现的次数分别为3、1、2、1。根 据权值{3,1,2,1} 构造哈夫曼树
2
2
3
C
A
1
1
B
D
对于字符串“ABACCDA”,共有7个字符,4种字符。 其中A、B、C、D出现的次数分别为3、1、2、1。根 据权值{3,1,2,1} 构造哈夫曼树
3
04
1
A 2
C
2 0
1
1
B
D
下面对哈夫曼树进行编码,每一个结点的左分支上 面标1,右分支上面标0。
0
7
1
3
04
1
A 2
C
2
0
1
1
1
B
D
从根结点到各个叶子结点,所经分支上面的0、1 序列,就是该叶子结点所代表字符的编码。
0
7
1
3
04
1
A 2
C
2
0
1
1
1
B
D
从根结点到各个叶子结点,所经分支上面的0、1 序列,就是该叶子结点所代表字符的编码。
2
29
0
0
0
步
3
7
0
0
0
4
8
0
0
0
5
14
0
0
0
6
23
0
0
0
7
3
9
0
0
8
11
0
0
0
9
8
0
1
7
10
-
0
0
0
11
-
0
0
0
12
-
0
0
0
13
-
0
0
0
14
-
0
0
0
15
-
0
0
0
weight parent lchild rchild
1
5
9
0
0
2
29
0
0
0
3
3
1
2
1
A
B
C
D
对于字符串“ABACCDA”,共有7个字符,4种字符。 其中A、B、C、D出现的次数分别为3、1、2、1。根 据权值{3,1,2,1} 构造哈夫曼树
1
1
2
3
B
D
C
A
对于字符串“ABACCDA”,共有7个字符,4种字符。 其中A、B、C、D出现的次数分别为3、1、2、1。根 据权值{3,1,2,1} 构造哈夫曼树
7
3
4
A 2
C
2
1
1
B
D
下面对哈夫曼树进行编码,每一个结点的左分支上 面标0,右分支上面标1。
7
3
4
A 2
C
2
1
1
B
D
下面对哈夫曼树进行编码,每一个结点的左分支上 面标1,右分支上面标0。
0
7
3
A 2
C
4 2
1
1
B
D
下面对哈夫曼树进行编码,每一个结点的左分支上 面标1,右分支上面标0。
0
7
1
3
0
0
0
10
-
0
0
0
11
-
0
0
0
12
-
0
0
0
13
-
0
0
0
14
-
0
0
0
15
-
0
0
0
weight parent lchild rchild
1
5
9
0
0
2
29
0
0
0
3
7
0
0
0
4
8
0
0
0
5
14
0
0
0
6
23
0
0
0
7
3
9
0
0
8
11
0
0
0
9
8
0
1
0
10
-
0
0
0
11
-
0
0
0
12
-
0
0
0
13
-
0
0
0
14
-
0
0
0
15
-
0
如左图。
A
B7
C
5
D
E3
4
F
G
1
2
结点的带权路径长度:该 结点到根结点的路径长 度与该结点上权的乘积。
如结点E的带权路径长度 为:Len(E-A)*3=2*3=6
A
B
C
w4
D
E
w1
F
G
w2
w3
树的带权路径长度: 树中所有叶子结点的 带权路径长度之和。
记作: WPL=w1*L1+w2*L2+…
…+wn*Ln
weight parent lchild rchild
1
5
9
0
0
2
29
0
0
0
3
7
0
0