原帖地址:http://hi.baidu.com/nicker2010/item/728da1f738aecf07d99e72ec
优先级队列:
#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <queue>
using namespace std;
int main()
{
string text;
int Size,i,j,k,sum;
int data[128];
int letters[128];
double rate;
priority_queue<int,vector<int>,greater<int> > queue;
while(cin>>text)
{
if(text=="END") break;
Size = text.size();
memset(letters,0,sizeof(letters));
for(i=0;i<Size;++i)
++letters[static_cast<int>(text[i])];
j = 0;
while(!queue.empty()) queue.pop();
for(i=0;i<128;++i)
if(letters[i]) queue.push(letters[i]);
k = queue.size();
if(k==1){i=queue.top();rate=8.0;}
else
{
sum = 0;j=0;
while(--k)
{
j = queue.top();queue.pop();
j += queue.top();queue.pop();
sum += j;
queue.push(j);
}
i = sum;
rate = Size*8.0/i;
}
cout<<Size*8<<' '<<i<<' '<<fixed<<setprecision(1)<<rate<<endl;
}
}
哈夫曼树:
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
#define MaxValue 0x7fff
struct HaffNode
{
int weight;
int parent; //仿指针
int left;
int right;
int flag; //标志是否加入到哈夫曼树中
};
int Haffman(const int weight[],int n) //构造哈夫曼树
{
int sumWeight = 0;
//一共有2n-1个节点
const int N = 2*n-1;
HaffNode* root = new HaffNode[N];
int i,j;
for(i=0;i<n;++i)//n个叶子节点
{
(root+i)->weight = weight[i];
(root+i)->parent = -1;
(root+i)->left = -1;
(root+i)->right = -1;
(root+i)->flag = 0;
}
for(i=n;i<N;++i)//n-1个非叶子节点
{
(root+i)->weight = 0;
(root+i)->parent = -1;
(root+i)->left = -1;
(root+i)->right = -1;
(root+i)->flag = 0;
}
int min1,min2; //两个最小权重值
int index1,index2;//两个最小权重值的下标
//构造n-1个非叶子节点
for(i=0;i<n-1;++i)
{
//找两个最小的
min1 = min2 = MaxValue;
index1 = index2 = 0;
for(j=0;j<n+i;++j)
{
if(root[j].weight < min1 && root[j].flag==0)
{
min2 = min1;
index2 = index1;
min1 = root[j].weight;
index1 = j;
}
else if(root[j].weight < min2 && root[j].flag==0)
{
min2 = root[j].weight;
index2 = j;
}
}
//将两个权值最小的树合并
root[index1].parent = n+i;
root[index2].parent = n+i;
root[index1].flag = 1;
root[index2].flag = 1;
root[n+i].weight = root[index1].weight + root[index2].weight;
root[n+i].left = index1;
root[n+i].right = index2;
sumWeight += root[n+i].weight; //只需要累加非叶子节点的权值
}
delete[] root;
return sumWeight;
}
int main()
{
string text;
int Size,i,j;
int data[256];
int letters[256];
double rate;
while(cin>>text)
{
if(text=="END") break;
Size = text.size();
memset(letters,0,sizeof(letters));
for(i=0;i<Size;++i)
++letters[static_cast<int>(text[i])];
j = 0;
memset(data,0,sizeof(letters));
for(i=0;i<256;++i)
if(letters[i]) data[j++] = letters[i];
if(j==1) {i=data[0];rate=8.0;} //注意只有一个字母的情况
else i = Haffman(data,j);
rate = Size*8.0/i;
cout<<Size*8<<' '<<i<<' '<<fixed<<setprecision(1)<<rate<<endl;
}
return 0;
}