哈夫曼树与哈夫曼编码 – Jezze

在普通数据和解的书中,树屁股的那一章,作者通常绍介霍夫曼(霍夫曼)

树与霍夫曼编码。哈夫曼编码是哈夫曼树的任何人消耗。霍夫曼码被大量地运用。,如

jpeg在霍夫曼编码做成某事消耗。 率先绍介是什么哈夫曼树。哈夫曼树也叫最优二叉树,

它是任何人有最短远远地时间的长短的双叉树。。相同的树的真正的远远地的时间的长短,树上所若干叶子及梗和枝包装材料

重任值扩张到根包装材料 远远地时间的长短(根包装材料为0),叶包装材料到远远地时间的长短的根包装材料。

叶包装材料的层数。一棵树的远远地时间的长短的分量记载带 (W1*L1+W2*L2+W3*L3+…+Wn*Ln)

,N分量WI(I=1),2,n)组成具有n个叶包装材料的两叉树。,确切的的叶包装材料的远远地

时间的长短是李(I=1),2,…n)。可以证实哈夫曼树的WPL是最小的。

霍夫曼编码的提议:

一、在附近赠送的的n重{ W1,W2,W3,…,Wi,…,WN }组成的初始集F n树,两树 { T1,T2,T3,…,Ti,…,Tn},每两棵二叉树中仅有的任何人分量是Wi的根。,它的左、右子树为空。(为了便于在计算图表上计算) 法,普通来说,还必要扩张TI的分量次。。)
二、在F中,选择两个根包装材料重任最小的树作为左派包装材料。,对两个新树的根包装材料的重任值的额外的总和。
三、从f中切除这两棵树,新的两叉树在相同爬坡到集中F。。
四、反复这两个提议和32个提议,直到集中中仅有的一棵二叉树。。

复杂的了解是,也许我有,B,C,D,E五字,频率(即重任)辨别是非为5。,4,3,2,1,本人的宁愿步是把两个最小分量的左、右subtre,换句话说,占1。,2体现一棵新树,它的包装材料是1 2 = 3,如图:

12

虚线是任何人新体现的包装材料。,次货步是将新产额的包装材料的重任为r的3。,因而集为{ 5,4,3,3},推理次货步,以最小的两个额外的体现一棵新树,如图:

13

再授权到达哈夫曼树,如下图:

14

每个分量继任确切的的性格如下图:

15

去每个性格的确切的行为准则是:A->11,B->10,C->00,D->011,E->010

霍夫曼编码是一种非前缀编码。。解码不能胜任的涂污。它次要用于数据压缩。,编密码解密。。

c文体行为准则的变卖:

/*-------------------------------------------------------------------------
 * Name:   霍夫曼编码源行为准则。
 * Date:   
 * Author: Jeffrey Hill   jezze(解码党派)
 * 在 Win-TC 下任何人尺寸经过了。
 * 变卖做事方法:经过宁愿关 HuffmanTree() 重大聚会坚信礼哈夫曼树,因此在main重大聚会中 在主
 *           自上而下断定(即,从部署兵力的包装材料数为零),若在
 *           父包装材料的靠近的一边,因此将行为准则设置为 0,也许是在正当,因此将行为准则设置为 1。终极出口的编码。
 *------------------------------------------------------------------------*/
#include 
#include
 
#define MAXBIT      100
#define MAXVALUE  10000
#define MAXLEAF     30
#define MAXNODE    MAXLEAF*2 -1
 
typedef struct
{
int bit[MAXBIT];
int start;
} HCodeType;        /* 编码和解体 */
typedef struct
{
int weight;
int parent;
int lchild;
int rchild;
intvalue;
} HNodeType;        /* 包扎和解体 */
 
