哈夫曼树

0

是什么哈夫曼树?

让we的持有格形式举个案件。。

论断树:

        在处置许多的成就的航线中,需求少量的前提判别。,这些判别框架的设计坦率地感染着完成后果。。诸如,基本编译顺序,百分位数转变为产出的五的等级。你可能性认为左右航线很简略。,很快就可以用上面的表格写成。:

  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%时是正是大的。,上述的方针决策航线需求堕落电话联络。,在这点上,顺序的完成赢利性将适宜庄重地。。

但在现实功能中,通常,每个馏分的散布是胜算匀的。。以下是化验中一门总课程成就的散布境况。: 

上面we的持有格形式就应用哈夫曼树寻觅一棵最适宜条件论断树,具有匹敌总额最少的方针决策树。。

第一种破土办法:

以第二位种破土办法:

这两种方法,显然,后者比前者更有赢利性。。不坚持到底对立的事物的判别,左右航线比SECO更无效。。

we的持有格形式把两叉树称为最适宜条件方针决策航线。哈夫曼树,也称最优二叉树

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

 下定义哈夫曼树优于先阐明专有的与哈夫曼树关系到的胚胎:

远远地: 树达到目标植物的节与另若干人植物的节中间的用枝形叶脉刺绣花纹装饰塑造了。

远远地长:远远地上的用枝形叶脉刺绣花纹装饰数称为远远地长。。

树的远远地长:从树根到每个植物的节的远远地长积和。。

植物的节的额外的远远地长:在一棵树中,设想它的植物的节上有若干人权。,一般而言,植物的节的长和植物的节上的权被应用。

                                                              之积称为该植物的节的额外的远远地长(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值。,权越大,叶植物的节越在近处根植物的节。,具有较小权的叶植物的节

离根植物的节越远。。

本着这一要点,霍夫曼增加了一种组织办法。,有理性的列举如下。:

上面是用霍夫曼组织霍夫曼树的若干人案件:

在音讯让与中,we的持有格形式需求在二元系编码中对音讯达到目标每个要点举行编码。。在设计编码时需求坚持到底两个初步。:

(1)发送器让与的二元系编码,葡萄酒贮藏库在解码后麝香是给换底的。,换句话说,解码归结为与发送的音讯完全完全相同的事物。;

(2)发送的二元系编码尽量性短。。如今we的持有格形式将绍介两种编码方法。。

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