国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

LZW壓縮算法

2019-11-06 06:08:21
字體:
來源:轉載
供稿:網友
1.LZW壓縮適用的場景:     對于有大量重復出現的字符或者字符串,可以將重復出現的多個串用一個字符表示,并寫進文件。比如可以壓縮這個字符串:“TOBEORNOTTOBEORTOBEORNOT”,這個字符串中出現了大量的TO,BE,OR,NOT等等字符,我們就可以將這些重復出現的字符壓縮寫進文件。這里只是說明算法,并沒有涉及寫進文件的操作。2.壓縮和解壓縮的原理:(1)壓縮:這里定義一個字典,字典里存放字符或者字符串的編碼。一開始字典被初始化為:A:1 B:2 C:3 D:4 ..... Y:25 Z:26之后,出現字母T,我們就將20(ASCII中20對應的字符)寫進壓縮文件,然后將TO寫進字典并編號27.下一個讀到字符O,將15寫進壓縮文件,OB寫進字典等等。所以,字典就會被擴充。TO:27OB:28BE:29EO:30等等。所以,壓縮的時候,只需要將出現的字符或者字符串(有在字典中出現過)的編碼寫進壓縮文件即可,(比如,TO在字典中出現過,我們就將TO的編碼寫進文件,不會單獨記錄T和O),并將當前的字符或者字符串與下一個字符組成新的串寫進字典。(2)解壓縮:用編碼找到對應的字符或者字符串,然后寫進解壓縮文件(比如,看到編碼15,就會將T寫入解壓縮文件)。3.代碼實現:
#include<iostream>using namespace std;#include<string>//LZW壓縮和解壓縮typedef struct Dict{       string _s;       int _code;}Dict;class ComPRess{public:       Compress(int maxSize,string text)       {              _maxSize = maxSize;              _code = new int[maxSize];              _size = 0;              _text = text;              _dict = new Dict[_maxSize];              _dictSize = 0;              //過濾0號位置              Insert("#");              //向字典中插入26個字母              string s = "A";              for (int i = 0; i < 26; ++i)              {                     Insert(s);                     s[0]++;              }       }       ~Compress()       {              delete[] _code;              delete[] _dict;              _code = NULL;              _dict = NULL;              _maxSize = 0;              _size = 0;       }       string Encode()       {              string s;//存儲壓縮后的字符串              string cur;              char next;              int i = 0;              while (i < _text.size())              {                     cur.insert(cur.size(),1, _text[i]);                     i++;                     next = _text[i];                     while (FindCode(cur) != -1)//當前串在字典中                     {                                 cur.insert(cur.size(), 1, next);                           ++i;                           if (i != _text.size())                                  next = _text[i];                           else                                  break;                     }                     if (i != _text.size())                     {                           char c = cur.at(cur.size() - 1);                           cur.erase(cur.end()-1);                           _code[_size] = FindCode(cur);                           ++_size;                           cur += c;                           c =  _code[_size-1];                           s.push_back(c);                           Insert(cur);                     }                                  if(i == _text.size() && FindCode(cur) != -1)                     {                           _code[_size] = FindCode(cur);                           s.push_back(_code[_size]);                           break;                     }                                  --i;                     cur.clear();              }              return s;       }       string Decode(const string& s)       {              string text;              string cur;              if (s.size() <= 0)                     return s;              int code;              for (int i = 0; i < s.size(); ++i)              {                     code = (int)(s[i]);                     cur = FindSeq(code);                     text += cur;              }              return text;       }       void PrintDict()       {              cout<<"seq  code"<<endl;              for (int i = 0; i < _dictSize; ++i)              {                     cout << _dict[i]._s << "     " << _dict[i]._code<<endl;              }       }protected:       int FindCode(const string& s)       {              for (int i = 0; i < _dictSize; ++i)              {                     if (s == _dict[i]._s)                           return i;              }              return -1;       }       string FindSeq(int code)       {              return _dict[code]._s;       }       void Insert(string seq)       {              _dict[_dictSize]._s = seq;              _dict[_dictSize]._code = _dictSize;              _dictSize++;       }private:       Dict* _dict;       int _dictSize;       int* _code;       int _size;       int _maxSize;       string _text;};int main(){       string text;       cin >> text;       Compress c(100,text);       //c.PrintDict();       string s = c.Encode();     //  c.PrintDict();       //cout << s;       cout<<c.Decode(s)<<endl;       system("pause");       return 0;}代碼運行結果:當然了,要實現真正的壓縮,就要把壓縮信息寫進文件。如果要將壓縮和解壓縮進行分離的話,還需要在解壓縮的時候,完成一次字典的填充工作。這里只是為了說明算法而已。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 西宁市| 武汉市| 苍梧县| 通江县| 兰州市| 博客| 齐齐哈尔市| 屏东县| 朔州市| 恩施市| 桦甸市| 天等县| 宜兰市| 怀仁县| 库尔勒市| 鄂托克前旗| 六安市| 和平区| 临夏县| 龙川县| 武宣县| 武定县| 麻城市| 宁波市| 察雅县| 绍兴县| 林周县| 孙吴县| 新源县| 泊头市| 武宁县| 思茅市| 喀喇沁旗| 福州市| 惠安县| 龙井市| 娄底市| 江华| 田阳县| 方山县| 姚安县|