数据结构 树 Huffman编码

本文介绍了Huffman树的概念及编码实现过程,并讨论了Huffman树的非唯一性及其编码效率。通过具体算法实例,展示了如何选取具有最小权值的节点以构建Huffman树,并给出了完整的C语言程序代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Huffman树不是唯一的,这是因为在选择具有最小权值的2个节点时会出现权值相等的情况。

编码效率是不是一样的?不一样,但相差不大。

如何选择最小的?

2. 一组数,找最小的两个,算法的复杂度是On + ceil(log(n)) - 2),使用堆排序。

3. Huffman编码算法用于压缩。

程序如下:

#include<stdio.h>
#include
<stdlib.h>
#include
<string.h>

typedef
struct...{
unsigned
intweight;
unsigned
intparent;
unsigned
intleft;
unsigned
intright;
}
HNode;

typedef
char**HCode;

voidselect(HNode*htree,inti,int&s1,int&s2)...{
for(intj=1;j<=i;j++)...{
if(htree[j].parent!=0)...{
continue;
}
else...{
s1
=j;
break;
}

}


for(j++;j<=i;j++)...{
if(htree[j].parent!=0)...{
continue;
}
else...{
s2
=j;
break;
}

}


if(htree[s1].weight>htree[s2].weight)...{
inttmp=s2;
s2
=s1;
s1
=tmp;
}


for(j=1;j<=i;j++)...{
if(htree[j].parent==0)...{
if(htree[j].weight<=htree[s2].weight)...{
if(htree[j].weight<htree[s1].weight)...{
s2
=s1;
s1
=j;
}
else...{
if(j!=s1)...{
s2
=j;
}

}

}

}

}

}


voidHuffmanCoding(HNode*htree,HCode&hcode,int*w,intn)...{
if(n<=1)...{
return;
}


intm=2*n-1;
inti=0;

htree
=(HNode*)malloc(sizeof(HNode)*(m+1));

HNode
*p=htree;
for(i=1;i<=n;i++)...{
p
++;

(
*p).weight=w[i-1];

(
*p).parent=(*p).left=(*p).right=0;
}


for(;i<=m;i++)...{
p
++;
(
*p).weight=(*p).parent=(*p).left=(*p).right=0;
}



ints1=0,s2=0;
for(i=n+1;i<=m;i++)...{
select(htree,i
-1,s1,s2);
htree[s1].parent
=i;
htree[s2].parent
=i;
htree[i].left
=s1;
htree[i].right
=s2;
htree[i].weight
=htree[s1].weight+htree[s2].weight;
}



hcode
=(HCode)malloc(sizeof(char*)*(n+1));

char*ch=(char*)malloc(n*sizeof(char));
ch[n
-1]='

执行结果为:

Huffman编码为:
a:
11111
b:
10
c:
1110
d:
000
e:
110
f:
01
g:
11110
h:
001
1111110000110
abde
Pressanykeyto
continue
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值