熟悉及难赫夫曼树(哈夫曼树的建立及应用)

本文目录
哈夫曼树的建立及应用
#include《iostream.h》
#include《iomanip.h》
const int n=8;
const int m=2*n-1;
struct tree
{
float weight;
int parent;
int lch,rch;
};
struct codetype
{
int bits;
int start;
char ch;
};
tree hftree;
struct codetype code;
void creathuffmantree()
{
int i,j,p1,p2;
float s1,s2;
for(i=1;i《=m;i++)
{
hftree.parent=0;
hftree.lch=0;
hftree.rch=0;
hftree.weight=0; }
cout《《"输入"《《n《《"个权值"《《endl;
for(i=1;i《=n;i++)
cin》》hftree.weight;
for(i=n+1;i《=m;i++)
{
p1=p2=0;
s1=s2=32767;
for(j=1;j《=i-1;j++)
if(hftree.parent==0)
if(hftree.weight《s1)
{
s2=s1;
s1=hftree.weight;
p2=p1;
p1=j;
}
else
if(hftree.weight《s2)
{
s2=hftree.weight;p2=j;
}
hftree.parent=i;
hftree.parent=i;
hftree.lch=p1;
hftree.rch=p2;
hftree.weight;
}
}void huffcode()
{
codetype cd;
int c,p;
for(int i=1;i《=n;i++)
{
cd.start=n+1;
cd.ch=96+i;
c=i;
p=hftree.parent;
while(p!=0)
{
cd.start--;
if(hftree=0;
else cd.bits=1;
c=p;
p=hftree.parent;
}
code=cd;
}
for(i=1;i《=n;i++)
{
cout《《"字符"《《code.weight《《setw(5)《《"编码为:";
for(int j=code.start;j《=n;j++)
cout《《code《《" ";
cout《《endl;
}}void trancode()
{
int i=m;char b;
cout《《"请输入一串二进制编码(0、1以外的数结束)";
cin》》b;
while((b==’0’)||(b==’1’))
{
if(b==’0’)i=hftree.lch;
else i=hftree.rch;
if(hftree.lch==0)
{
cout《《code.ch;
i=m;
}
cin》》b;
}}void main()
{
creathuffmantree();
huffcode();
trancode();
}
树 - 哈夫曼树及其应用 - 最优二叉树(一)
树的路径长度
树的路径长度是从树根到树中每一结点的路径长度之和 在结点数目相同的二叉树中 完全二叉树的路径长度最短
树的带权路径长度(Weighted Path Length of Tree 简记为WPL)
结点的权 在一些应用中 赋予树中结点的一个有某种意义的实数
结点的带权路径长度 结点到树根之间的路径长度与该结点上权的乘积
树的带权路径长度(Weighted Path Length of Tree) 定义为树中所有叶结点的带权路径长度之和 通常记为
其中
n表示叶子结点的数目
w i 和l i 分别表示叶结点k i 的权值和根到结点k i 之间的路径长度
树的带权路径长度亦称为树的代价
最优二叉树或哈夫曼树
在权为w l w … w n 的n个叶子所构成的所有二叉树中 带权路径长度最小(即代价最小)的二叉树称为 最优二叉树 或
哈夫曼树
【例】给定 个叶子结点a b c和d 分别带权 和 构造如下图所示的三棵二叉树(还有许多棵) 它们的带权路径长度分别
为
(a)WPL= * + * + * + * =
(b)WPL= * + * + * + * =
(c)WPL= * + * + * + * =
其中(c)树的WPL最小 可以验证 它就是哈夫曼树
注意
① 叶子上的权值均相同时 完全二叉树一定是最优二叉树 否则完全二叉树不一定是最优二叉树
② 最优二叉树中 权越大的叶子离根越近
③ 最优二叉树的形态不唯一 WPL最小
lishixinzhi/Article/program/sjjg/201311/23865有熟悉哈夫曼编码的没,怎样让最短编码从0开始
哈夫曼编码
哈夫曼编码(Huffman Coding)是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。uffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长 度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。
哈夫曼编码举例
以哈夫曼树—即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。 在计算机信息处理中,“哈夫曼编码”是一种一致性编码法(又称"熵编码法"),用于数据的无损耗压缩。这一术语是指使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码模帆,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。这种方法是由David.A.Huffman发展起来的。 例如,在英文中,e的出现概率很高,而z的出现概率则最低。当利用哈夫曼编码对一篇英文进行压缩时,e极有可能用一个位(bit)来表示,而z则可能花去25个位(不是26)。用普通的表示方法时,每个英文字母均占用一个字节(byte),即8个位。二者相比,e使用了一般编码的1/8的长度,z则使用了3倍多。倘若我们能实现对于英文中各个字母出现概率的较准确的估算,就可以大幅度提高无损压缩的比例。
本文描述在网上能够找到的最简单,最快速的哈夫曼编码。本方法不使用任迟悔何扩展动态库,比如STL或者组件。只使用简单的C函数,比如:memset,memmove,qsort,malloc,realloc和memcpy。
因此,大家都会发现,理解甚至修改这个编码都是很容旦旦雹易的。

更多文章:
sumproduct多条件排名不重复(Excel 求助,如何多条件统计不重复个数)
2026年10月11日 23:10
gcc编译器参数(深度linux的arm-linux-gnueabihf-gcc编译参数如何配)
2026年10月11日 19:30
asp是什么检查项目(医院血液检验项目RPR、TPPA、HIV-Ab各是什么意思)
2026年10月11日 10:20
汇编输出指令(用汇编语言循环指令在屏幕中间输出红底白字的“hello I am 720“)
2026年10月11日 07:20
本地搭建springboot项目(使用eclipse构建springboot项目)
2026年10月11日 06:20
java入门神器好用吗(java 7入门经典适合初学者自学用吗)
2026年10月11日 02:40




