LZW编码解码cpp实现

数据压缩学习实验(四)LZW压缩算法的C++实现及其效率分析 实验目的: 掌握词典编码的基本原理,阅读C语言实现的LZW算法并用C++按自己理解实现LZW解码器并分析编解码算法,以及LZW算法对不同文件的压缩效果。 LZW算法原理: 关于更具体的图解LZW编解码可以参考:超级简单的数据压缩算法—LZW算法 编码部分: 简单地讲,LZW的编码就是不断将目前字符‘c’与上一个字符串P串成一个新串,并与词典中已有串进行不断比对,若新串P+‘c’在词典中,则将P+... 阅读详情

编码过程:

  • 1:将词典初始化为包含所有可能的单字符,当前前缀P初始化为空。
  • 2:当前字符 C=字符流中的下一个字符。
  • 3:判断 P+C 是否在词典中
    (1) 如果“是”,则用C扩展P,即让P=P+C,返回步骤2
    (2) 如果“否”,则:
    输出与当前前缀P相对应的码字W;
    将P+C添加到词典中;
    令P=C,并返回步骤2

实际上就是从字典中匹配最长的串,输出其码字
然后该串加上下一个字符必定是不在字典中的,再将其加入字典即可
注意最后处理尾部

#include<iostream>
#include<string>
#include<map>
using namespace std;

int main(){
    string s;
    cin>>s;
    int index = 256;
    map<string, int> m;
    string ts;
    for(int i=0; i<256; i++){
        char c[2] = {i, '\0'};
        m[c] = i;
    }

    string p;
    string c;
    for(int i=0; i<s.size(); i++){
        c = s[i];
        ts = p+c;
        if(m.find(ts) != m.end()){
            //在词典中: 更新前缀
            p = ts;
        }else{
            //不在词典中: 添加至字典,并输出前缀词典值
            int w =  m[p];
            cout<<w<<" ";
            m.insert(pair<string, int>(ts, index++));
            p = c;
        }
    }
    //尾处理
    int w =  m[p];
    cout<<w<<" ";
    cout<<endl<<endl;

    //打印字典
    map<string, int>::iterator it = m.begin();
    for(; it != m.end(); it++){
        if(it->second > 255)
            cout<<it->first<<"\t"<<it->second<<endl;
    }
    return 0;
}

解码:

当 当前码字cw不在词典中时,唯一可能的情况是:下一个需要添加到词典中的串 就是cw所代表的串

#include<iostream>
#include<string>
#include<map>
using namespace std;

int main(){
    int index = 256;
    map<int, string> m;
    string ts;
    for(int i=0; i<256; i++){
        char c[2] = {i, '\0'};
        m[i] = string(c);
    }
    int i=1;
    string p;
    string c;
    int pw = -1; //前一码字
    int cw = -1; //当前码字
    cin>>pw;
    cout<<m[pw];
    while(cin>>cw){
        if(m.find(cw) != m.end()){
            //cw在词典中,直接输出
            p = m[cw];
        }else{
            //cw不在词典中
            p = m[pw];
            p = p+c;
        }
        cout<<p;
        c = p.substr(0, 1);
        m[index++] = m[pw]+c;
        pw = cw;
        i++;
        //if(i == 5) break;
    }
    cout<<endl;
    //打印字典
    map<int, string>::iterator it = m.begin();
    for(; it != m.end(); it++){
        if(it->first > 255)
            cout<<it->first<<"\t"<<it->second<<endl;
    }
    return 0;
}
数据压缩作业:LZW词典编码 LZW词典编码举例;借助VS2019软件,用C++语言编程实现LZW解码器并分析编解码算法。 阅读详情

相关推荐

LZW编解码算法的实现

