生活随笔
收集整理的這篇文章主要介紹了
NYOJ 801 Haffman编码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Haffman編碼
時間限制:
1000?ms ?|? 內存限制:
65535?KB 難度:
3
描述
哈弗曼編碼大家一定很熟悉吧(不熟悉也沒關系,自己查去。。。)。現在給你一串字符以及它們所對應的權值,讓你構造哈弗曼樹,從而確定每個字符的哈弗曼編碼。當然,這里有一些小規定:
1.規定哈弗曼樹的左子樹編碼為0,右子樹編碼為1;
2.若兩個字符權值相同,則ASCII碼值小的字符為左孩子,大的為右孩子;
3.創建的新節點所代表的字符與它的左孩子的字符相同;
4.所有字符為ASCII碼表上32-96之間的字符(即“ ”到“`”之間的字符)。
輸入輸入包含多組數據(不超過100組)
每組數據第一行一個整數n,表示字符個數。接下來n行,每行有一個字符ch和一個整數weight,表示字符ch所對應的權值,中間用空格隔開。
輸入數據保證每組測試數據的字符不會重復。輸出對于每組測試數據,按照輸入順序輸出相應的字符以及它們的哈弗曼編碼結果,具體格式見樣例。樣例輸入 3
a 10
b 5
c 8
4
a 1
b 1
c 1
d 1 樣例輸出 a:0
b:10
c:11
a:00
b:01
c:10
d:11 AC碼: #include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define INF 99999999
struct node
{char ch;char *str; // 用于存儲Huffman編碼int weight;int parent;int LChild;int RChild;
}num[200];
int main()
{int n,min1,min2,s1,s2,i,j,m;int start,c,p;char *cd; // 臨時存儲Huffman編碼while(~scanf("%d",&n)){for(i=1;i<=n;i++){getchar();scanf("%c%d",&num[i].ch,&num[i].weight);num[i].parent=0;num[i].LChild=0;num[i].RChild=0;}m=2*n;for(i=n+1;i<m;i++){num[i].weight=0;num[i].parent=0;num[i].LChild=0;num[i].RChild=0;}// 構造Huffman樹for(i=n+1;i<m;i++){min1=min2=INF;s1=s2=0;for(j=1;j<=i-1;j++){if(num[j].parent!=0)continue;if(min1>num[j].weight){min2=min1;min1=num[j].weight;s2=s1;s1=j;}else if(min1==num[j].weight&&num[s1].ch>num[j].ch){min2=min1;min1=num[j].weight;s2=s1;s1=j;}else if(min2>num[j].weight){min2=num[j].weight;s2=j;}else if(min2==num[j].weight&&num[s2].ch>num[j].ch){min2=num[j].weight;s2=j;}}num[i].weight=num[s1].weight+num[s2].weight;num[s1].parent=i;num[s2].parent=i;if(num[s1].weight==num[s2].weight){if(num[s1].ch>num[s2].ch){num[i].ch=num[s2].ch;num[i].LChild=s2;num[i].RChild=s1;}if(num[s1].ch<num[s2].ch){num[i].ch=num[s1].ch;num[i].LChild=s1;num[i].RChild=s2;}}else{num[i].ch=num[s1].ch;num[i].LChild=s1;num[i].RChild=s2;}}// Huffman樹構造完畢// 求Huffman編碼cd=(char *)malloc(n*sizeof(char));cd[n-1]='\0';for(i=1;i<=n;i++){start=n-1;c=i;p=num[i].parent;while(p!=0){--start;if(num[p].LChild==c)cd[start]='0';elsecd[start]='1';c=p;p=num[p].parent;}num[i].str=(char *)malloc((n-start)*sizeof(char));strcpy(num[i].str,&cd[start]);}free(cd);for(i=1;i<=n;i++)printf("%c:%s\n",num[i].ch,num[i].str);}return 0;
}
總結
以上是生活随笔為你收集整理的NYOJ 801 Haffman编码的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。