Huffman编码是一种无损的数据压缩熵编码。编码过程可以通过构造Huffman二叉树来进行。算法过程和证明可以参见Introduction to Algorithms Page245~249。
##举个栗子
假设书 《Steven Jobs》 中所有的人名都用一个char型来存储,比如Jobs编码为1111 1111,Jonathan Ive(曾设计锤子手机外观)编码为0000 0000。Jobs在书中出现概率为20%,而Ive只有5%。那么某一段话可以表示为11111111xxxxxxxx00000000(X为其他字,比如love,employ的编码)。实际上我们没有必要把名字都编码为定长。在一章文字中出现概率越多的名字,我们将它编码为较小的长度,这样可以节省空间。至于能小到多少,这就和概率有关,必须做到不能损失信息量。这就可以用Huffman树来实现。
实现过程中遇到有这些问题:
- 如何建立链表和二叉树
- 单链表选择排序
- 如何遍历输出叶子节点及路径(因为路径代表的就是编码)
程序结构
采用模块化编程的思路
InputNodes() 函数用来输入节点权重和建立链表
MakeQueue() 函数用来对链表进行选择排序
HuffmanForest()函数用来构建哈弗曼二叉树
PreOrder() 函数用来遍历输出Huffman编码,用了一个递归调用
References
[1].http://coolshell.cn/articles/7459.html
[2].http://blog.csdn.net/abcjennifer/article/details/8020695
[3].http://www.nowamagic.net/librarys/veda/detail/1852
[4].http://zh.wikipedia.org/wiki/%E9%9C%8D%E5%A4%AB%E6%9B%BC%E7%BC%96%E7%A0%81
[5].Introduction to Algorithms.Page245~249