问题描述:
如果我们有一个10万个字符的数据文件。每个字符出现的频率不同,现在我们要用最少的空间存储数据,也就是将这10万个数据进行编码,得到最优编码序列。
问题分析:
一般的编码有定长编码和不定长编码,如果采用定长编码,如果字符文件一共有6个字符,那么定长编码一个字符的长度为3(二进制编码),10万个字符编码需要30万个字节空间,如果字符文件的字符种类更多,随着字符种类的增加,需要的字节空间爆涨,显然不符合我们的最优编码序列,分析问题,我们需要解决两个问题。1.编码尽可能短。2.不能有二义性。什么是二义性?比如a:0,b:1,c:11,现在给你一个序列0111,这个序列是表示abc,还是abbb?,这里我们考虑前缀码,既没有任何码字是其他码字的前缀,与任何字符编码相比,前缀码可以保证最优的数据压缩率。
数据结构:
哈夫曼编码的基本思想是按照字符的频率构造一颗哈夫曼树,频率越高的字符,离根节点越近,并且规定位于节点左边的左孩子跟他父节点的边的权值为0,右边的为1,构造哈夫曼的过程是选取两个节点没有双亲并且权值最小的作为左右子树。
代码:
- #include <iostream>
- #include <algorithm>
- #include <cstring>
- using namespace std;
- #define MAXBIT 100
- #define MAXVALUE 10000
- #define MAXLEAF 30
- #define MAXNODE 2