哈夫曼编码
哈夫曼编码是一种变长的字符编码方式,常用于对指定的字符集进行数据压缩,压缩率在20%~90%。
在对由n个字符组成的文本进行编码过程中,有两种编码方式,即定长编码和变长编码。
对于定长编码而言,会为每个字符赋予一个长度固定为 m(m≥log2n)的位串,我们常用的标准ASCII 码就是采用定长编码策略对字符集进行编码的。
长度各异的编码,其中出现频率较高的字符,采用长度较短的编码表示,出现频率较低的字符,采用长度较长的编码表示。著名的摩尔斯电码就是采用这种策略进行编码的。
通常情况下,与定长编码相比,变长编码可以有效减少表示同一字符集所需的编码长度,提升编码效率。
但是,为了使用变长编码策略,需要解决在定长编码模式下不会遇到的一个问题,就是前缀码问题。对每一个字符规定一个 0-1 串作为其代码,并要求任一字符的代码都不是其他字符代码的前缀,这种编码称为前缀码。
有了前缀码,我们可以在编码完成的位串中准确定位每个属于字符集的字符,通过简单扫描一个位串,直到得到某个等于字符集中字符的位串后,将该字符替换之前的位串,重复以上操作,即可根据位串恢复原来的文本。哈夫曼编码就是一种前缀码。
哈夫曼树
为了对某字母表构造一套二进制的前缀码,可以借助二叉树。将树中所有的左向边都标记为0,所有的右向边都标记为1。通过记录从根节点到字符所在的叶子节点的简单路径上的所有0-1 标记来获得表示该字符的编码。
用于表示二进制前缀码的二叉树每个叶子节点对应一个字符,非叶子节点不对应任何字符。由于二叉树叶子节点之间没有互联的简单路径,所以依据这种二叉树生成的编码序列为前