哈夫曼编码简单实现

利用数组实现将字符串进行哈夫曼编码和解码

  1 #include <iostream>
  2 #include <cstring>
  3 #include <algorithm>
  4 #include <unordered_map>
  5 
  6 //input: helloworld
  7 //output: helloworld
  8 using namespace std ;
  9 
 10 const int N = 110 ;
 11 
 12 unordered_map<string,char> um ;
 13 unordered_map<char,string> us ;
 14 char table[N] ;
 15 int cnt[128] ;
 16 int idx = -1,dd ;
 17 struct node{
 18     int w,p,l,r ;
 19     char ch ;
 20 }tr[N];
 21 
 22 bool select(int &s1,int &s2){
 23     int k = 0;
 24     for(int i=0;i<=idx;i++){
 25         if(tr[i].p == -1){
 26             k ++ ;
 27         }
 28     }
 29     if(k<=1){
 30         return false ;
 31     }
 32     k = -1 ; 
 33     for(int i=0;i<=idx;i++){
 34         if(tr[i].p != -1) continue ;
 35         if(tr[i].p == -1 && k == -1 || tr[k].w>tr[i].w){
 36             k = i ;
 37         }
 38     }
 39     s1 = k ;
 40     k = -1 ;
 41     for(int i=0;i<=idx;i++){
 42         if(tr[i].p != -1 || s1 == i) continue ;
 43         if(tr[i].p == -1 && k == -1 || tr[k].w>tr[i].w){
 44             k = i ;
 45         }
 46     }
 47     s2 = k ;
 48     idx ++ ;
 49     
 50      return true ;
 51 }
 52 
 53 
 54 
 55 void huffman_tree(){
 56     for(int i=0;i<=idx;i++){
 57         int s1 = -1, s2 = -1 ;
 58         if(select(s1,s2)){
 59             tr[idx].l = s1 ;
 60             tr[idx].r = s2 ;
 61             tr[idx].p = -1 ;
 62             tr[idx].w = tr[s1].w + tr[s2].w ;
 63             tr[s1].p  = idx ;
 64             tr[s2].p = idx ;
 65         }
 66     }
 67 }
 68 
 69 void huffman_code(){
 70     for(int i=0;i<=dd;i++){
 71         string tmp ;
 72         int j = i ;
 73         while(true){
 74             int k = j ;
 75             j = tr[j].p ;
 76             if(j == -1) break ;
 77             if(k == tr[j].l){
 78                 tmp += '0' ;
 79             }else{
 80                 tmp += '1' ;
 81             }
 82         }
 83         if(tmp.size()){
 84             reverse(tmp.begin(),tmp.end()) ;
 85             us[tr[i].ch] = tmp ;
 86             um[tmp] = tr[i].ch ;
 87             tmp.clear() ;
 88         }
 89     }
 90 }
 91 
 92 string huffman_decode(string text){
 93     string tmp,res ;
 94     int ln = text.size() ;
 95     for(int i=0;i<ln;i++){
 96         tmp += text[i] ;
 97         if(um.count(tmp)){
 98             res += um[tmp];
 99             tmp.clear() ;
100         }
101     }
102     return res ;
103 }
104 
105 int main(){
106     string str ;
107     cin >> str ;
108     
109     int ln = str.size() ;
110     for(int i=0;i<ln;i++){
111         cnt[str[i]] ++ ;
112     }
113     
114     for(int i=0;i<128;i++){
115         if(cnt[i]){
116             tr[++idx] = {cnt[i],-1,-1,-1,i} ;
117         }    
118     }
119     dd = idx ;
120 
121     
122     huffman_tree() ;
123     
124 
125     
126     huffman_code() ;
127     
128     string tmp ;
129     for(int i=0;i<ln;i++){
130         tmp += us[str[i]] ;
131     }
132     
133     
134     cout << huffman_decode(tmp) << endl ;
135     
136     return 0 ;
137 } 

猜你喜欢

转载自www.cnblogs.com/gulangyuzzz/p/12107653.html
今日推荐