哈夫曼树

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