哈夫曼编码

一、哈夫曼编码的特性及作用
哈夫曼编码的目的是得到平均长度最短的编码,对一棵具有n个叶子的哈夫曼树,若对树中的每个左分支赋予0,右分支赋予1(也可调换顺序),则从根到每个叶子的通路上,各分支的赋值分别构成一个二进制串,该二进制串就称为哈夫曼编码。哈夫曼编码是前缀编码,因为在所以叶子所构成的二进制串中,任一编码都不是其他编码的前缀,哈夫曼编码是最优前缀编码,使用频度较高的字符对应的编码较短。
利用哈夫曼树可以的到平均长度最短的编码,研究操作码的优化问题主要是为了缩短指令字的长度,减少程序的总长度以及增加指令所能表示的操作信息和地址信息。
二、哈夫曼编码的算法实现
typedef char * HuffmanCode[N+1];//存放哈夫曼编码串的头指针数组
由于每个哈夫曼编码是变长编码,因此使用指针数组存放每个编码串的头指针
void CrtHuffmanCode(HuffmanTree ht,HuffmanCode hc,int n)
//从叶子结点到根,逆向求每个叶子结点对应的哈夫曼编码
{
char *cd;
int i,start,c,p,j,k;
cd=(char *)malloc(n*sizeof(char));//分配求当前编码的工作空间
cd[n-1]=’\0’;//从右向左逐位存放编码,首先存放编码结束符
for(i=1;i<=n;i++) //求n个叶子结点对应的哈夫曼编码
{
start=n-1;//初始化编码起始指针
c=i;
p=ht[i].parent;//从叶子结点开始往上倒推
while(p!=0)
{
–start;
if(ht[p].LChild==c) cd[start]=’0’;
else cd[start]=’1’;
c=p;
p=ht[p].parent;
}
hc[i]=(char *)malloc((n-start)*sizeof(char));//为第i个编码分配空间
k=n-start;
for(j=0;j

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值