现在来总结一下Huffman压缩,首先,还是简单说一下概念,Huffman压缩,顾名思义,是一种压缩数据的方式,得名于压缩算法中用到的Huffman树,当然Huffman是这种数据结构的发明者,当时他还是个学生,这种压缩算法的思想是文本文件的普通保存方式:不再使用7位或8位二进制表示每一个字符,而是用较少的比特表示出现频率高的字符,用较多的频率保存那些出现频率少的字符。在进行压缩之前,先来看以下几个问题:
1. 压缩和解压,这两个过程都要实现,不然没意义做压缩,怎么压缩呢,具体思想是用较少的比特表示出现频率高的字符,用较多的频率保存那些出现频率少的字符。但是每个字符具体用哪些编码来表示呢?所以第一步我们要得到每个字符的Huffman编码,之后就可以不存储8位8位的编码而用我们的Huffman编码进行存储,可能有的字符2位,有的4位,有的8位,总的位数就减少了。
2. 好现在假设已经得到了每个字符的霍夫曼编码,也写到了文件newFile.txt中,这个文件是我们压缩之后的文件,后缀名没有意义,那我们怎么解压呢?也就是说每个字符的编码长度不等怎么进行区分呢?这里我们应该知道,Huffman编码是一种前缀编码,前缀编码也就是说任意一个字符的编码都不可能是其他字符的前缀,这种性质是由Huffman树所决定的,Huffman树是一种最优二叉树,这里我们强调一点,我们把每个字符存放在叶子节点中,每个叶子节点代表的字符肯定是不相同的,这些字符是出现在文本中的字符,也许这个文本很多字符,但至多26个,我指的是英文,先不包括符号,我们来看一个例子,看一下Huffman树是怎样的,就拿abaabcdcce这句来讲,首先有一个频率表:
a |
b |
c |
d |
e |
0.3 |
0.2 |
0.3 |
0.1 |
0.1 |
对应的Huffman树是:
频率即权重,扩大10倍。
a |
b |
c |
d |
e |
10 |
01 |
11 |
111 |
110 |
虽然是很简单的例子,但是也可以看到,Huffman编码确实是前缀码。
好了,最基础的问题解决之后我们看代码实现: