阅读时间:3分钟
霍夫曼编码算法是许多压缩算法(例如DEFLATE)的基石,PNG图像格式和GZIP都是用的它。
您是否想知道:我们如何压缩某些东西而又不丢失任何数据?为什么有些东西压缩得比其他东西好?GZIP如何工作?5分钟以内
霍夫曼编码可以用于任何数据,字符串是很好的例子,霍夫曼编码利用了最常用的字符比不常用的字符占用更少的空间这一特性。
编码字符串
让我们使用霍夫曼编码来压缩12个字符的“do or do not”字符串。
它有几个重复的字符,我们假设存储每个字符需要8位,共96位,但是使用Huffman编码可以做得更好!
我们从建立树形结构开始。我们数据中最常见的字符更接近树的根,而离根最远的节点表示次要字符。(如下图)
字符串中最常见的字符是'o'(代表4个字符)和空格(代表3个字符)。请注意,到那些字符的路径离根只有两步之遥,而对于最不常见的字符('t')则只有三步之遥。
现在,我们可以存储字符的路径,而不是存储字符本身。
我们用第一个字母d来举例,我们从买游戏平台根节点开始,然后沿着树一直向着要编码的字符前进。走右边存一个1,走左边存一个0,如下图所示:
最终结果是1 0 0,是3位而不是8位,这是一个很大的改进!
整个编码后的字符串如下所示:
总共是29位而不是96位,没有数据丢失,是不是被震撼到了?
解码字符串
要解码我们的文本,我们只需跟随路径傻瓜前行就可以还原我们的字母,比如0 0 表示O,然后从顶部重新开始查找:
发送编码的文本
当我们将编码后的文本发送给其他人时,他们不也需要树吗?是的!另一端需要相同的霍夫曼树才能正确解码文本。
最简单但效率最低的方法是将树与压缩文本一起发送。
我们也可以先约定同一棵树,然后在对任何字符串进行编码或解码时都使用该树。