哈夫曼树

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 百度百科 )

     计算器王国(消息建筑风格)

  使负担或压迫是远远地限制的值。。它可以逮捕为杂交生成的生物体当中的间隔。。通常指多少对应得分的概率。。

  基准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〕消息
  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]消息,HC〔I〕密码
  114.     printf(“\n”);  
  115.   
  116.     return 0;  
  117. }  

LEAVE A REPLY