霍夫曼树之计算压缩比
昨天做了那道霍夫曼树的题目(HDU1053)之后,发现如果只需要计算编码后的长度则无需真正建树.
#include <algorithm> using namespace std; char buffer[1024]={0}; int q[1024]={0}; int main() { while(scanf("%s",buffer)!=EOF && strcmp("END",buffer)!=0) { int huff[255]={0},len=0,ans=0; for(int i=0;i<strlen(buffer);i++) { if(buffer[i]) { huff[buffer[i]]++; } } int h=0,f=0; for(int i=0;i<255;i++) { if(huff[i]) { q[f++]=huff[i]; } } if(f-h==1) { ans=q[h]; } while(f-h>1) { sort(&q[h],&q[h]+(f-h)); int tmp=0; for(int i=0;i<2;i++) { tmp+=q[h++]; } q[f++]=tmp; ans+=tmp; } printf("%d %d %.1lf\n",strlen(buffer)*8,ans,strlen(buffer)*8.0/ans); } return 0; }
附上HDU 2527 AC Code:
#include <algorithm> #include <functional> #include <set> using namespace std; char buffer[10240]={0}; int n; int huffman(char* str,int clen) { int count[255]={0}; multiset<int> que; for(int i=0;i<strlen(str);i++) { count[str[i]]++; } for(int i=0;i<255;i++) { if(count[i]) { //printf("%c:%d\n",i,count[i]); que.insert(count[i]); } } if(que.size()==1) { return *que.begin(); } else { int sum=0; while(que.size()>1) { int tmp=0; for(int i=0;i<clen;i++) { tmp+=*que.begin(); que.erase(que.begin()); } que.insert(tmp); sum+=tmp; } return sum; } } int main() { while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) { int a; scanf("%d",&a); scanf("%s",buffer); printf("%s\n",huffman(buffer,2)<a?"yes":"no"); } } return 0; }