• <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 閱讀(401) 評論(0)  編輯 收藏 引用

            導航

            <2011年12月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統計

            常用鏈接

            留言簿

            隨筆檔案

            文章分類

            文章檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲精品视频久久久| 伊人久久大香线蕉AV一区二区 | 中文字幕久久亚洲一区| 亚洲人成无码www久久久| 亚洲va中文字幕无码久久| 久久香蕉超碰97国产精品| 久久99精品久久久久久| 香蕉久久永久视频| 99久久中文字幕| 色综合久久久久久久久五月| 久久精品国产99久久久| 久久综合视频网站| 久久精品国产亚洲一区二区| 久久精品中文字幕第23页| 精品免费tv久久久久久久| 一级a性色生活片久久无少妇一级婬片免费放| 香蕉久久av一区二区三区| 久久综合成人网| 精品午夜久久福利大片| 色偷偷久久一区二区三区| 久久久精品久久久久特色影视| 久久夜色精品国产网站| 欧美激情一区二区久久久| 久久66热人妻偷产精品9| 亚洲精品国产综合久久一线| 美女写真久久影院| jizzjizz国产精品久久| 7777久久久国产精品消防器材 | 久久精品国产亚洲7777| 国产三级久久久精品麻豆三级| 四虎久久影院| 亚洲午夜久久久| 色8激情欧美成人久久综合电| 久久青青草原国产精品免费| 久久精品国产亚洲av影院| 无码超乳爆乳中文字幕久久| 久久天天躁狠狠躁夜夜avapp| 狠狠色婷婷久久综合频道日韩| 午夜福利91久久福利| 久久精品人人做人人爽电影 | 午夜精品久久久久成人|