前言:
最近要到期末了,事情有点多有几个星期没有写这个了,我们数据结构实验课要求写Huffman树,因此这次我将对Huffman树进行介绍。
原理:
哈夫曼树是一种单词树,广泛使用于数据压缩之中。将会根据每个字符的权重,来构建一颗Huffman树,同时根据Huffman树对原来的文本进行二次编码,以达到压缩数据的目的。
比如当我们对AAABBBA进行Huffman树压缩时,A的编码将会是1,B的编码将会是0,那么这串字符串将会被压缩为1110001,只需要7个bit即可进行储存,而AAABBBA则至少需要7 * 8个bit,这样我们就可以达到数据
压缩(compress)的目的。当然,当我们预见一个已经压缩好的数据时,我们只需要拥有其对应的编码表,则可将其进行
展开(expend)。
这里先给出一个我写的Huffman树的声明:
/* Huffman类:哈夫曼树
* 接口:
* MakeEmpty:重置功能,重置哈夫曼树
* DisSt:展示编码表
* IsLeaf:判断对应节点是否为叶子节点
* GetFreq:获取权重数组
* BuildTree:根据权重数组构建哈夫曼树
* BuildCode:根据哈夫曼树构建编码表
* Expend:根据哈夫曼树展开压缩文本
* Compress:根据编码表压缩原始文本
*/
class Huffman
{
public:
// 构造函数
Huffman();
// 析构函数
~Huffman();
// 接口函数
void MakeEmpty();
void DisSt();
bool IsLeaf(Node*);
void GetFreq(int);
void BuildTree();
void BuildCode();
string Expend(string);
string Compress(string);
private:
// 辅助功能函数
void MakeEmpty(Node *);
void BuildCode(Node *, string);
// 数据成员
const int R = 128;
int *freq; // 权重数组
string *st; // 编码表
Node *Root; // 哈夫曼树根
};
Huffman树节点:
Huffman树的节点中将会储存