霍夫曼编码

霍夫曼编码是一种常用于数据无损压缩的算法,由美国科学家大卫·霍夫曼发明。它采用不等长编码的方式,将常用字符用较短的二进制编码表示,其它不经常使用的字符采用较长的二进制编码进行表示,从而大大降低了数据的冗余度。本篇文章将系统地讲述霍夫曼编码的概念及其实现原理,并给出详细的算法实现过程,以帮助读者更好地理解和运用霍夫曼编码。

一、基本概念

霍夫曼编码又称前缀编码,其中“前缀”的意思是指任何码组不能与另一个码组有包含关系。霍夫曼编码每次都从要量化的数串中选取两个最小值进行合并,依次合并整个数串便可以得到霍夫曼编码。霍夫曼编码有个非常好的优势,就是默认以次数较少的字符出现频率较高的一些前缀编码格式,占用码流节省。

以”Kazaqiel“为例,首先将数据流中的每个小于等于128的字符即8 bit映射出一个权值频率weight。以字符a为例,其在数据流中出现32次,对应weight即为32。将这些权值按照从小到大的次数排成一棵单芽树,选取权值最小的节点放在上层,不断合并得到一颗单根树。左孩子为‘0’,右孩子为‘1’,得到霍夫曼编码表。逐一将霍夫曼编码表中出现的字符在流中替换为对应编码后,将其以struct base64_result返回并结束整个操作。

二、算法实现

1. 分解

将需要编码的字符按照发生频率从小到大进行排序。

2. 组合

从列表中选出频率最小的两个字符进行组合,并将它们从列表中删除。将这两个字符组合依据其频率大小的权值value进行组合,并赋上一定的左右树相对位置规则(例如说0表示在上层的哪边等),逐层合成优先队列(Queue)。注意到新出现的e,f的次数均为1了

3. 由最底部的两个叶节点开始(也可以选择由根节点开始),给陆续走过的树枝加上‘0’或‘1’作为临时编码,记录哈夫曼码,直到All the leavs are marked。以e加盖在0上、f加盖在1上,最终得到整棵哈夫曼树。将所有字符每出现一次给他一个权值进行频率计算。

4. 最后进行信息压缩处理时,由得到的哈夫曼编码编译,这里Inter 做例子说明,举例指明编码前后的区别。

预处理-Huffman Table-标记汉字BM 大一D码,QZ化汉1;用于32字节分批计算

收到要求用huffman编码,此处汉字文章以”你原来是污辱我们还大言不惭“做为收费信息。 预处理:如果对整块信息进行计算,只要有32位以上数据采用汉字代码(窄字符占2Byte),每次需要至少PROCESS_MAX_CHR_CHAR这么多字符作为压缩处理的单位。另外还制作了一份huffman表,出现类似内容后直接计算出该码。

汉字采用3进制2译码为最小单位,减小数据流转换过程压力。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值