<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      赫夫曼樹

       

       

       

       

      在一般的數(shù)據(jù)結構的書中,樹的那章后面,著者一般都會介紹一下哈夫曼(HUFFMAN)

      樹和哈夫曼編碼。哈夫曼編碼是哈夫曼樹的一個應用。哈夫曼編碼應用廣泛,如

      JPEG中就應用了哈夫曼編碼。 首先介紹什么是哈夫曼樹。哈夫曼樹又稱最優(yōu)二叉樹,

      是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點

      的權值乘上其到根結點的 路徑長度(若根結點為0層,葉結點到根結點的路徑長度

      為葉結點的層數(shù))。樹的帶權路徑長度記為WPL= (W1*L1+W2*L2+W3*L3+...+Wn*Ln)

      ,N個權值Wi(i=1,2,...n)構成一棵有N個葉結點的二叉樹,相應的葉結點的路徑

      長度為Li(i=1,2,...n)??梢宰C明哈夫曼樹的WPL是最小的。

      哈夫曼編碼步驟:

      一、對給定的n個權值{W1,W2,W3,...,Wi,...,Wn}構成n棵二叉樹的初始集合F= {T1,T2,T3,...,Ti,...,Tn},其中每棵二叉樹Ti中只有一個權值為Wi的根結點,它的左右子樹均為空。(為方便在計算機上實現(xiàn)算 法,一般還要求以Ti的權值Wi的升序排列。)
      二、在F中選取兩棵根結點權值最小的樹作為新構造的二叉樹的左右子樹,新二叉樹的根結點的權值為其左右子樹的根結點的權值之和。
      三、從F中刪除這兩棵樹,并把這棵新的二叉樹同樣以升序排列加入到集合F中。
      四、重復二和三兩步,直到集合F中只有一棵二叉樹為止。

      簡易的理解就是,假如我有A,B,C,D,E五個字符,出現(xiàn)的頻率(即權值)分別為5,4,3,2,1,那么我們第一步先取兩個最小權值作為左右子樹構造一個新樹,即取1,2構成新樹,其結點為1+2=3,如圖:

      虛線為新生成的結點,第二步再把新生成的權值為3的結點放到剩下的集合中,所以集合變成{5,4,3,3},再根據(jù)第二步,取最小的兩個權值構成新樹,如圖:

      再依次建立哈夫曼樹,如下圖:

      其中各個權值替換對應的字符即為下圖:

      所以各字符對應的編碼為:A->11,B->10,C->00,D->011,E->010

      霍夫曼編碼是一種無前綴編碼。解碼時不會混淆。其主要應用在數(shù)據(jù)壓縮,加密解密等場合。

      C語言代碼實現(xiàn):

        1 /*-------------------------------------------------------------------------
        2  * Name:   哈夫曼編碼源代碼。
        3  * Date:   2011.04.16
        4  * Author: Jeffrey Hill+Jezze(解碼部分)
        5  * 在 Win-TC 下測試通過
        6  * 實現(xiàn)過程:著先通過 HuffmanTree() 函數(shù)構造哈夫曼樹,然后在主函數(shù) main()中
        7  *           自底向上開始(也就是從數(shù)組序號為零的結點開始)向上層層判斷,若在
        8  *           父結點左側,則置碼為 0,若在右側,則置碼為 1。最后輸出生成的編碼。
        9  *------------------------------------------------------------------------*/
       10 #include <stdio.h>
       11 #include<stdlib.h>
       12  
       13 #define MAXBIT      100
       14 #define MAXVALUE  10000
       15 #define MAXLEAF     30
       16 #define MAXNODE    MAXLEAF*2 -1
       17  
       18 typedef struct 
       19 {
       20     int bit[MAXBIT];
       21     int start;
       22 } HCodeType;        /* 編碼結構體 */
       23 typedef struct
       24 {
       25     int weight;
       26     int parent;
       27     int lchild;
       28     int rchild;
       29     int value;
       30 } HNodeType;        /* 結點結構體 */
       31  
       32 /* 構造一顆哈夫曼樹 */
       33 void HuffmanTree (HNodeType HuffNode[MAXNODE],  int n)
       34 { 
       35     /* i、j: 循環(huán)變量,m1、m2:構造哈夫曼樹不同過程中兩個最小權值結點的權值,
       36         x1、x2:構造哈夫曼樹不同過程中兩個最小權值結點在數(shù)組中的序號。*/
       37     int i, j, m1, m2, x1, x2;
       38     /* 初始化存放哈夫曼樹數(shù)組 HuffNode[] 中的結點 */
       39     for (i=0; i<2*n-1; i++)
       40     {
       41         HuffNode[i].weight = 0;//權值 
       42         HuffNode[i].parent =-1;
       43         HuffNode[i].lchild =-1;
       44         HuffNode[i].rchild =-1;
       45         HuffNode[i].value=i; //實際值,可根據(jù)情況替換為字母  
       46     } /* end for */
       47  
       48     /* 輸入 n 個葉子結點的權值 */
       49     for (i=0; i<n; i++)
       50     {
       51         printf ("Please input weight of leaf node %d: \n", i);
       52         scanf ("%d", &HuffNode[i].weight);
       53     } /* end for */
       54  
       55     /* 循環(huán)構造 Huffman 樹 */
       56     for (i=0; i<n-1; i++)
       57     {
       58         m1=m2=MAXVALUE;     /* m1、m2中存放兩個無父結點且結點權值最小的兩個結點 */
       59         x1=x2=0;
       60         /* 找出所有結點中權值最小、無父結點的兩個結點,并合并之為一顆二叉樹 */
       61         for (j=0; j<n+i; j++)
       62         {
       63             if (HuffNode[j].weight < m1 && HuffNode[j].parent==-1)
       64             {
       65                 m2=m1; 
       66                 x2=x1; 
       67                 m1=HuffNode[j].weight;
       68                 x1=j;
       69             }
       70             else if (HuffNode[j].weight < m2 && HuffNode[j].parent==-1)
       71             {
       72                 m2=HuffNode[j].weight;
       73                 x2=j;
       74             }
       75         } /* end for */
       76             /* 設置找到的兩個子結點 x1、x2 的父結點信息 */
       77         HuffNode[x1].parent  = n+i;
       78         HuffNode[x2].parent  = n+i;
       79         HuffNode[n+i].weight = HuffNode[x1].weight + HuffNode[x2].weight;
       80         HuffNode[n+i].lchild = x1;
       81         HuffNode[n+i].rchild = x2;
       82  
       83         printf ("x1.weight and x2.weight in round %d: %d, %d\n", i+1, HuffNode[x1].weight, HuffNode[x2].weight);  /* 用于測試 */
       84         printf ("\n");
       85     } /* end for */
       86   /*  for(i=0;i<n+2;i++)
       87     {
       88         printf(" Parents:%d,lchild:%d,rchild:%d,value:%d,weight:%d\n",HuffNode[i].parent,HuffNode[i].lchild,HuffNode[i].rchild,HuffNode[i].value,HuffNode[i].weight);
       89                   }*///測試 
       90 } /* end HuffmanTree */
       91  
       92 //解碼 
       93 void decodeing(char string[],HNodeType Buf[],int Num)
       94 {
       95   int i,tmp=0,code[1024];
       96   int m=2*Num-1;
       97   char *nump;
       98   char num[1024];
       99   for(i=0;i<strlen(string);i++)
      100   {
      101    if(string[i]=='0')
      102   num[i]=0;        
      103   else
      104   num[i]=1;                    
      105   } 
      106   i=0;
      107   nump=&num[0];
      108   
      109  while(nump<(&num[strlen(string)]))
      110  {tmp=m-1;
      111   while((Buf[tmp].lchild!=-1)&&(Buf[tmp].rchild!=-1))
      112   {
      113   
      114    if(*nump==0)
      115    {
      116      tmp=Buf[tmp].lchild ;          
      117    } 
      118    else tmp=Buf[tmp].rchild;
      119    nump++;
      120         
      121   } 
      122   
      123   printf("%d",Buf[tmp].value);                                  
      124  }
      125  
      126   
      127 }
      128  
      129  
      130 int main(void)
      131 {
      132     
      133     HNodeType HuffNode[MAXNODE];            /* 定義一個結點結構體數(shù)組 */
      134     HCodeType HuffCode[MAXLEAF],  cd;       /* 定義一個編碼結構體數(shù)組, 同時定義一個臨時變量來存放求解編碼時的信息 */
      135     int i, j, c, p, n;
      136     char pp[100];
      137     printf ("Please input n:\n");
      138     scanf ("%d", &n);
      139     HuffmanTree (HuffNode, n);
      140    
      141     
      142     for (i=0; i < n; i++)
      143     {
      144         cd.start = n-1;
      145         c = i;
      146         p = HuffNode[c].parent;
      147         while (p != -1)   /* 父結點存在 */
      148         {
      149             if (HuffNode[p].lchild == c)
      150                 cd.bit[cd.start] = 0;
      151             else
      152                 cd.bit[cd.start] = 1;
      153             cd.start--;        /* 求編碼的低一位 */
      154             c=p;                    
      155             p=HuffNode[c].parent;    /* 設置下一循環(huán)條件 */
      156         } /* end while */
      157         
      158         /* 保存求出的每個葉結點的哈夫曼編碼和編碼的起始位 */
      159         for (j=cd.start+1; j<n; j++)
      160         { HuffCode[i].bit[j] = cd.bit[j];}
      161         HuffCode[i].start = cd.start;
      162     } /* end for */
      163     
      164     /* 輸出已保存好的所有存在編碼的哈夫曼編碼 */
      165     for (i=0; i<n; i++)
      166     {
      167         printf ("%d 's Huffman code is: ", i);
      168         for (j=HuffCode[i].start+1; j < n; j++)
      169         {
      170             printf ("%d", HuffCode[i].bit[j]);
      171         }
      172         printf(" start:%d",HuffCode[i].start);
      173        
      174         printf ("\n");
      175         
      176     }
      177 /*    for(i=0;i<n;i++){
      178     for(j=0;j<n;j++)
      179         {
      180              printf ("%d", HuffCode[i].bit[j]);           
      181         }
      182         printf("\n");
      183         }*/
      184     printf("Decoding?Please Enter code:\n");
      185     scanf("%s",&pp);
      186 decodeing(pp,HuffNode,n);
      187     getch();
      188     return 0;
      189 }

       

       
      posted @ 2017-06-30 17:54  lpfuture  閱讀(345)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲成年轻人电影网站WWW | 国产在线自拍一区二区三区| 亚洲一区二区三区在线观看播放| 成熟女人特级毛片www免费| 亚洲国产亚洲综合在线尤物| JIZZJIZZ国产| 大伊香蕉在线精品视频75| 色吊丝二区三区中文字幕| 国产999久久高清免费观看| 午夜精品亚洲一区二区三区 | 日本中文字幕在线播放| 色综合中文综合网| 国产精品无遮挡猛进猛出| 成人影片麻豆国产影片免费观看| 国产精品自拍午夜福利| 你拍自拍亚洲一区二区三区| 亚洲av一本二本三本| 免费观看激色视频网站| 日日橹狠狠爱欧美视频| 亚洲精品国产一二三区| 久久国产精品第一区二区| 人妻无码| 加勒比亚洲天堂午夜中文| 九九电影网午夜理论片| 成人年无码av片在线观看| 国产呦交精品免费视频| 国产人妻人伦精品婷婷| 国内精品久久毛片一区二区| 爱性久久久久久久久| 少妇熟女久久综合网色欲| 亚洲国产午夜理论片不卡| 亚洲女同精品中文字幕| 亚洲日韩一区二区| 国产精品免费观看色悠悠| 亚洲狠狠婷婷综合久久久久图片| 国产成人午夜福利精品| 亚洲男人天堂2018| 欧美大胆老熟妇乱子伦视频| 无码一区中文字幕| 国产亚洲精品aaaa片app| 九九热在线免费视频精品|