哈夫曼编码

对任意一颗二叉树而言,如果把二叉树上的所有分支都进行编号,将所有左分支都记为0,所有右分支都记为1,那么对树上任意一个结点,都可以根据从根结点出发到它的分支顺序得到一个编号,并且这个编号是所有节点中唯一的

对任何一个非叶子节点,其编号一定是某个叶子结点编号的前缀,并且,对于任何一个叶子结点,其编号一定不会成为其他任何一个结点编号的前缀。

这有什么用呢?假设现在有一个字符串,它由A、B、C、D这四个英文字符的一个或多个组成,例如ABCAD。现在希望把它编码成一个01串,这样方便数据的传输。能想到的一个办法是把A-D各自用一个01串表示,然后拼接起来即可。例如可以把A用0表示,B用1表示,C用00表示,D用01表示,这样ABCAD就可以用0100001表示。但是很快就会发现,解码的时候无法知道开头的01到底是AB还是D,因此这种编码方式是不可行的,存在一种字符的编码是另一种字符编码的前缀

因此需要寻找一套编码方式,使得其中任何一个字符的编码都不是另一个字符编码的前缀,同时要把满足这种编码方式的编码称为前缀编码。前缀编码存在的意义在于不产生混淆,编码能够正常进行

如果把A、B、C、D的出现次数(即频数)作为各自叶子结点的权值,那么字符串编码成01串后的长度实际上就是这棵树的带权路径长度

于是问题就转换成,把每个字符的出现次数作为叶子结点的权值,求一棵树,使得这棵树的带权路径长度最小。事实上,就是哈夫曼树,只需要针对叶子结点的权值来建立哈夫曼树,这种由哈夫曼树产生的编码方式被称为哈夫曼编码,显然,哈夫曼编码是能使给定的字符串编码成01字符串后长度最短的前缀编码

哈夫曼编码是针对确定的字符串来讲的,只有对确定的字符串,才能根据其中各字符出现的次数来建立哈夫曼树

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值