最优前缀码
1. 问题
给定字符集C={x1,x2,…,xn}和每个字符的频率f(xi),求关于C的一个最优前缀码。
2. 解析
|
|
a |
b |
c |
d |
e |
f |
|
频率(千次) |
45 |
13 |
12 |
16 |
9 |
5 |
|
定长编码 |
000 |
001 |
010 |
011 |
100 |
101 |
|
变长编码 |
0 |
101 |
100 |
111 |
1101 |
1100 |
Note:每次构造二叉树时已按字母频率递增顺序排好序
步骤:每次构造二叉树将频率低的两棵树进行合并
1.我们借用上面的例子得到初始字母叶节点:

2.f 和 e 合并:

3.c 和 b 合并:

4. 14 和 d 合并:

5. 25 和 30 合并:

6. 45 和 55 合并,最终得到完整的赫夫曼树:

因此得到哈夫曼编码为:
a 的编码为: 0
b 的编码为: 101
c 的编码为: 100
d 的编码为: 111
e 的编码为: 1101
f 的编码为: 1100
3. 设计
算法 L o a d i n g ( W , c 1 ) ;
S o r t ( W );
B ← c 1 ; b e s t ← c 1 ; i ← 1 ;
4 while i ≤ n do
if 装入i ii后重量不超过c 1
then B ← B − w i ; x [ i ] ← 1 ; i ← i + 1 ;
else x [ i ] ← 0 ; i ← i + 1 ;
if B <best
then记录解; b e s t ← B ;
B a c k t r a c k ( i ) ;
if i = 1
then return 最优解
else goto 4.
4. 分析
算法时间复杂度是 O(nlogn)
5. 源码
[github源码地址]
作者:starshine
出处:https://www.cnblogs.com/zs0618/

浙公网安备 33010602011771号