zoukankan      html  css  js  c++  java
  • 哈夫曼编码简单实现

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

      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 } 
  • 相关阅读:
    基于FPGA的均值滤波算法实现
    QuartusII 13.0 PLL IP Core调用及仿真
    varnish-4.x VCL之grace mode
    varnish-4.x VCL之cookie及缓存时间
    varnish-4.x VCL之强制cache miss
    Mariadb-Galera10二进制包安装
    MariaDB Replication
    MariaDB 使用CONNECT存储引擎
    MariaDB 使用TokuDB存储引擎
    Ubuntu启用VNC服务的配置
  • 原文地址:https://www.cnblogs.com/gulangyuzzz/p/12107653.html
Copyright © 2011-2022 走看看