Huffman編碼的設計與應用
阿新 • • 發佈:2019-02-15
第一行,每個字元對應的Huffman編碼(用空格隔開)
第二行,字串對應的Huffman編碼序列
第三行,Huffman碼序列對應的字串
樣例輸入
4 a b c d 9 3 2 6 abcd 111001010
樣例輸出
0 101 100 11 010110011 dcba
#include <cstdio> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <iostream> #include <queue> #include <map> #include <stack> #include <vector> using namespace std; #define Max_code_len 15 #define Max_tree_size 10 const int inf=2147483647; int n; int w[1005]; char cc[1005]; char tm[1005]; struct node { char c; int weight; int fa; int lc,rc; char code[Max_code_len]; }; node HT[2*Max_tree_size]; void select(int nn,int&s1,int &s2) { int minn=inf; int min_num=0; int i; for (i=1;i<=nn;i++) { if (HT[i].fa!=0) continue; if (HT[i].weight<minn) { minn=w[i]; min_num=i; } } s1=min_num; minn=inf; for (i=1;i<=nn;i++) { if (HT[i].fa!=0||i==s1) continue; if (HT[i].weight<minn) { minn=w[i]; min_num=i; } } s2=min_num; } void CreateHuffmanTree(char *cc,int *w) { int i; int m=2*n-1; for (i=1;i<=n;i++) { HT[i].fa=0; HT[i].c=cc[i]; HT[i].weight=w[i]; HT[i].lc=HT[i].rc=0; } for (;i<=m;i++) { HT[i].weight=0; HT[i].fa=HT[i].lc=HT[i].rc=0; } int s1,s2; for (i=n+1;i<=m;i++) { select(i-1,s1,s2); HT[s1].fa=HT[s2].fa=i; HT[i].lc=s1; HT[i].rc=s2; HT[i].weight=HT[s1].weight+HT[s2].weight; } } void HuffmanCoding() { char cd[Max_code_len]; int m=Max_code_len; cd[m-1]=0; int st; int c; int f; int i,j; for (i=1;i<=n;i++) { st=m-1; for (c=i,f=HT[i].fa;f!=0;) { if (c==HT[f].lc) cd[--st]='0'; else cd[--st]='1'; c=f;f=HT[f].fa; } for (j=st;j<m-1;j++) HT[i].code[j-st+1]=cd[j]; HT[i].code[j-st+1]=0; } } void ShowHuffmanCode() { int i; for(i=1;i<n;i++) printf("%s ",HT[i].code+1); printf("%s\n",HT[i].code+1); } int ShowHuffmanEncode(char *tm) { int i,j; int len=strlen(tm); for (i=0;i<len;i++) { for (j=1;j<=n;j++) { if (tm[i]==HT[j].c) { printf("%s",HT[j].code+1); break; } } if (i+1>=n) break; } printf("\n"); return 0; } int ShowHuffmanDecode(char *tm) { int i,c,root; root=2*n-1; c=root; int len=strlen(tm); for (i=0;i<len;i++) { if (HT[c].lc==0&&HT[c].rc==0) { printf("%c",HT[c].c); c=root; } if (tm[i]=='0') c=HT[c].lc; else c=HT[c].rc; } printf("%c\n",HT[c].c); return 0; } int main() { cin>>n; int i; for (i=1;i<=n;i++) cin>>cc[i]; for (i=1;i<=n;i++) cin>>w[i]; CreateHuffmanTree(cc,w); HuffmanCoding(); ShowHuffmanCode(); scanf("%s",tm+1); ShowHuffmanEncode( tm+1); scanf("%s",tm+1); ShowHuffmanDecode(tm+1); return 0; }