LZW的编码和解码

news2025/3/1 8:12:34

    不同于哈弗曼编码针对于每个元素编码,LZW主要针对字符串的编码优化,也就是把出现频率高的字符串压缩成一个字符表示,这也是大名鼎鼎的GIF采用的压缩格式。下面我将从三个角度谈谈我的一些理解,文章主要参考了这位大佬:LZW编解码详解_lzw编码-CSDN博客。

思想简述

    LZW主要针对字符串压缩。比如对于字符串ABAB,首先对于每个会出现的字符都有一个默认编码,也就是A-0,B-1,因为LZW的压缩要求解压时不需要压缩编码表,因此是要求不需要编码表重建的,所以第一个A和第二个B不能连在一起压缩,分别编码为0和1;然后因为AB出现过了,记录在字典中,即AB-2,所以后面的AB就直接编码为2,编码后的字符串为012。

    可以想象,如果直接把两个AB都变成2,那么压缩后是22,一上来就是一个2,那么无法重建字典了,因为这个2怎么来的无从得知。

如何压缩

    压缩的过程相比解压要简单,简单来说就是维护两个字符串,分别是未编码P和当前字符C,这里的P是当前最长的可编码字符串,C就是当前指向的字符,比如xyabcdef,假设此时P起点为的a,终点是d(加粗处),此时C指向的e,假设abcd+e在字典中出现了,那么P更新为P+C也就是abcde,相当于此时还可能继续往下找到更长的编进字典;如果abcd+e没有出现在字典中,那么最长的可编码字符串就是abcd,此时为这个字符串编码,并且在字典中增加一个新的编码对应abcde,同时更新P为e(更新为指针C指向的字符),继续找下面的最长可编码字符串。

    这个过程简单来说就是找最长可编码字符串,一直找到无法编码了,为字符串编码,把无法编码的加入字典

算法步骤如下:

  1. 初始状态,字典里只有所有的默认项,例如0->a,1->b,2->c。此时P和C都是空的。

  2. 读入新的字符C,与P合并形成字符串P+C。

  3. 在字典里查找P+C,如果:

    • P+C在字典里,P=P+C。

    • P+C不在字典里,将P的记号输出;在字典中为P+C建立一个记号映射;更新P=C。

  4. 返回步骤2重复,直至读完原字符串中所有字符。

    下面是对于ababcababac的编码过程,可以对照,编码后的结果是0132372

如何解码

    解码略复杂。可以想想编码的过程,编码的过程实际上就是找到P和C,然后把P编码,把P+C放入字符串,解码就反过来,将当前码值解码,并且把当前码值的解码(P)和下一个码值对应的解码的首字符(C)加入字典。

    具体实现还是维护P和C,只不过P代表当前编码对应字符串,C代表下一个位置的编码对应字符串的首字符

算法流程如下:

  1. 初始状态,字典里只有所有的默认项,例如0->a,1->b,2->c。此时pW和cW都是空的。

  2. 读入第一个的符号cW,解码输出。注意第一个cW肯定是能直接解码的,而且一定是单个字符。

  3. 赋值pW=cW。

  4. 读入下一个符号cW。

  5. 在字典里查找cW,如果: a. cW在字典里: (1) 解码cW,即输出 Str(cW)。 (2) 令P=Str(pW),C=Str(cW)的第一个字符。 (3) 在字典中为P+C添加新的记号映射。 b. cW不在字典里: (1) 令P=Str(pW),C=Str(pW)的第一个字符。 (2) 在字典中为P+C添加新的记号映射,这个新的记号一定就是cW。 (3) 输出P+C。

  6. 返回步骤3重复,直至读完所有记号。

下面是推导的过程,可以参考对照一下:

 

