哈夫曼编码

#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.缺点:找最小两个的时候,应该用堆排序比较好。


                                    
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值