利用数组实现将字符串进行哈夫曼编码和解码
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 }