下面是具体的过程解析:

    在解码时,我们面对的实际上是一串数字,就像是0132372这样 ,我们一开始知道的是默认的编码规则,也是就是a-0,b-1,c-2...,假设对于编码后的字符串0132372,编码是把最长可编码字符串P+C编为新的字典元素,P实际就是这里的其中一个元素,比如0,而C就是P的后一个元素,也就是0后面的1串解码后的第一个字符(这个第一个很关键,后面的我都不管,我就要第一个,这是由编码决定的),解码过程就呼之欲出了,P指向一个元素,C是下一个元素,分两种情况讨论(建议先写一遍上面的过程,然后再看):

  1. 如果C对应的解码可以直接从字典中找到,比如P对应0,C对应1,此时0解码为a,1解码为b,P=a,C=b(1解码后的第一个字符),把P+C加入字典,也就是ab-2。

  2. 如果C对应的解码不能直接从字典中找到,就比如到了这里的37部分,p=3解码为ab,C=7,但是字典中还未出现7对应的元素,这时就要想想是什么导致了这种情况?

    先看7是怎么来的,在编码时,ca编码为6之后,P更新为a,然后找到P=ab发现ab字典中也有,所以保留,再往后此时C指向a,aba字典中没有,于是给aba编码为7,更新P为a。

    回到解码,此时37的P=3解码为ab,C对应7,7在字典中找不到,就说明编码7一定同时用到了3和7的首字符,看下图:

 

         不考虑前后的细节,用...代替,这里的P=3=ab,C+y对应的是7对应的解码字符串,目前还不知道 7的编码规则,无法解码。假如 7的编码没有用到P,那么两种情况:一种是7在P之前就编码好了,那么此时7应该在字典中,矛盾;一种是7的编码在C+y+...中编好,这与编码时寻找可编码字符串矛盾,因为还没放入字典就被用了,所以唯一可能性就是7的编码用到了前面的P,而由于7还未解码,因此对应的解码规则也还没被推导出来,而我们关心的放入字典的就是7的首字符,那么其实也就是这里P的首字符a,所以新的规则P+C(P的第一个)=aba-7加入字典,解码7。

    最后这段解析比较绕,我自己也绕来绕去感觉有点乱,有不足和错误可以直接指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1278077.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

灯光开不了了,是不是NVIDIA的问题

如果你跟我一样灯光亮度调节不了了,然后显示适配器又没有了,你看一下是不是和我这个大怨种一样把NVIDIA卸了,为了这个东西,这屏幕亮瞎我的眼镜😢😢。只需要进入官网,你就可以直接找到&#xff0…

浅析SD-WAN企业组网部署中简化网络运维的关键技术

网络已经成为现代企业不可或缺的基础设施,它为企业提供了连接全球的桥梁。随着全球化和数字化转型的加速推进,企业面临着越来越多的网络挑战和压力。传统的网络组网方式往往无法满足企业规模扩大、分支机构增多、上云服务等需求,导致网络性能…

005、简单页面-容器组件

之——布局 目录 之——布局 杂谈 正文 1.布局基础知识 2.Column 3.Row 4.实践 杂谈 布局容器组件。 一个丰富的页面需要很多组件组成,那么,我们如何才能让这些组件有条不紊地在页面上布局呢?这就需要借助容器组件来实现。 容器组件是…

深入理解Servlet(中)

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 上篇有一张图&#xff…

Istio可观测性

Istio可观测性 image-20231129072302901 前言 Istio 为网格内所有的服务通信生成详细的遥测数据。这种遥测技术提供了服务行为的可观测性,使运维人员能够排查故障、维护和优化应用程序,而不会给开发人员带来其他额外的负担。通过 Istio,运维…

(C语言)找出1-99之间的全部同构数

同构数&#xff1a;它出现在平方数的右边。例&#xff1a;5是25右边的数&#xff0c;25是625右边的数&#xff0c;即5和25均是同构数。 #include<stdio.h> int main() {for(int i 1;i < 100;i ){if((i*i % 10 i) || (i*i % 100 i))printf("%d\t%d\n",i,…

随堂复习(异常处理、多线程)

第09章&#xff1a;随堂复习&#xff08;异常处理&#xff09; 一、随堂复习 1. 异常的概述 1. 什么是异常&#xff1f; 指的是程序在执行过程中&#xff0c;出现的非正常情况&#xff0c;如果不处理最终会导致JVM的非正常停止。2. 异常的抛出机制 Java中把不同的异常用不同的…

【文献阅读】Joint Demosaicing and Denoising with Self Guidance

1. 摘要 近年来&#xff0c;一些神经网络在联合去马赛克和去噪(JDD)方面表现出了良好的效果。大多数算法首先将Bayer原始图像分解为四通道RGGB图像&#xff0c;然后将其输入神经网络。这种做法忽略了一个事实&#xff0c;即绿色通道的采样率是红色和蓝色通道的两倍。在本文中&…

【Unity入门】声音组件AudioSource简介及实现声音的近大远小

AudioSource组件 将需要播放声音的物体挂载Audio Listener组件&#xff0c;实现声音的播放 AudioSource组件属性 &#xff08;1&#xff09;AudioClip&#xff08;音频剪辑&#xff09;&#xff1a;指定播放的音频文件。 &#xff08;2&#xff09;Output&#xff08;音频输…

