读书人

赫夫曼编码解决思路

发布时间: 2012-03-05 11:54:02 作者: rapoo

赫夫曼编码
今天看了赫夫码的问题,但书上写的东西看得不是很懂,希望看到一个实际的程序来加深理解,条件如下:
二十六个英文字母,他们的使用权值分别为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;      } 

读书人网 >C语言

热点推荐