首页 > 代码库 > hdoj 1053 Entropy(用哈夫曼编码)优先队列
hdoj 1053 Entropy(用哈夫曼编码)优先队列
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1053
讲解:
题意:给定一个字符串,根据哈夫曼编码求出最短长度,并求出比值。
思路:就是哈夫曼编码。把单个字符出现次数作为权值。
AC代码:
1 #include <iostream> 2 #include <string> 3 #include <queue> 4 #include <cstdio> 5 using namespace std; 6 7 class node{ 8 public: 9 int key; //a,b,c...10 int count;//频率11 int p;//父亲结点12 friend bool operator < (const node &a, const node &b)13 {14 if(b.count < a.count)15 return true;16 else17 return false;18 }19 };20 21 int value(char c)22 {23 if(c==‘_‘)24 return 26;25 else26 return(c-‘A‘);27 }28 int main()29 {30 string str;31 cin >> str;32 while(str!="END")33 {34 node c[60];35 for(int i=0;i<60;i++)36 {37 c[i].key=i;38 c[i].count=0;39 }40 int length=str.length();41 priority_queue<node> q;42 for(int i=0;i<length;i++)43 {44 (c[value(str.at(i))]).count++;45 }46 for(int i=0;i<=26;i++)47 {48 if(c[i].count!=0)49 q.push(c[i]);50 }51 if(q.size()==1)52 {53 printf("%d %d 8.0\n",8*length,length);54 }55 else56 {57 int high=0;58 int n=27;59 while(q.size()>1)60 {61 node s1=q.top();62 q.pop();63 node s2=q.top();64 q.pop();65 c[n].count=s1.count+s2.count;66 c[s1.key].p=n;67 c[s2.key].p=n;68 high=high+c[n].count;69 q.push(c[n]);70 n++;71 }72 printf("%d %d %.1lf\n",8*length,high,(((double)(8*length))/((double)high)));73 }74 cin >> str;75 }76 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。