计算机网络扫盲(2)——网络边缘

一、概述 在计算机网络得到术语中&#xff0c;我们把与因特网相连的计算机或其他设备称为端系统&#xff08;或者主机&#xff09;&#xff0c;如下图所示&#xff0c;因为它们位于因特网的边缘&#xff0c;所以被称为端系统。因特网的端系统包括了桌面计算机&#xff…

yolov8模型 onnxruntime推理及可视化

参考:https://github.com/ultralytics/ultralytics/blob/main/examples/YOLOv8-ONNXRuntime/main.py 1、yolov8 onnxruntime推理代码 1)导出参考:https://blog.csdn.net/weixin_42357472/article/details/131412851 2)查看保存的模型onnx的输入格式等信息 登录https://n…

论文阅读——Img2LLM(cvpr2023)

arxiv&#xff1a;[2212.10846] From Images to Textual Prompts: Zero-shot VQA with Frozen Large Language Models (arxiv.org) 一、介绍 使用大语言模解决VQA任务的方法大概两种&#xff1a;multi-modal pretraining and language-mediated VQA&#xff0c;即多模态预训练…

第一类瑞利索末菲标量衍射模型的方孔衍射的空间像计算(附python计算代码)

记第一类瑞利索末菲标量衍射模型的方孔衍射的空间像计算(附python计算代码) RS type 1 衍射空间像计算傅里叶变换采样条件实际计算计算要求傅立叶变换法计算直接卷积方法计算代码傅立叶变换方法直接卷积https://zhuanlan.zhihu.com/p/624292239 Goodman, J. W. (2004). Intro…

RHCE学习笔记(RHEL8) - RH294

Chapter Ⅰ 介绍Ansible ansible ansible是一款开源自动化平台 ansible围绕一种无代理架构构建&#xff0c;在控制节点上安装ansible&#xff0c;且客户端不需要任何特殊的代理软件&#xff1b;ansible使用SSH等标准协议连接受管主机&#xff0c;并在受管主机上运行代码或命令来…

http面试题,三次握手四次挥手

在浏览器中输入网址按下回车经历了一个怎样的过程&#xff1f; 总的来说分为以下几个过程&#xff1a; 1、DNS解析&#xff1a;将域名解析为IP地址; 2、TCP连接&#xff1a;TCP三次握手; 3、发生HTTP请求; 4、服务器处理请求并返回HTTP报文; 5、浏览器解析渲染页面; 6、断开连接…

Linux shell中的函数定义、传参和调用

Linux shell中的函数定义、传参和调用&#xff1a; 函数定义语法&#xff1a; [ function ] functionName [()] { } 示例&#xff1a; #!/bin/bash# get limit if [ $# -eq 1 ] && [ $1 -gt 0 ]; thenlimit$1echo -e "\nINFO: input limit is $limit" e…

文件操作-IO

文件操作-IO 1.认识文件1.什么是文件2.文件路径 2.java中操作文件2.1 File类的用法 3.InputStream和OutputStream的用法 1.认识文件 1.什么是文件 文件是计算机系统中用来存储数据的基本单位。它是一种用于持久性存储数据的命名、有序的数据集合.计算机系统通过文件系统来组织…

使用SpringBoot和ZXing实现二维码生成与解析

一、ZXing简介 ZXing是一个开源的&#xff0c;用Java实现的多种格式的1D/2D条码图像处理库。它包含了用于解析多种格式的1D/2D条形码的工具类&#xff0c;目标是能够对QR编码&#xff0c;Data Matrix, UPC的1D条形码进行解码。在二维码编制上&#xff0c;ZXing巧妙地利用构成计…

CPU 使用率和负载Load

优质博文&#xff1a;IT-BLOG-CN 一、CPU 使用率 CPU使用率是 CPU处理非空闲任务所花费的时间百分比 。例如单核CPU 1s内非空闲态运行时间为0.8s&#xff0c;那么它的CPU使用率就是80%&#xff1b;双核CPU 1s内非空闲态运行时间分别为0.4s和0.6s&#xff0c;那么&#xff0c;…

SQL Server 数据库,使用函数查询统计信息

4.1 在查询中使用函数 在前面章节已经学习了一些简单的增、删、改、查询的T-SOL.语句&#xff0c;但是为了更方便快捷地完 成大量的任务&#xff0c;SOLServer提供了一些内部函数&#xff0c;可以和SOLServer的SELECT语句联合使用&#xff0c;也可 以与UPDATE和INSERT一起使用&…