霍夫曼编码

Huffman Coding 是用于文件压缩的,它的功能是将一段字符串压缩为二进制编码,方便进行无线电发送,霍夫曼编码是压缩率最高的无损压缩。

试想,将一段文本按照其ASCII码转换为二进制,每一个字符都是一个定长的字符,最终也可以实现编码。那么怎么样将这段编码最短呢?最朴素的想法就是出现频率最高的字符,使用最短的编码,而且为了保证解码时不会出现奇异,就必须保证任意字符的编码不是另一个字符编码的前缀。

Huffman创造性的将编码和二叉树结合了起来,二叉树完美的满足了上述的非前缀性质,假设有一个二叉树,它的每一个叶子节点都是一个字符,节点的值为字符的频率,根节点向左代表0,向右代表1,这样就能保证任意字符的编码不是另一个字符编码的前缀(因为从根节点到每个叶子节点的路径都是唯一的,叶子节点就是路径终点),那么如何使总的编码最短呢,也就是如何构造一个最优的二叉树(被称为霍夫曼树)呢?

又一个朴素的想法是,既然频率最高的字符编码最短,那么它到根节点的路径就最长,反之频率最低的字符编码应该最长,它应该是所有字符中最底层的,也就是深度最大。

对于这棵树,总的平均编码长度就是每个叶子节点的深度(编码长度)乘以其出现频率。

为了让平均编码长度最小,就需要让出现频率最小的字符深度最大,那么首先拿两个频率最小的节点,并得到其父节点的频率(两者之和),将这个父节点加入所有字符的频率排序,重复以上过程,最终就能构建出一个霍夫曼树。

解码的时候同理,解码也需要得到霍夫曼树,然后遍历每个编码值,0往左,1往右,直到走到叶子节点,就得到了字符值。

你可能感兴趣的:(bowen的坚决不断更专栏,数据结构,算法)