一、实验目的 掌握词典编码的基本原理,用C/C++等语言编程实现LZW解码器并分析编解码算法 二、实验内容 1.LZW编码原理和实现算法 LZW的编码思想是不断地从字符流中提取新的字符串,通俗地理解为新“词条”,然后用“代号”也就是码字表示这个“词条”。这样一来,对字符流的编码就变成了用码字去替换字符流,生成码字流,从而达到压缩数据的目的。 LZW编码是围绕称为词典的转换表来完成的。LZW编码器通过管理这个词典完成输入与输出之间的转换。LZW编码器的输 入是字符流,字符流可以是用8位ASCII字符组成的字符

weixin_45715387的博客 640

LZW编码解码 C++

LZW编码解码 C++ arduino esp

neo_Wordsworth的博客 1587

【数据压缩】实验三——LZW 编解码算法实现与分析

LZW编解码算法实现与分析

weixin_49587657的博客 305

LZW解码的原理及cpp实现

原理 LZW的思想通过一系列编号来代替短语,再次遇到此短语是用编号来替代,以此来达到压缩的目的。由于词典的构建过程固定故不需要传词典,解决了码表传输的问题。解码时在解码端重建词典即可进行解码。 编码 LZW编码算法的步骤如下: 步骤1:将词典初始化为包含所有可能的单字符,当前前缀P初始化为空。 步骤2:当前字符C=字符流中的下一个字符。 步骤3:判断P+C是否在词典中 (1)如果“是”,则用C扩展...

m0_46340275的博客 531

深入理解与实践:LZW编码原理与C语言实现

本文还有配套的精品资源,点击获取 简介:LZW编码(Lempel-Ziv-Welch编码)是一种无损压缩算法,广泛应用于图像压缩和文本压缩中。本文全面分析了LZW编码的基本原理,包括编码过程、字典更新机制以及解码过程,并对提供C语言源代码文件“lzw.c”进行了详细解读。介绍了如何通过压缩和解压缩函数 lzw_compress() 和 lzw_deco...

weixin_33363025的博客 1572

LZW压缩及解码算法深入解析

LZW(Lempel-Ziv-Welch)压缩算法是由Abraham Lempel、Jacob Ziv和Terry Welch在1984年共同提出的。LZW算法是一种无损数据压缩算法,它广泛应用于多种文件格式中,如GIF和TIFF图像文件。其工作原理是利用输入数据中的重复字符串模式,将这些模式映射到简短的代码表示中,从而达到压缩数据的目的。LZW算法之所以受到青睐,主要因为它具有以下几个特点:高效性:LZW能够提供较高的压缩率,尤其在处理具有大量重复字符串的文本数据时。简单性。

weixin_32999557的博客 696

LZW压缩(解压缩)算法详解及源码

转自http://blog.chinaunix.net/uid-23741326-id-3124208.html LZW压缩算法是Lempel-Ziv-Welch 3个人共同发明的,简称 LZW 的压缩算法,可以用任何一种语言来实现它. LZW是GIF图片文件的压缩算法,而且zip压缩的思想也是基于LZW实现的,所以LZW对文本文件具有很好的压缩性能。 LZW压缩算法的基

初学者的专栏 3638

薄膜比拟、开口截面扭转承载力以及风电混塔水平缝张开状态下抗扭承载力推导

风电混塔水平缝张开状态下的抗扭承载力推导,从弹性力学说起

George的博客 872

LZW压缩算法——简明原理与实现

LZW和哈夫曼编码一样,是无损压缩中的一种。该算法通过建立字典,实现字符重用与编码,适用于source中重复率很高的文本压缩。本文首先讲下LZW的编解码原理,然后给出LZW的实现code。 *********************原理********************* 编码: 编码0-255用来存储Ascii码为[0,255]的字符,放在字典里。编码从256开始,将

Rachel Zhang的专栏 5万+

Frida+Objection保姆级教程:从环境搭建到实战Hook(含Wallbreaker插件使用)

本文提供了一份从零开始的Frida与Objection移动安全动态分析实战指南。详细讲解了Python环境配置、Frida-Server部署、Objection核心命令使用以及Wallbreaker插件安装与应用。通过实战案例演示如何Hook网络请求(如HttpURLConnection和OkHttp3),帮助安全研究人员快速掌握应用运行时行为分析与漏洞挖掘技能。

