LZW压缩算法

LZW压缩算法1 LZW 压缩适用的场景 nbsp nbsp nbsp 对于有大量重复出现的字符或者字符串 可以将重复出现的多个串用一个字符表示 并写进文件 比如可以压缩这个字符串 TOBEORNOTTOB 这个字符串中出现了大量的 TO BE OR NOT 等等字符 我们就可以将这些重复出现的字符压缩写进文件 这里只是说明算法 并没有涉及写进文件的操作 2 压缩和解压缩的原理 1 压缩 这

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:27
OB:28
BE:29
EO:30
等等。
所以,压缩的时候,只需要将出现的字符或者字符串(有在字典中出现过)的编码写进压缩文件即可,(比如,TO在字典中出现过,我们就将TO的编码写进文件,不会单独记录T和O),并将当前的字符或者字符串与下一个字符组成新的串写进字典。
(2)解压缩:用编码找到对应的字符或者字符串,然后写进解压缩文件(比如,看到编码15,就会将T写入解压缩文件)。
3.代码实现:

#include 
    
      using namespace std; #include 
     
       //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"< 
      
        > text; Compress c(100,text); //c.PrintDict(); string s = c.Encode(); // c.PrintDict(); //cout << s; cout< 
        
       
      
    

代码运行结果:





LZW压缩算法




当然了,要实现真正的压缩,就要把压缩信息写进文件。如果要将压缩和解压缩进行分离的话,还需要在解压缩的时候,完成一次字典的填充工作。
这里只是为了说明算法而已。




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223585.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午1:51
下一篇 2026年3月17日 下午1:52


相关推荐

  • Spring c3p0连接池配置以及出错原因

    Spring c3p0连接池配置以及出错原因 用的jar包com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar配置:注意:如果出错原因(1)很有可能c3p0-config.xml中的配置文件出现问题,比如我是因为把“driverClass”不小心写成了“driver”,             所以在书写c3p0-config.xml要特别小心,可能多一个空格或者格式稍有问题,都…

    2022年5月22日
    43
  • iostat 命令详解「建议收藏」

    iostat 命令详解「建议收藏」概述iostat主要用于输出磁盘IO和CPU的统计信息。iostat属于sysstat软件包。可以用yuminstallsysstat直接安装。iostat用法用法:iostat[选项][<时间间隔>][<次数>]如下图:iostat用法命令参数:-c:显示CPU使用情况-d:显示磁盘使用情况-N:显示磁盘阵列(LVM)信息-n:显示NFS使用情况-k:以KB为单位显示-m:以M为单位显示-t.

    2022年10月6日
    8
  • Java正则匹配空格_正则表达式允许空格

    Java正则匹配空格_正则表达式允许空格举个例子Booleanxx=Pattern.matches(“^[a-zA-Z0-9\\s]*$”,”801TampinesAve4Singapore520801sss1″);匹配结果是false在众多正则表达式的教程中,对于\s的解释都是匹配空格。但在java中,\s不能对他们全部进行匹配。半角空格:“”.Unicode编码为:\u0020可以通过正则表达式中的\s进行匹配全角空格:“ ”Unicode编码为:\u3000不能通过正则表达式中的\s…

    2025年11月23日
    4
  • mysql字符串和数字的互相转换

    mysql字符串和数字的互相转换1.最简单的方式就是直接在字符串后面+0,就相当于直接把字符串转为数字类型了,下面可以看一下具体的操作,可以看到通过+0操作,成功将两个字符串转化为了数字,并得到了相加后的结果。2.使用CAST()函数,使用方式为CAST(valueAStype);,下面可以看一下具体的操作例子,通过如下sql语句查看结果:SELECTCAST(‘5.45’ASSIGNED);…

    2022年5月30日
    54
  • php将excel导入mysql,PHP实现将EXCEL文件导入到MYSQL

    php将excel导入mysql,PHP实现将EXCEL文件导入到MYSQL最近因项目需求 要实现将 excel 文件通过 php 页面导入 mysql 数据库中 在网上搜了很多这方面的资料 发现都是将 excel 文件另存为 csv 文件 然后从 csv 文件导入 这里介绍一个直接将 excel 文件导入 mysql 的例子 我花了一晚上的时间测试 无论导入简繁体都不会出现乱最近因项目需求 要实现将 excel 文件通过 php 页面导入 mysql 数据库中 在网上搜了很多这方面的资料 发现都是将 excel 文件

    2026年2月15日
    2
  • 20佳应用大图片背景的优秀站点作品

    20佳应用大图片背景的优秀站点作品

    2022年1月24日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号