哈夫曼树

0

是什么哈夫曼树?

让咱们举个询问。。

论断树:

        在处置多的成就的进程中,必要宽宏大量的的学期断定。,这些断定妥协的设计立即的情感着手段引起。。比如,编辑者,百分位数转变为产出的五的等级。你能够认为刚过去的进程很简略。,很快就可以用上面的表格写成。:

  1. if(得分)<60)  
  2.     cout<<“Bad”<
  3. else if(得分)<70)  
  4.     cout<<“Pass”<
  5. else if(得分)<80)  
  6.     cout<<“General”<
  7. else if(得分)<90)  
  8.     cout<<“Good”<
  9. else  
  10.     cout<<“Very good!”<

 

思索在上述的进程中破费的工夫。,顺序的缺陷将被发明。。在实践中,五的年级先生成就散布希望。。当先生的分为100%时是十足的大的。,上述的方针决策进程必要逆转调动。,在这点上,顺序的手段生产力将变成严肃的。。

但在实践专心致志中,通常,每个馏分的散布是希望匀的。。以下是试验中一门行动方向成就的散布养护。: 

上面咱们就运用哈夫曼树找寻一棵粹论断树,具有指派总额最少的方针决策树。。

第一种破土方法:

以第二位种破土方法:

这两种方法,显然,后者比前者更有生产力。。缺席其余的的断定,刚过去的进程比SECO更无效。。

咱们把两叉树称为粹方针决策进程。哈夫曼树,也叫最优二叉树

===================================================================================================

 界说哈夫曼树先发制人先阐明各自的与哈夫曼树顾虑的打手势询问:

途径: 树射中靶子压紧与另一任一某一压紧当中的分科表格了。

途径程度:途径上的分科数称为途径程度。。

树的途径程度:从树根到每个压紧的途径程度积和。。

压紧的额外的途径程度:在一棵树中,假定它的压紧上有一任一某一使加权。,总而言之,压紧的程度和压紧上的使加权被运用。

                                                              之积称为该压紧的额外的途径程度(weighted path 程度)

  是什么分量? From 百度百科 )

     电脑围绕(datum的复数妥协)

  使加权是途径界说的值。。它可以担心为压紧当中的间隔。。通常指多少对应角色的概率。。

  竟至Hoffman tree的分量,可以担心为:大的使加权表现大的产生概率。!

  压紧的使加权实践上是压紧子树的生水垢。

  四叶节的分量为7。,5,2,4. 这7,5,2,4是本实践养护。,比如,从说法中,ABCD四字母的总额是7个。,5,2,4.
A压紧的使加权为7。,这目的A压紧居住零碎射中靶子7的总额。说起来,,但这更折磨。,实在是俱的。

树的带权途径程度:假定树上的每碎屑生叶都有分量,树中缠住生叶的额外的途径程度的总和称为

                                   权途径程度。

设置具有N个额外的叶压紧的二叉树。,两叉树的额外的途径程度记载为:

                                  

规则的中,WK是K叶压紧的使加权。;LK是压紧的途径程度。。

示例:

======================================================================================================

总而言之,采取N(n>0)额外的树确认二叉树。,以及N叶远处,在两叉TrE中算是却界说2个压紧。。

相应地,适合这一学期的两叉树再三可以指派MA。,

具有最小额外的途径程度的两叉树高地哈夫曼树最优二叉树

===============================================================================

  二、哈夫曼树的确认

理性Haffman tree的界说,二叉树葡萄汁最低消费其WPL值。,使加权越大,叶压紧越粗略估计根压紧。,具有较小使加权的叶压紧

离根压紧越远。。

理性这一加标点于,霍夫曼目前的了一种确认方法。,有理性的列举如下。:

上面是用霍夫曼确认霍夫曼树的一任一某一询问:

在音讯传动装置中,咱们必要在二元系编码中对音讯射中靶子每个角色停止编码。。在设计编码时必要注意到两个基音的。:

(1)发送器传动装置的二元系编码,接受者在解码后不可避免的是单独的的。,即,解码算是与发送的音讯完全同样看待。;

(2)发送的二元系编码尽能够短。。如今咱们将引见两种编码方法。。

1. 等长编码

            这种编码方法的加标点于是每个角色的编码程度同样看待(编码程度执意每个编码所含的二元系位数)。授给物角色集仅象征4个角色A,B,C,D,二元系二位编码为00。,01,10,11。假定如今有音讯,:ABACCDA,葡萄汁发送二元系序列。:00010010101100,总程度为14位。。当收执方收执到音讯时,,它将理性两个微不足道的和一任一某碎屑段停止解码。。该编码具有简略性和单独的性的加标点于。,而是编码程度故障最短的。。

2. 不同长编码

            发送音讯时,将二元系数字的总额减到最少。,每个角色的编码可以被设计为不相等的。,运用绝对高频率的角色来分派绝对短的指定遗传密码。,运用低频角色分派较长的指定遗传密码。。比如,它可以是一任一某一,B,C,D四角色区别被分派0。,00,1,01,上述的音讯可用于二元系序列。:000011010发送,它的程度要不是9个二元系位。,但它产量了一任一某一成就。,在收执到音讯继,收执器不克不及解码它。,因不克不及够买到收场白,后面的4个0是4 A。,1个B、2 A,静止摄影2个B,即,解码故障单独的的。,相应地,这种编码方法是不诉讼的。。

