Huffman编码效果的唯一性

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,可见霍夫曼编码效果不错。

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值