解析哈夫曼算法

解析哈夫曼算法

哈夫曼算法是 一种无损压缩算法,是一种十分基础且简单的压缩算法,原理则是将文件转化为文本文件后将每一个字符及其次数存入哈夫曼树的节点,然后得到这些节点的编码值,该编码值只含数字0、1.再将节点中的字符与这些编码值一一对应,然后按照该编码值将原文件中的字符替换为编码串,再将其转化为256进制数,将这一256进制数与编码集写入文件,得到压缩后的文件。

接下来依次介绍上面简介中提到的重要概念:

哈夫曼树:一种二叉树,建树规则是这样的:首先给每一个叶子节点一个权值,将它们按从小到大顺序排列,然后选出最小的两个节点,将它们的权值之和作为新的节点,这两个节点与这个生成的节点相连。再将这个权值加入排序,重复上述步骤。示例如图:

编码:规定从根节点开始,向左移动一次记为0,向右移动一次记为1例如例子中a节点的编码为010,b为011。由于每个字符都是叶子节点,因此每个字符所对应的编码唯一且不是任何一个自身之外的字符编码的前缀。那么我们将编码转回原文本时只要从左到右按照我们存进文件的编码表一一对照,就能顺利得到源文件。

注意事项:如果你自己尝试写了示例代码,你可能会发现一个问题:如果我最后形成的编码串的开头有0的话,再转为256进制的过程中不就损失掉了吗?这可不是损失掉一位那么简单,若是按照少了一个0的顺序往下读,每一个编码都会读错,最终会读出一个完全错误的文件。说到底,无论是少了还是多了,只要开头的0的位次出错,文件就很大概率与原文完全不同。因此我们必须记录下开头的0的个数,那么怎么记呢?其实我们并不为此费心,我们要做的就是在吗编码前加一个1罢了,只要这样,后面的数字将原封不动地被保留下来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专心神游

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值