题目非常长,大致看了下,赤裸裸的HUFFMAN树,是数据结构中很基础的东西了,以前写过求HUFFMAN编码的程序,但是感觉这题没有必要把HUFFMAN全部球出来,上网查了一下,找到了一种不错的解法,是使用优先队列来解的.
关于Huffman树有什么不了解的可以看这篇文章,讲解的很详细,http://blog.csdn.net/hairetz/archive/2009/05/05/4151866.aspx
另外优先队列priority_queue是STL库中的,包含在头文件<queue>中,会自动对新放入队列的数据进行排序,这里采用的是队头数最小的排序方式.每次取出前两个(也就是权值最小的两节点)构成新的节点,再放入队列中,直到取到最后一个为止,这也符合HUFFMAN树的构造过程..
//关于Huffman树 #include <iostream> #include <queue> #include <cstdlib> #include <cstdio> #include <algorithm> using namespace std; int cmp(const void *a,const void *b); int main(){ string line; while(1){ getline(cin,line); if(line=="END")break; priority_queue<int ,vector<int>,greater<int> > qu; //对字符数组排序并将字符个数依次放入优先队列中 sort(line.begin(),line.end()); char c=line[0]; int times=0; for(int i=0;i<line.length();i++){ if(line[i]==c)times++; else{ qu.push(times); c=line[i]; times=1; } } qu.push(times); int oldLen=line.length()*8; int newLen=0; //构造Huffman树的过程 int a,b; if(qu.size()==1)newLen=qu.top(); while(1){ a=qu.top(); qu.pop(); if(qu.empty())break; b=qu.top(); qu.pop(); newLen+=a+b;//这一步很巧,因为编码长度和其在树中的层数相关 qu.push(a+b); } printf("%d %d %.1f/n",oldLen,newLen,oldLen*1.0/newLen); } return 0; }