weixin_28318011的博客 99

SAP MTO模式实战:从库存管理到成本核算的深度解析

本文深入解析SAP MTO(Make-to-Order)模式在制造业中的应用,从库存管理到成本核算的全流程实战技巧。通过对比MTS模式,详细阐述MTO的核心逻辑、库存管理配置、成本核算路径及与PP模块的集成要点,帮助企业实现按单生产的高效管理,优化库存水平和资金占用。

weixin_29204205的博客 709

LZW编解码c++实现

参考:(22条消息) LZW编解码详解_hanzhen7541的博客-优快云博客_lzw编码 一.理论 二.编码算法 三.解码过程 四.代码实现(c++) 一.理论 把出现过的字符串映射到记号上,这样就可能用较短的编码来表示长的字符串,实现压缩。 给定一个初始字典,编码时生成补充后的字典,但不会保留,解码时再还原出编码时的字典。 二.编码算法 编码器从原字符串不断地读入新的字符,并试图将单个字符或字符串编码为记号 (Symbol)。这里我们维护两个变量,一个是P(Previous),表.

ManiacLook的博客 1031

实战指南:R语言多组倾向评分逆概率加权(IPTW)建模与结果解读

本文详细介绍了如何使用R语言实现多组倾向评分逆概率加权(IPTW)建模,包括数据预处理、倾向评分估计、权重计算及结果解读。通过实战案例演示,帮助研究者掌握这一统计方法,有效平衡多组混杂因素,模拟随机对照试验效果,适用于医学、社会科学等领域的数据分析。

weixin_42528534的博客 392

LZW编解码算法的基本原理及其C++实现

LZW编解码算法的基本原理及其C++实现 LZW编码(LZW Encoding)又称“串表压缩算法”,由J.Ziv和A.Lempel在1978年首次介绍,并由Terry A.Welch在1984年予以改进,最终该编码方法由三人的名字命名。 该编码方法属于词典压缩编码方法。词典编码是一种通用编码方法,适用于无法观察新源统计特性,或虽然可观察但统计特性不固定的情形。 LZW编码可应用于通用文件压缩(如...

szzheng的博客 4834

Linux中断子系统(二)—— 通用框架处理

1、数据结构分析 (1)中断描述符结构structirq_desc: 1)打开CONFIG_SPARSE_IRQ宏(中断编号不连续),中断描述符以radix- tree来组织,用户在初始化时进行动态分配,然后再插入radix-tree中; 2)关闭CONFIG_SPARSE_IRQ宏(中断编号连续),中断描述符以数组的 形式组织,并且已经分配好; 3)不管哪种形式,最终都可以通过linuxirq号来找到对应的中断描述符; (2)stru...

weixin_38428439的博客 4870

Nginx配置Cookie安全属性:HttpOnly、Secure、SameSite实战指南

Cookie是Web应用中维持用户状态的核心机制,其安全配置直接关系到会话管理与身份认证的可靠性。从原理上讲,HttpOnly属性可防止XSS攻击窃取Cookie,Secure属性确保Cookie仅在HTTPS加密连接中传输,而SameSite属性则用于控制跨站请求时Cookie的发送行为,能有效防御CSRF攻击。这些安全属性的技术价值在于构建纵深防御体系,提升应用的整体安全性。在现代浏览器(如Chrome 80+)默认将未明确声明的Cookie视为SameSite=Lax的背景下,正确配置这些属性变得尤为

weixin_33783283的博客 319

图像lzw编码matlab,matlab实现lzw编码

LZW(Lempel-Ziv & Welch)编码又称字串表编码,属 于一种无损编码,LZW编码与行程编码类似,也是对字符串 进行编码从而实现压缩,但它在编码的同时还生成了特定 字符......利用c++实现对简单字符串的lzw编码与解码,直接复制粘贴到即可使用 VIP专享...1. 图像的 LZW 编码研究 要求:实现灰度图像的 LZW 编码和解码恢复图像...LZW 编码算法详解 LZ...

