第 84 篇原创

前言

霍夫曼编码 ( Huffman coding ) 是一种可变长的前缀码。霍夫曼编码使用的算法是 David A. Huffman 还是在MIT 的学生时提出的,并且在 1952 年发表了名为《 A Method for the Construction of Minimum-Redundancy Codes 》的文章。

编码这种编码的过程叫做 霍夫曼编码,它是一种普遍的熵编码技术,包括用于无损数据压缩领域。

霍夫曼编码过程

霍夫曼编码使用一种特别的方法为信号源中的每个符号设定二进制码。出现频率更大的符号将获得更短的比特,出现频率更小的符号将被分配更长的比特,以此来提高数据压缩率,提高传输效率。

以字符串 ” ABAABACD “ 为例进行说明。

接下来,按照字符出现的比例从高往低对字符进行排序。

图 1

然后,按出现比例低的顺序查找两个字母。在这种情况下,它是 “ C ” 12.5% 和 “ D ” 12.5% 。

通过一条线连接两个字母拼构成一个树状结果。将两个字母合并为 “ C 或 D”,并将出现比率相加起来。

动画 2

按照同样的操作,将合并后的 “ C 或 D ” 视为一个字符,重复相同的操作。

在 “ A " "B" " C 或 D " 三个中,按照出现比例低的顺序查找两个字母。

图 3图 4

这样,所有的字母都变成了 " A 或 B 或 C 或 D" ,出现的比率为 100% 。

图 4 就是霍夫曼编码的树结构。

接下来再次显示各个字母出现的比率,同时使用 0 和 1 进行编码,代码 0 和 1 分别分配给上下延伸的分支。

图 5

分配完毕后,从树的根部遍历每个字符并确定相应的代码。

  • 在 " A " 的情况下,被分配的代码为 " 0 "

  • 在 " B " 的情况下,被分配的代码为 " 10 "

  • 在 " C " 的情况下,被分配的代码为 " 110 "

  • 在 " D " 的情况下,被分配的代码为 " 111 "

动画 6

就这样,通过这样的编码规则, " ABAABACD " 的二进制编码就变成了 " 01000100110111 ",只需要 14 个比特就能表示,比单纯的使用 2 比特表示一个字符缩短了很多。


©著作权归作者所有:来自51CTO博客作者mb5fe18fab305a5的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 分享一个匹配8-16位数字和字母密码的正则表达式
  2. php中如何判断字母是大写还是小写
  3. php中强制字母转换大小写的方法有哪些
  4. php实现字母数字混合验证码
  5. HotSpot 内存分配的主要规则
  6. 什么是 Java 对象分配率
  7. 如何将JQuery变量值分配给Laravel Blade输入
  8. php实现完整版验证码(数字+大小写字母+干扰素)
  9. 仅在我的文本框中验证数字和字母

随机推荐

  1. Linux 删除文件夹和文件的命令
  2. 嵌入式Linux要学哪些东西?你真的造吗?
  3. gdb学习(二)[第二版]
  4. Linux命令备忘实例(10)——目录管理
  5. linux下安装weblogic无图形化界面
  6. 鸟哥的linux私房菜学习笔记《三十九》Lin
  7. linux进程和线程排查 · 记一次JVM CPU高
  8. Linux服务器禁用ping
  9. linux 中 开放端口,以及防火墙的相关命令
  10. linux下如何杀掉D状态进程