/* 坚信礼一颗哈夫曼树 */
void HuffmanTree (HNodeType HuffNode[MAXNODE],  int n)
{ 
/* i、j: 传送变量,m1、m2:坚信礼哈夫曼树变化多的做事方法中两个最小额外的包扎的额外的,
        x1、x2:坚信礼哈夫曼树变化多的做事方法中两个最小额外的包扎在部署兵力做成某事序号。*/
int i, j, m1, m2, x1, x2;
/* 设定初值存款哈夫曼树部署兵力 HuffNode[] 谷粒包装材料 */
for (i=0; i<2*n-1; i++)
    {
        huffnode [我]。分量 = 0;//额外的 
        huffnode [我]。母 =-1;
        huffnode摆布[我]。 =-1;
        HuffNode[i].rchild =-1;
        HuffNode[i].value=i; //实践值,可以推理使习惯于来替代信  
    } /* end for */
 
/* 输出 n 任何人叶包装材料的分量 */
for (i=0; i
    {
        printf ("Please input weight of leaf node %d: \n", i);
        scanf ("%d", &huffnode [我]。分量);
    } /* end for */
 
/* 传送坚信礼 Huffman 树 */
for (i=0; i
    {
        m1=m2=MAXVALUE;     /* m1、在M2中,两个包装材料缺少父包装材料和两个包装材料,包装材料重任最小。 */
        x1=x2=0;
/* 找出懂得包装材料中最小的重任、父包装材料缺少两个包装材料,兼并成一棵二叉树 */
for (j=0; j
        {
if (huffnode [J]。分量 < m1 && HuffNode[j].parent==-1)
            {
                m2=m1; 
                x2=x1; 
                M1 = huffnode [J]。分量
                x1=j;
            }
elseif (huffnode [J]。分量 < m2 && HuffNode[j].parent==-1)
            {
                M2 = huffnode [J]。分量
                x2=j;
            }
        } /* end for */
/* 设置找到的两声望包装材料 x1、x2 父包装材料要旨 */
        huffnode [ 1 ]。母  = n+i;
        huffnode [ 2 ]。母  = n+i;
        HuffNode[n+i].weight = huffnode [ 1 ]。分量 + huffnode [ 2 ]。分量
        HuffNode[n+i].lchild = x1;
        HuffNode[n+i].rchild = x2;
 
        printf ("x1.weight and x2.weight in round %d: %d, %d\n", i+1, huffnode [ 1 ]。分量, huffnode [ 2 ]分量)。  /* 尺寸 */
        printf ("\n");
    } /* end for */
/*  为(i = 0;i)
    {
        printf( 双亲:%d,摆布:%d,rchild:%d,价:%d,weight:%d\n",huffnode [我]。母,huffnode摆布[我]。,HuffNode[i].rchild,huffnode [我]的价。,huffnode [我]。分量);
                  }*///尺寸 
} /* end HuffmanTree */
 
//解码 
void decodeing(charstring[],HNodeType Buf[],int 努姆)
{
int i,tmp=0,code[1024];
int m=2*Num-1;
char *nump;
char num[1024];
for(i=0;istring);i++)
  {
if(string[i]==''0'')
  num[i]=0;        
else
  num[i]=1;                    
  } 
  i=0;
  nump=&num[0];

while(nump<(&num[strlen(string)]))
 {tmp=m-1;
while((BUF [ TMP摆布]。!1)&&(BUF [ ] rchild TMP。!=-1))
  {

if(*nump==0)
   {
     TMP = buf [ TMP摆布]。 ;          
   } 
else tmp=但[ TMP ]rchild;
   nump++;

  } 

  printf("%d",但[ TMP ]value);                                  
 }
 

}
 
 
int main(void)
{

    HNodeType HuffNode[MAXNODE];            /* 界限包装材料和解部署兵力 */
    HCodeType HuffCode[MAXLEAF],  cd;       /* 界限编码和解部署兵力, 同时,暂时变量界限蓄电要旨 */
int i, j, c, p, n;
char 聚丙烯[ 100 ]
    printf ("Please input n:\n");
    scanf ("%d", &n);
    HuffmanTree (HuffNode, n);


for (i=0; i < n; i++)
    {
         = n-1;
        c = i;
        p = HuffNode [ C ]。母
while (p != -1)   /* 父包装材料的在 */
        {
if (HuffNode [P]摆布。 == c)
                [] = 0;
else
                [] = 1;
            --;        /* 低位编码 */
            c=p;                    
            p=HuffNode [ C ]。母    /* 设置下任何人传送状态 */
        } /* end while */

/* 霍夫曼行为准则和果酱的每个包装材料的编码鼻定位。 */
for (j=+1; j
        { huffcode [我],点[ J ] = [j];}
        huffcode [我]开端 = ;
    } /* end for */

/* 果酱懂得现若干编码霍夫曼编码出口。 */
for (i=0; i
    {
        printf ("%d ''s Huffman code is: ", i);
for (j=huffcode [我]开端+1; j < n; j++)
        {
            printf ("%d", huffcode [我],点[ J ]);
        }
        printf(" 启动:%d,huffcode [我]开端);

        printf ("\n");

    }
/*    为(i = 0;i)
    在附近(j = 0;j)
        {
             printf ("%d", huffcode [我],点[ J ]);           
        }
        printf(\n");
        }*/
    printf(解码?托付 Enter 行为准则:n);
    scanf("%s",PP)
decodeing(pp,HuffNode,n);
    getch();
return 0;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注