poj 1521(ENTROPY) huffman 编码

来源:互联网 发布:php cgi 启动 编辑:程序博客网 时间:2024/05/12 06:07

题目链接:poj

题目大意:赤裸裸的huffman编码,就是压缩编码,给一个串求出最短的编码

题目分析:最近学HUFFMAN编码,所以拿来用下,原理不再细讲

题目总结:1.priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数:
          priority_queue<Type, Container,Functional>
          其中Type 为数据类型, Container 为保存数据的容器,Functional为元素比较方式。
          Container 必须是用数组实现的容器,比如 vector, deque 但不能用list.
          STL里面默认用的是 vector. 比较方式默认用 operator< ,所以如果你把后面俩个参数缺省的话,
          优先队列就是大顶堆,队头元素最大。

          e.g.-》priority_queue<int,vector<int>,greater<int>>Q;

          greater<int>(最小顶堆) less<int>(最大顶堆);

           详细资料:点击打开链接

                    2.huffman资料:点击打开链接

                   3.getline(cin,str)//系统默认“\n”结束,你也可以自己定义getline (cin,str,'#');

                       istream& getline ( istream &is , string &str , char delim );

                      istream& getline ( istream& , string& );

比较函数:
#include<queue>struct node{    int x, i;}a[maxn];struct cmp{bool operator() (const node a, const node b) {if(a.x == b.x) return a.i < b.i;return a.x > b.x;}}; priority_queue<node, vector<node>, cmp> q;//自己写的比较函数




 
#include<iostream>#include<cstdio>#include<cstdlib>#include<string>#include<algorithm>#include<queue>priority_queue<int,vector<int>,greater<int> > que;//最小顶堆using namespace std;int main(){    string str;    int level,a,b;    while(1)    {        getline(cin,str);        if(str=="END")           break;                sort(str.begin(),str.end());        char ch=str[0];int count=1;        for(int i=1;i<str.length();i++)        {            if(ch==str[i]) count++;            else            {  ch=str[i];               que.push(count);count=1;            }        }        level=0;        que.push(count);        if(que.size()==1) level=que.top();        while(1)        {            a=que.top();            que.pop();            if(que.empty())break;            b=que.top();            que.pop();            level+=a+b;            que.push(a+b);        }        printf("%d %d %.1f\n",str.length()*8,level,(double)str.length()*8/level);    }    return 0;}