#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>
using namespace std;
string cs[30];
string lzw_compress(const string&s){
int id , len = s.size(),i = 0;
string buf = "",res = "";
unordered_map<string,int> dictionary;
for(int i=0;i<26;i++){
dictionary.insert(make_pair(cs[i],i));
}
id = dictionary.size();
while(i<len){
buf += s[i];
while(dictionary.find(buf) != dictionary.end()){
if(++i==len){
res += to_string(dictionary[buf])+".";
return res;
}
buf += s[i];
}
res += to_string(dictionary[buf.substr(0,buf.size()-1)])+".";
dictionary.insert(make_pair(buf,id++));
buf.clear();
}
cout<<res<<" .... ";
return res;
}
string lzw_decompress(const string& s){
string res = "";
unordered_map<int,string> dictionary ;
for(int i=0;i<26;i++){
dictionary.insert(make_pair(i,cs[i]));
}
vector<int> vs;
int temp = 0, id = dictionary.size();
for(int i=0;i<s.size();i++){
if(s[i]=='.'){
vs.push_back(temp);
temp = 0;
}else{
temp = temp*10 + s[i]-'0';
}
}
for(int i=0;i<vs.size();i++){
int p = vs[i],q = -1;
if(i) q = vs[i-1];
// p已经在代码中
if(dictionary.find(p)!= dictionary.end()){
res += dictionary[p];
if(i) dictionary.insert(make_pair(id++, dictionary[q] + dictionary[p][0] ));
// p 不在代码中
}else{
string buf = dictionary[q]+dictionary[q][0];
res += buf;
dictionary.insert(make_pair(id++,buf));
}
}
return res;
}
int main() {
for(int i=0;i<26;i++) cs[i] = 'a'+i;
bool f = true;
srand((int(time(0))));
string s;
for(int i=0;i<1000000;i++){
s.push_back(char('a'+rand()%26));
}
string compressed = lzw_compress(s);
string decompressed = lzw_decompress(compressed);
if(s!=decompressed){
f = false;
}
cout<<s<<endl;
cout<<compressed<<endl;
if(f) {
cout<<"成功"<<endl;
cout<<"原来的大小:"<<s.size()<<endl;
cout<<"压缩之后的大小:"<<compressed.size()<<endl;
double rate = 1.0*s.size()/compressed.size();
cout<<"压缩比率为:"<<rate<<endl;
}
else cout<<"失败"<<endl;
return 0;
}
压缩文本串的LZW算法
最新推荐文章于 2023-12-23 17:42:44 发布