赫夫曼编码
今天看了赫夫码的问题,但书上写的东西看得不是很懂,希望看到一个实际的程序来加深理解,条件如下:
二十六个英文字母,他们的使用权值分别为A,1 b,2 c,3 d,4.....依次下去,求它的编码与解码程序。
[解决办法]
- C/C++ code
#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct{ unsigned long weight; int parent, lchild, rchild; } HTNode, *HuffmanTree; typedef char** HuffmanCode;HuffmanCode HC; void Select(HuffmanTree HT, int n, int *s1, int *s2); void HuffmanCoding(unsigned long *w, int n) { int i; if( n<=1 ) return; int m = 2*n - 1; HuffmanTree p; HuffmanTree HT = (HuffmanTree)malloc((m+1)*sizeof(HTNode)); memset(HT, 0, sizeof(HTNode) * (m+1)); for( p=HT,i=1; i<=n; ++i,++p,++w ) p->weight = *w; int s1, s2; for( i=n+1; i<=m; ++i ) { Select(HT, i-1, &s1, &s2); HT[s1].parent = i; HT[s2].parent = i; HT[i].lchild = s1; HT[i].rchild = s2; HT[i].weight = HT[s1].weight + HT[s2].weight; } HC = (HuffmanCode)malloc((n+1)*sizeof(char*)); char *cd = (char*)malloc(n*sizeof(char)); cd[n-1] = 0; int start; unsigned long f; for( i=1; i<=n; ++i ) { start = n - 1; int c; for( c=i, f=HT[i].parent; f!=0; c=f, f=HT[f].parent ) if( HT[f].lchild == c ) cd[--start] = '0'; else cd[--start] = '1'; HC[i] = (char*)malloc((n-start)*sizeof(char)); strcpy(HC[i], &cd[start]); } free( HT ); //free( cd ); } void Select(HuffmanTree HT, int n, int *s1, int *s2) { int i; HT[0].weight = (unsigned long)(-1l); *s1 = *s2 = 0; for( i=1; i<=n; i++ ) if( HT[i].parent == 0 ) { if( HT[i].weight < HT[*s1].weight ) { *s2 = *s1; *s1 = i; } else if( HT[i].weight < HT[*s2].weight ) { *s2 = i; } } } int main() { int i; int LEN = 5; unsigned long weight[LEN]; for(i=0; i<LEN; i++) weight[i] = i+1; weight[4] = 100; HuffmanCoding( weight, LEN ); for( i=1; i<=LEN; i++ ) printf("%s\n", HC[i]); return 0; }