这里讨论的仅仅是简单的字符压缩算法,对于更高级的文件压缩便是无能为力了。
总步骤分为六步:
第一、 统计全文中各种字符出现的次数;
第二、 根据每个字符出现不同的次数富裕权值并由此建立哈弗曼树;
第三、 根据哈夫曼树来对全文中每个字符进行哈弗曼编码;
第四、 将每个字符的哈弗曼编码连续写入,每8位截断,并计算出这8个0,1字节串所对应的字符并以字符串的形式存储编码后的字符;
第五、 将最后的不足8位的位数补足并记录补位的个数写入到文件中
第六、 将此哈弗曼树存储到文件末尾
例 :
将aaaaabbbbcccdde这段字符压缩成字节数更小的一段编码。
第一步:统计全文中各种字符出现的次数,
字符 |
a |
b |
c |
d |
e |
出现次数 |
5 |
4 |
3 |
2 |
1 |
第二步:根据每个字符出现不同的次数富裕权值并由此建立哈弗曼树
第三步:哈弗曼树建立以后则可根据哈夫曼树来对全文中每个字符进行哈弗曼编码;
在这里数叉左边代表0右边代表1;
字符 |
a |
b |
c |
d |
e |
哈弗曼编码 |
11 |
10 |
01 |
001 |
000 |
第四步: 将每个字符的哈弗曼编码连续写入,每8位截断,并计算出这8个0,1字节串所对应的字符并以字符串的形式存储编码后的字符;
aaaaabbbbcccdde这段字符用哈弗曼编码表示则为111111111110101010010101001001000
这串01一共33位,则需要在后面补7个0再在最后记录补了7个0即可
则这段编码的对应的十进制编码为-1 -22 -107 36 0 7最后这个7是记录原编码最后补了7个0的意思。
第五步:将这6个带符号的数字存入文件中,以分隔符隔开,以便读取的时候可以识别。