• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            no_rain

            huffman 編碼學習

            該程序實現的功能是將一段字符串進行統計之后再進行huffman編碼(二進制);
            注意的地方:
            1,huffman編碼要用到貪心算法,所以用priority_queue可以在常量時間內取出和插入值。
            2,靜態建樹:huffman樹的節點表示方法采用了最多的變量,即父親節點,左右子節點(因為程序中確實有這種需要,這里不同與二叉堆,無法通過在靜態樹(鏈表)的位置來確定其父親節點和子節點); 

              1 #include<iostream>
              2 #include<cstring>
              3 #include<queue>
              4 #include<cstdlib>
              5 using namespace std;
              6 const int MAXSIZE = 27;
              7 class huffNode{
              8 public:
              9   int pr;
             10   int lc , rc;
             11   char s;
             12   int pow;
             13   bool operator < (const huffNode& b)const{
             14     return pow > b.pow;
             15   }
             16 };
             17 huffNode huff[MAXSIZE * 2];
             18 string buf;
             19 int count[26];
             20 priority_queue<huffNode> greed;
             21 //for the sake of convenience , assume that the
             22 //standard input is from 'a' to 'z'.
             23 int  input(){
             24   cout << "input the text!"<<endl;
             25   cin >> buf;
             26   for(int i = 0; i < 26 ; i++) count[i] = 0;
             27   memset(huff , 0, sizeof(huff));
             28   for(int i = 0; i < buf.length();i++)count[buf[i]-'a']++;
             29   int len = 0;
             30   for(int i = 0 ,j = 0; i < 26; i++)
             31     if(count[i]){
             32       huff[j].s = i + 'a';
             33       huff[j].pow = count[i];
             34       huff[j].pr = j;
             35       cout << "the" << ' '<<'\''<< char(i+'a') <<'\''
             36        <<' '<<"have arisen for " <<count[i]<<" time(s)"
             37        <<endl;
             38       greed.push(huff[j]);
             39       len = j;
             40       j++;
             41     }
             42   return len;
             43 }
             44 
             45 int createTree(int len){
             46   if(len == 0) {
             47     cout << " Only one kind of alf !"<<endl;
             48     exit(1);
             49   }
             50   huffNode temp1 ,temp2,temp;
             51   while(!greed.empty()){
             52     temp1 = greed.top();
             53     greed.pop();
             54     temp2 = greed.top();
             55     greed.pop();
             56     len ++;
             57     temp.lc = temp1.pr;
             58     temp.rc = temp2.pr;
             59     huff[temp1.pr].pr = huff[temp2.pr].pr = len;
             60     temp.pr = len;
             61     temp.pow = temp1.pow + temp2.pow;
             62     huff[len] = temp;
             63     if(!greed.empty()) greed.push(temp);
             64   }
             65   return len;
             66 }
             67 
             68 void reserve(char * a){
             69   int len = strlen(a);
             70   for(int i = 0 ; i <= len/2 ;i ++)
             71     swap(a[i],a[len-i-1]);
             72 }
             73 struct code{
             74   char s;
             75   char co[50];
             76 };
             77 
             78 void coding(int len1,int len2){
             79   code* mycode = new code[len1+1];
             80   memset(mycode ,0 ,sizeof(mycode));
             81   for(int i = 0; i <= len1 ; i++){
             82     int j = i;
             83     int t = 0;
             84     mycode[i].s = huff[i].s;
             85     while(j < len2){
             86       if(huff[huff[j].pr].lc == j)
             87     mycode[i].co[t++] = '0';
             88       else mycode[i].co[t++] = '1';
             89       j = huff[j].pr ;
             90     }
             91     reserve(mycode[i].co);
             92     cout << "the code of " << mycode[i].s
             93      << " is " << mycode[i].co <<endl;
             94   }
             95   delete[] mycode;
             96 }
             97 
             98 int main(){
             99   int len1 = input();
            100   int len2 = createTree(len1);
            101   coding(len1,len2); 
            102 }
            103   
            104   
            105       
            106 

            posted on 2011-12-06 14:46 is-programmer 閱讀(407) 評論(0)  編輯 收藏 引用

            導航

            <2012年3月>
            26272829123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統計

            常用鏈接

            留言簿

            隨筆檔案

            文章分類

            文章檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            精品免费tv久久久久久久| 狠狠精品干练久久久无码中文字幕 | 无码超乳爆乳中文字幕久久| 久久精品夜色噜噜亚洲A∨| 97久久久久人妻精品专区| 久久久久久无码Av成人影院| 伊人久久精品无码二区麻豆| 日韩欧美亚洲综合久久| 久久精品国产99国产精品导航| 亚洲另类欧美综合久久图片区| 久久亚洲中文字幕精品一区四| 国产精品免费久久| 久久影视国产亚洲| 国产精品久久久久久久久软件| 久久久久久久精品成人热色戒| 中文字幕久久久久人妻| 国产成人久久精品一区二区三区| 久久久久成人精品无码中文字幕 | 伊人久久精品线影院| 亚洲国产精品人久久| 久久精品无码专区免费| 7777久久久国产精品消防器材| 久久久无码一区二区三区| 久久青草国产精品一区| 久久人人爽人人精品视频| 性做久久久久久久久浪潮| 精品无码久久久久久午夜| 国内精品免费久久影院| 久久精品中文无码资源站| 97久久超碰成人精品网站| 欧美成a人片免费看久久| 亚洲国产精品18久久久久久| 久久se精品一区精品二区| 亚洲天堂久久久| 精品久久久久久综合日本| 思思久久精品在热线热| 久久99久久99小草精品免视看| 欧美精品乱码99久久蜜桃| 人人狠狠综合久久亚洲婷婷| 久久精品国产亚洲av麻豆图片| 国产一久久香蕉国产线看观看|