Huffman编码主要是通过统计各元素出现的频率,进而生成编码最终达到压缩的目的。
这里是Huffman树中节点的结构。
typedef struct Tree
{
int freq;//频率
int key;//键值
struct Tree *left, *right;
Tree(int fr=0, int k=0,Tree *l=nullptr, Tree *r=nullptr):
freq(fr),key(k),left(l),right(r){};
}Tree,*pTree;
首先用一个名为freq的hashtable来记录各个元素的频率:
void read(){
int a;
std::ios::sync_with_stdio(false);
while(cin>>a){
if(freq.find(a)==freq.end()) {freq[a]=1;}
else {freq[a]++;}
}
}
Huffman树的构建过程如下代码所示:
void huffman()
{
int i;
string c;
int fr;
auto it = freq.begin();
while(it!=freq.end()){
Tree *pt= new Tree;
pt->key = it->first;
pt->freq = it->second;