相应地,为了设计长而不同的编码,照着缩减音讯的总程度。,还不可避免的思索指定遗传密码。单独的性,即,当结构一任一某一不同程度的指定遗传密码时,普通的CH的编码。,刚过去的编码叫做前缀编码(前缀)。
指定遗传密码)

(1)运用角色集合每个角色的运用频率作为权值确认一任一某一哈夫曼树;

(2)从根压紧开端。,每个叶压紧途径的左分科被分派到0。,右翼的树枝是1根。,叶压紧从根到叶方向的编码。

榜样:

授给物说法纵列Tfile只象征7个角色{A,B,C,D,E,F,G},说法射中靶子7个角色出如今{ 5次》中。,24,7,17,34,5,13}

运用哈夫曼树可认为纵列TFile确认出适合前缀编码询问的不同长编码

具体做法:

1. 以TFile 7个角色作为叶压紧。,每个角色的涌现次数作为叶压紧的使加权。

2. 规则哈夫曼树中缠住左分科表现角色0,缠住分科代表角色1。,从根压紧到每个叶的分科的二元系位序列

     对应于压紧的角色编码

3. 将普通的生叶从根压紧使分娩到普通的叶压紧是不克不及够的。,此编码不可避免的是前缀编码。,哈夫曼树的带权途径程度平面是纵列TFile编码

    的总程度

经过哈夫曼树来确认的编码称为霍夫曼编码(霍夫曼) 指定遗传密码)

 

  1. #include  
  2. #include  
  3. #include  
  4. using namespace std;  
  5.   
  6. 界说编码角色的N 10 /数,即,树射中靶子压紧总额至多。  
  7. 界说m(2×n-1)//树射中靶子压紧总额  
  8.   
  9. class HTNode{          
  10. public:   
  11.     unsigned int weight;  
  12.     unsigned int parent,lchild,rchild;  
  13. };                      
  14.   
  15. class HTCode{  
  16. public:  
  17.     char data;        
  18.     int weight;       
  19.     char指定遗传密码[n]  
  20. };  
  21.   
  22. voidHTCode(HC), int *n){  
  23.   
  24.     int i;  
  25.     printf(输出n=);  
  26.     scanf(“%d”,&(*n));  
  27.   
  28.     printf(“\ninput %d character\n”,*n);  
  29.       
  30. FFLUH(STDIN)
  31.     for(i=1; i<=*n; ++i)  
  32.         scanf(“%c”,HC〔I〕datum的复数
  33.   
  34.     printf(“\ninput %d weight\n”,*n);  
  35.       
  36.     for(i=1; i<=*n; ++i)  
  37.         scanf(“%d”,(HC[I]分量)
  38. FFLUH(STDIN)
  39. }  
  40.   
  41. void选择(HTNode HT), int k, int *s1, intS2)
  42.   
  43.     int i;  
  44.     for(i=1; i<=k && ht[i].parent != 0; ++i){   
  45.         ; ;  
  46.     }  
  47. S1= I
  48.   
  49.     for(i=1; i<=k; ++i){  
  50.         if(Ht[i],Prime==0和Ht[i]。
  51.         S1= I
  52.     }  
  53.   
  54.     for(i=1; i<=k; ++i){  
  55.         if(Ht[i]。父==0 & &!S1)
  56.             break;  
  57.     }  
  58. S2= I
  59.   
  60.     for(i=1; i<=k; ++i){  
  61.         if(Ht[i]。父==0 & &!S1&HT〔i〕
  62.         S2= I
  63.     }  
  64. }  
  65.   
  66. void HuffmanCoding(HTNode ht[],HTCode hc[],int n){  
  67.   
  68.     char镉[n]
  69.     int i,j,m,c,f,s1,s2,start;  
  70.     m = 2*n-1;  
  71.       
  72.     for(i=1; i<=m; ++i){  
  73.         if(i <= n)  
  74.             ht[i].weight = hc[i].weight;  
  75.         else  
  76. Ht[i]。父=0
  77.         ht[i].parent = ht[i].lchild = ht[i].rchild = 0;  
  78.     }  
  79.   
  80.     for(i=n+1; i<=m; ++i){  
  81. 选择(HT),I-1, &s1,S2)
  82. Ht[S1]。
  83. Ht[S2]。
  84. Ht[i],LCHOL= S1
  85. Ht[i]
  86.         ht[i].weight = ht[s1].weight+ht[s2].weight;  
  87.     }  
  88.   
  89. 镉〔N-1〕”\0”;  
  90.   
  91.     for(i=1; i<=n; ++i){  
  92. 启动=n-1
  93.         for(c=i,f=Ht[i];父;f;c= f,f=HT〔f〕。
  94.             if(Ht[f],LCHOL==C)
  95. CD [启动]”0”;  
  96.             else  
  97. CD [启动]”1”;  
  98.         }  
  99. STRCPY(HC[i])指定遗传密码,CD [开端]
  100.     }  
  101. }  
  102.   
  103.   
  104. int main()  
  105. {  
  106.     int i,m,n,w[N+1];  
  107.     HTNode ht[M+1];  
  108.     HTCode hc[N+1];  
  109. 设定初值(HC), &n);       
  110.     HuffmanCoding(ht,hc,n);     
  111.   
  112.     for(i=1; i<=n; ++i)    
  113.         printf(“\n%c—%s”,HC[I]datum的复数,HC〔I〕指定遗传密码
  114.     printf(“\n”);  
  115.   
  116.     return 0;  
  117. }  

LEAVE A REPLY