• <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

            統計

            常用鏈接

            留言簿

            隨筆檔案

            文章分類

            文章檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久久久国产精品麻豆AR影院 | 精品久久人人爽天天玩人人妻| 久久99精品国产自在现线小黄鸭| 精品久久久久久亚洲| 欧美性大战久久久久久| 人妻无码久久一区二区三区免费| 伊人久久免费视频| 国内精品伊人久久久影院| 99久久超碰中文字幕伊人| 欧美精品九九99久久在观看| 97久久国产亚洲精品超碰热| 久久综合成人网| 国产精品久久影院| 亚洲香蕉网久久综合影视| 国产福利电影一区二区三区,免费久久久久久久精 | 国产成人久久激情91| 久久免费视频一区| 久久精品国产69国产精品亚洲| 99久久香蕉国产线看观香| 99久久99久久精品国产| 2021久久精品国产99国产精品| 香蕉久久影院| 久久久国产精华液| 久久综合综合久久狠狠狠97色88| 久久这里的只有是精品23| 国产成人无码精品久久久久免费 | 久久被窝电影亚洲爽爽爽| 亚洲AV无码久久| 一本久久a久久精品vr综合| 色综合久久天天综线观看| 蜜桃麻豆www久久| 国产精品福利一区二区久久| 久久久久AV综合网成人| 丁香色欲久久久久久综合网| 狠狠综合久久综合88亚洲| 久久这里只有精品视频99| 久久久久人妻一区精品| 久久久久亚洲av成人无码电影| 久久99精品久久久久久水蜜桃| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 久久99热这里只有精品国产|