哈夫曼编码

来源:互联网 发布:学格斗的软件 编辑:程序博客网 时间:2024/06/15 17:27
#include "Huffman.h"void Huffman(float *data,int len){int num,i;num=2*len-1;//总结点是叶子结点的2倍少一个HuffmanNode *head=(HuffmanNode*)malloc(num*sizeof(HuffmanNode));for (i=0;i<len;i++){head[i].weight=data[i];head[i].parent=0;head[i].lchild=0;head[i].rchild=0;}//初始化  for (i=len;i<num;i++)  {  head[i].weight=10000;  head[i].parent=0;  head[i].lchild=0;      head[i].rchild=0;  }  for (i=len;i<num;i++)  {  Selectnode(head,i);  }  printf("节点号:权重    \t父节点\t左孩子\t右孩子\n");  for ( i=0;i<num;i++)  {  printf("%d: %f\t%d\t%d\t%d\n",i,head[i].weight,head[i].parent,head[i].lchild,head[i].rchild);  }   }void Selectnode(HuffmanNode *head,int len){int min1,min2,i;//找出集合中最小的两个for ( i=0;i<len;i++){if(head[i].parent==0){min1=i;}}for ( i=0;i<len;i++){if(head[i].parent==0&&min1!=i){min2=i;}}for ( i=0;i<len;i++){if(head[i].parent==0){           if (head[min1].weight>head[i].weight&&min2!=i)           {   min1=i;           }   if (head[min2].weight>head[i].weight&&i!=min1)   {   min2=i;   }}}       //将新的节点填入        head[min1].parent=len;head[min2].parent=len;head[len].lchild=min1;head[len].rchild=min2;head[len].weight=head[min1].weight+head[min2].weight;}

1.重点在其存储结构,用顺序表比较好。

#include <MALLOC.H>#include <stdio.h>struct HuffmanNode {   float weight;//比重   int parent;//父节点   int rchild;//右孩子   int lchild;//左孩子};void Selectnode(HuffmanNode *head,int len);//选择2个最小的加入顺序表HEAD中void Huffman(float *data,int len);//哈夫曼编码


2.缺点:找最小两个的时候,应该用堆排序比较好。

                                             
0 0