算法解析:哈夫曼(huffman)压缩算法

前言

本篇将介绍哈夫曼压缩算法(Huffman compression)

哈夫曼压缩算法(Huffman compression)

  众所周知,计算机存储数据时,实际上存储的是一堆0和1(二进制)。

  如果我们存储一段字符:ABRACADABRA!

  那么计算机会把它们逐一翻译成二进制,如A:01000001;B: 01000010; !: 00001010.

  每个字符占8个bits, 这一整段字符则至少占12*8=96 bits。

  但如果我们用一些特殊的值来代表这些字符,如:

  图中,0代表A; 1111代表B;等等。此时,存储这段字符只需30bits,比96bits小多了,达到了压缩的目的。

  我们需要这么一个表格来把原数据翻译成特别的、占空间较少的数据。同时,我们也可以用这个表格,把特别的数据还原成原数据。

  首先,为了避免翻译歧义,这个表格需满足一个条件:任何一个字符用的值都不能是其它字符的前缀。

  我们举个反例:A: 0; B: 01;这里,A的值是B的值的前缀。如果压缩后的数据为01xxxxxx,x为0或者1,那么这个数据应该翻译成A1xxxxxx, 还是Bxxxxxxx?这样就会造成歧义。

  然后,不同的表格会有不同的压缩效果,如:

  这个表格的压缩效果更好。

  那么我们如何找到最好的表格呢?这个我们稍后再讲。

  为了方便阅读,这个表格是可以写成一棵树的:

  这棵树的节点左边是0,右边是1。任何含有字符的节点都没有非空子节点。(即上文提及的前缀问题。)

  这棵树是在压缩的过程中建成的,这个表格是在树形成后建成的。用这个表格,我们可以很简单地把一段字符变成压缩后的数据,如:

  原数据:ABRACADABRA!

  表格如上图。

  令压缩后的数据为S;

  第一个字符是A,根据表格,A:11,故S=11;

  第二个字符是B,根据表格,B:00,故S=1100;

  第三个字符是R,根据表格,R:011,故S=1100011;

  如此类推,读完所有字符为止。

  压缩搞定了,那解压呢?很简单,跟着这棵树读就行了:

  压缩后的数据S=11000111101011100110001111101

  记住,读到1时,往右走,读到0时,往左走。

  令解压后的字符串为D;

  从根节点出发,第一个数是1,往右走:

  第二个数是1,往右走:

  读到有字符的节点,返回此字符,加到字符串D里。D:A;

  返回根节点,继续读。

  第三个数是0,往左走:

  第四个数是0,往左走:

  读到有字符的节点,返回此字符,加到字符串D里。D:AB;

  返回根节点,继续读。

  第五个数是0,往左走:

  第六个数是1,往右走:

  第七个数是1,往右走:

  读到有字符的节点,返回此字符,加到字符串D里。D:ABR;

  返回根节点,继续读。

  如此类推,直到读完所有压缩后的数据S为止。

  压缩与解压都搞定了之后   我们需要先把原数据读一遍,并把每个字符出现的次数记录下来。如:

  ABRACADABRA!中,A出现了5次;B出现了2次;C出现了1次;D出现了1次;R出现了2次;!出现了1次。

  理论上,出现频率越高的字符,我们给它一个占用空间越小的值,这样,我们就可以有最佳的压缩率

 由于哈夫曼压缩算法这块涉及内容较多 ,文章篇幅很长;全文全方面讲解了Compose布局的各方面知识

更多Android前言技术进阶;我自荐一套《完整的Android的资料,以及一些视频课讲解》

现在点击上方链接即可免费获取

或者点击下方小卡片

更多Android前言技术进阶;我自荐一套《完整的Android的资料,以及一些视频课讲解》

现在点击上方链接即可免费获取

或者点击下方小卡片

最后我想说:

对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们

技术是无止境的,你需要对自己提交的每一行代码、使用的每一个工具负责,不断挖掘其底层原理,才能使自己的技术升华到更高的层面

Android 架构师之路还很漫长,与君共勉

发表回复

相关推荐

孩子们超喜欢的小学生英语书单,值得分享~

孩子在放松休息之余,将时间用来看书是再好不过了。

· 1分钟前

拉丁舞伦巴基本步

基本点: 上半身的三个力量(肋骨中间、胳肢窝、肩胛骨)、主力腿(膝盖伸直、整腿绷紧、骨盆向前)、中段

· 2分钟前

做自己的“悅己者”

都說“女為悅己者容”,現實生活中,有多少人取悅他人多過取悅自己。但人生是自己的,人有時也需要自己取悅一下自己,活出自我...

· 5分钟前

返場預告丨貝利亞吸血魔獸強勢回歸,密涅瓦獸X再次返場!

日安,親愛的隊長大人們!今天又到瞭歌子的返場爆料時間。本周貝利亞吸血魔獸和密涅瓦獸X將參與返場!隊長們參與活動即有機會...

· 6分钟前

歐韓獨立設計師品牌

DULADULA(中文名:嘟拉嘟拉),獨立設計師品牌, 在消費升級的今天,DULADULA倡導新的生活態度,探索新的生活方式。DUL...

· 11分钟前