哈夫曼树及其应用

1、哈夫曼树的基本概念 

—- 霍夫曼(霍夫曼)也高水平树最优二叉树,这是第一N额外的的叶包装两种在树上,带权道路按大小排列最小的两个二元系树。

—- 道是第一党派的下分支的指令从树上的第一包装到另第一。,而下分支的指令数的道路的按大小排列

—- 树的道路按大小排列:是从根到每个包装的道路按大小排列和。

—- 采用指出错误的结,捆扎带权道路按大小排列为:从包装到包装和结果道路按大小排列在恰当地的根当中。。

—- 额外的道路按大小排列WPL(额外的 path 按大小排列):所大约翻书包装在树说得中肯指出错误道路按大小排列。

承认第一有n额外的的叶包装二叉树,分量{ W1,w2,….wn},每个叶包装额外的周数,每片翻书的道路按大小排列 lk,从根包装

到分开翻书捆扎的道路按大小排列与一致的的权值的产品积和叫做二叉树的带权道路按大小排列,通常:

        

如图所示,两叉树三个差别的管弦乐队的全部乐器:

    

32叉树的指出错误道路按大小排列:

(a)WPL=9×2+4×2+5×2+2×2=18+8+10+4=40

(b)WPL=9×1+5×2+4×3+2×3=9+10+12+6=37

(c)WPL=4×1+2×2+5×3+9×3=4+4+15+27=50

在内地(b)所示二叉树的WPL最小,此树是哈夫曼树。从下面的图片:由n个额外的的叶包装所表格二叉树中,两树或完整二叉树

不尽然是最适宜的的二叉树。大的包装到根包装的权值二叉树才是最优二叉树。

2、哈夫曼树的认可方式

1)按分量的第第一叶包装从小到大的按次按按次排列,即D2,B4,C5,A9.

2)前两个最小分量该包装的子包装的两个新包装n,最好是比较小的左孩子,这边D是N的左孩子,是指出错误的孩子。

如图2-1所示(一),两叶包装的权值和2 4 = 6的新包装n的重担。

3)N1将撤职D和B,为第一订购序列,遵守升序。即C5,N6,A9.

4)反复进行2),N和C作为一种新的包装m两发展、成长的状况或高度包装。如图2-1所示(B),M的分量= 5 6 = 11。

5)将M交换C和N,为第一订购序列,为A9,M11.

6)反复进行2),a和m作为第一新的包装t两发展、成长的状况或高度包装,因T是根包装。,成功哈夫曼树的认可。

      

这么大的认可二叉树才是最优的哈夫曼树,经过方才的进行,可以通用认可哈夫曼树的哈夫曼算法描述方法:

— 1)理性重担的确定的n个叶包装{ W1,w2,WN }表格N个二叉树,T2,…Tn},这两个二叉树说得中肯每第一仅仅第一与右WI。

根捆扎,左、右子树为空。

— 2)选择在F有两个根包装的权值最小的树作为左、右认可一棵新二叉树,且置新二叉树的根捆扎的权值为摆布子树上根捆扎

重担和。

— 3)用力打F说得中肯两个树,同时将新接到二叉树接合处F中。

— 4)反复进行2)3),直到F计入仅仅一棵树。。这棵树便是哈夫曼树。

//哈夫曼树的捆扎典型
typedef struct HTreeNode
{
	char 档案[ 5 ] 每个包装是第一角色型的,Up to 5 characters
	int weight; 中国字的分量
	int parent; 父包装。
	int left; 左子包装。
	int right; 右子包装。
}HTNode;
//哈夫曼树的认可,N个包装,有2n-1个树包装的最后的一代人
void CreateHTree(HTNode ht[],int n)
{
	int lchild,rchild;
	int min1,2
为(int i = 0;i < 2*n-1;i++)
	{
		ht[i].parent = ht[i].left = ht[i].right = -1;
	}
为(int j = n;j < 2 * n-1;j++) //前N个包装是已知的翻书捆扎,认可n之后的捆扎
	{
		min1 = min2 = 32767;
		lchild = rchild = -1;
	为(int k = 0;k

3、哈夫曼编码

---- 哈夫曼编码是哈夫曼树的第一消耗。在数字表达系统,一直必要将译文替换为二元系角色0、1二元系角色串,下面所说的事处理是

同一事物的编码。在物的表达,始终预料尽量的存储管理服务指定遗传密码,最短的音讯与霍夫曼编码认可的按大小排列。

---- 心灵,音讯中每个角色的概率差别。。防备在第一音讯,A,B,C,D中四角色呈现的概率为4/10,1/10,3/10,

2/10,假使不同长编码,让较长的编码的低频表示特性的,可以缩存储管理服务表达的总按大小排列。。

---- 应用可变的按大小排列编码忍住含糊和歧义两D。0 C的防备,01 D,当收执到编码角色串01时,解码0,即时理解

C,过后下第一角色或1合译为一致的的茶,这拐角了两个有意思的。 相应地,若可变的按大小排列编码角色集,则请角色集合

第一角色的编码缺席静止的角色编码的前缀,适合这一请的指定遗传密码称为前缀编码

---- 为了使可变的按大小排列编码的前缀编码,每个角色可以作为第一角色集的叶包装结果第一TW,为了推进存储管理服务的按大小排列,可将

每个角色呈现的频率作为重担的表示特性的装备了一致的的叶包装,最短的树最小额外的道路按大小排列编码物。

---- 可以理性哈夫曼算法认可哈夫曼树T。必要设置前述的音讯编码角色集D = {,B,C,D},呈如今集P = { 4/10音讯频率,1/10,3/10,2/10}

我们的应用第一角色集的角色作为翻书捆扎、鉴于重担的频率,认可一棵哈夫曼树。

                     

在内地,每个包装对应第一角色,警察T的暧昧的,把左下分支的指令记为0,右下分支的指令警察为1。角色编码从根包装到角色的下定义

道路上的包装,记号的每一面是第一序列的霍夫曼编码。

---- 第一编码:0,C编码:10,D编码:110,B编码:111.

显然,任何的角色集,始终体系二叉树编码。鉴于在任何的条款从根捆扎到第一翻书捆扎的道路上必然无力的呈现静止翻书捆扎,

因而经过这种方式编码的前缀编码,遍历二叉树,可以锻炼每个角色的编码。

发表评论

Close Menu