7个字符{A,B,C,D,E,F,G},这7个字符在文本中出现的次数为{5,24,7,17,34,5,13}
在构造霍夫曼树的时候发现会出现两个17,这时就有两条路可以走下去,当然,因为树的不固定会有若干种结果,比如你的A是10110,他的A是00000,但就编码长度而言都是5,这里说的两条路就是A的长度可以为4也可以为5,最后总的效果还是一样的。
第一种编码方式
A:0010
B:01
C:000
D:101
E:11
F:0011
G:100
平均码长:(5*4+24*2+7*3+17*3+34*2+5*4+13*3)/105=2.542857143
第二种编码方式
A:00000
B:11
C:0001
D:10
E:01
F:00001
G:001
平均码长:(5*5+24*2+7*4+17*2+34*2+5*5+13*3)/105=2.542857143
可以看到平均码长都是一样的 2.542857143,小于不压缩的长度3。
#include <iostream>
#include <cmath>
using namespace std;
double func(double x){
return -x*log2(x);
}
int main() {
double a=(double)5/105,b=(double)24/105,c=(double)7/105,d=(double)17/105,e=(double)34/105,f=(double)5/105,g=(double)13/105;
cout<<func(a)+func(b)+func(c)+func(d)+func(e)+func(f)+func(g);
}
计算了一下信息熵为 2.49066,可见霍夫曼编码效果不错。