weixin_34794738的博客 2078

【论文复现】——基于LM优化的NDT点云配准算法

传统的正态分布变换配准算法处理初始位姿变换相差较大的两帧点云时,存在无法收敛或者陷入局部最小值的问题。为了提高算法的收敛性能,提出了一种基于LM方法改进的三维正态分布变换配准算法。

点云侠的博客 1163

lzw编码过程详解_【手打】LZW编码的C/C++实现

LZW编码通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩。 LZW压缩算法是Unisys的专利,有效期到2003年,所以相关算法大多也已过期。本代码只完毕了LZW的编码与解码算法功能,相对网上找到的非常多代码而言较为简(cai)单(bi)。了解struct && 会递归就可以,算是长处吧。#include #include #include #include #in...

weixin_39992072的博客 552

YOLOv8改进,YOLOv8主干网络替换为ShuffleNetV2

ShuffleNet V2的设计原则:1.减少内存访问成本:通过优化数据传输路径,减少内存访问延迟,提高整体运算速度。2.考虑平台特性:针对不同硬件平台的特性进行优化设计,确保在目标平台上的高效运行。3.结构简洁高效:采用简洁而高效的模块设计,降低计算复杂度,同时保持或提升模型的预测准确性。下图,以四种不同计算复杂度水平下的准确性(在ImageNet验证集上的分类),速度和FLOPs的测量结果。(a, c) 为GPU结果,批量大小为8。(b, d) 为ARM结果,批量大小为1。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1564

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

实验三 LZW 编解码算法实现与分析

一、实验原理 1、LZW编码原理 2、LZW解码原理 在开始译码时词典包含所有可能的前缀根; 令CW=码字流中的第一个码字; 输出当前缀-符串string.CW到码字流; 先前码字PW=当前码字CW; 当前码字CW=码字流的下一个码字; 判断当前缀-符串string.CW 是否在词典中; (1)是——把当前缀-符串string.CW输出到字符流: 当前前缀P=先前缀-符串string.PW; 当前字符C=当前前缀-符串string.CW的第一个字符; 把缀-符串P+C添加到词典; (2)否——当前前缀P=

weixin_45381219的博客 368

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

数据压缩实验三:LZW编解码算法实现与分析

一、实验内容 1.LZW编码原理和实现算法 LZW的编码思想是不断地从字符流中提取新的字符串,通俗地理解为新“词条”,然后用“代号”也就是码字表示这个“词条”。这样一来,对字符流的编码就变成了用码字去替换字符流,生成码字流,从而达到压缩数据的目的。LZW编码是围绕称为词典的转换表来完成的。LZW编码器通过管理这个词典完成输入与输出之间的转换。LZW编码器的输入是字符流,字符流可以是用8位ASCII...

m0_46338411的博客 436

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

[数据压缩作业5]LZW编解码

LZW编解码

m0_59620643的博客 864

LZW压缩算法原理解析与实现【转载】

LZW算法原理--Wikipedia相关介绍 一个简单的例子 ZW编码 (Encoding) 的核心思想其实比较简单,就是把出现过的字符串映射到记号上,这样就可能用较短的编码来表示长的字符串,实现压缩,例如对于字符串: ABABAB 可以看到子串AB在后面重复出现了,这样我们可以用一个特殊记号表示AB,例如数字2,这样原来的字符串就可以表示为: AB22 这里我们称2是字串AB的记号(Sy...

Jensen Lee的博客 1897

[信息论]LZW编解码的实现(基于C++&Matlab实现)

HEU信息论程序设计作业之信息论

李田所的博客 1634
上一篇: pintos (6) --运算符优先级
下一篇: PCA算法cpp实现
windroid
博客等级 码龄12年 28粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值