数据压缩(4)——字典编码

【前言】

变长编码,统计压缩编码都是基于单个字符的编码,字典编码基于数个连续字符(也叫基于单词),例如ABCABD中AB可以替换成一个新的字符,其可能会减少字符数量,得到的新数据的熵比原来的小,可以对新的数据再用统计编码

字典编码的困难之处在于如何选择最佳的单词,其会使得新数据集的熵变得更小。

出于性能上的考虑,不可能去遍历整个数据集来寻找最佳的单词,通常会去寻找最长匹配的数据,通过偏移+长度的方式记录匹配数据。

因此,字典编码适合有较多重复子串的情况

【LZ算法】

LZ算法是由Abraham Lempel和Jacob Ziv于1977年发明的算法,因此,该LZ算法也称为LZ77算法(或LZ1)。此算法是第一个使用字典压缩数据的算法,采用动态字典。1978年, 其发布了LZ78算法(也称为LZ2),使用静态字典。

原理

其将数据集分为两部分:一是搜索缓冲区,包含已经读取和处理过的符号;另一部分是先行缓冲区,包含将要编码的符号。

出于性能上的考虑,搜索缓冲区的大小一般为32kb,如果对性能没要求可以拓展到几个GB。对于特定大小的缓冲区,编码了N个字符,缓冲区要移动N位,这种就叫滑动窗口。

对先行缓冲区的字符,在搜索缓冲区中寻找匹配的字符,并记录其在搜索缓冲区的位置,将位置信息输出。

编码

以TOBEORNOTTOBE为例子,假设搜索缓冲区的长度为9

  1. 当前搜索缓冲区为空,长度为0,先行缓冲区为TOBEORNOTTOBE,从中读取一个字符T,未在搜索缓冲区找到匹配字符,输出记为<0,0,T>
  2. 当前搜索缓冲区为T,长度为1,先行缓冲区为OBEORNOTTOBE,从中读取一个字符O,未在搜索缓冲区找到匹配字符,输出记为<0,0,O>
  3. 当前搜索缓冲区为TO,长度为2,先行缓冲区为BEORNOTTOBE,从中读取一个字符B,未在搜索缓冲区找到匹配字符,输出记为<0,0,B>
  4. 当前搜索缓冲区为TOB,长度为3,先行缓冲区为EORNOTTOBE,从中读取一个字符E,未在搜索缓冲区找到匹配字符,输出记为<0,0,E>
  5. 当前搜索缓冲区为TOBE,长度为4,先行缓冲区为ORNOTTOBE,从中读取一个字符O,可以在搜索缓冲区中找到O,如何找
    • 可以从搜索缓冲区中从前往后找,也可以从后往前找,考虑到一般文本是从左往右的,所以从左往右找
    •  O位于第2个位置,所以偏移为2
    • 先行缓冲区中O后下一个字符为R,搜索缓冲区中O后下一个字符为B,不匹配,所以长度为1
    • 输出为<2,1>
  6. 当前搜索缓冲区为TOBEO,长度为5,先行缓冲区为RNOTTOBE,从中读取一个字符R,未在搜索缓冲区找到匹配字符,输出记为<0,0,R>
  7. 当前搜索缓冲区为TOBEOR,长度为6,先行缓冲区为NOTTOBE,从中读取一个字符N,未在搜索缓冲区找到匹配字符,输出记为<0,0,N>
  8. 当前搜索缓冲区为TOBEORN,长度为7,先行缓冲区为OTTOBE,从中读取一个字符O,可以在搜索缓冲区中找到O,如何找
    •  可以发现匹配的有两个O,基于性能上的考虑,找到O即可;基于压缩效率上的考虑,找到所有O,选择其中匹配最长的O
    • 先行缓存区O后下一个字符为T,两个O的均不匹配,长度为1,选择第一O即可,输出为<2,1>
  9. 当前搜索缓冲区为TOBEORNO,长度为8,先行缓冲区为TTOBE,从中读取一个字符T,可以在搜索缓冲区中找到T,输出记为<1,1>
  10. 当前搜索缓冲区为TOBEORNOT,长度为9,先行缓冲区为TOBE,从中读取一个字符T,可以在搜索缓冲区中找到T,输出记为<1,1>
  11. 当前搜索缓冲区为TOBEORNOTT,长度为10,要滑动,滑动后为OBEORNOTT,先行缓冲区为OBE,从中读取一个字符O,可以在搜索缓冲区中找到OBE,输出记为<1,3>

解码

  1. 读取第1个输出<0,0,T>,此时搜索缓冲区为空,输出T
  2. 读取第2个输出<0,0,O>,此时搜索缓冲区为T,<0,0>表示没有匹配,输出O,结合之前输出为T0
  3. 读取第3个输出<0,0,B>,此时搜索缓冲区为TO,<0,0>表示没有匹配,输出B,结合之前输出为T0B
  4. 读取第4输出<0,0,E>,此时搜索缓冲区为TOB,<0,0>表示没有匹配,输出E,结合之前输出为T0BE
  5. 读取第5输出<2,1>,此时搜索缓冲区为TOBE,<2,1>表示第2个,长度为1,输出O,结合之前输出为T0BEO
  6. 读取第6输出<0,0,R>,此时搜索缓冲区为TOBEO,<0,0>表示没有匹配,输出R,结合之前输出为T0BEOR
  7. 读取第7输出<0,0,N>,此时搜索缓冲区为TOBEOR,<0,0>表示没有匹配,输出N,结合之前输出为T0BEORN
  8. 读取第8输出<2,1>,此时搜索缓冲区为TOBEORN,<2,1>表示第2个,长度为1,输出O,结合之前输出为T0BEORNO
  9. 读取第9输出<1,1>,此时搜索缓冲区为TOBEORNO,<1,1>表示第1个,长度为1,输出T,结合之前输出为T0BEORNOT
  10. 读取第10输出<1,1>,此时搜索缓冲区为TOBEORNOT,<1,1>表示第1个,长度为1,输出T,结合之前输出为T0BEORNOTT
  11. 读取第11输出<1,3>,此时搜索缓冲区要滑动,为OBEORNOTT,<1,3>表示第1个,长度为3,输出OBE,结合之前输出为T0BEORNOTTOBE

进一步简化输出

可以将输出分为三个对应的数据集分别进行统计压缩,进一步简化输出,例如

偏移集0,0,0,0,2,0,0,2,1,1,1

长度集0,0,0,0,1,0,0,1,1,1,3

字符集T,O,B,E,R,N

(只有偏移和长度都为0,才有字符)

算法拓展

为了提升性能或压缩率,在寻找匹配和输出记录上可以做自定义,可以衍生出各种不同版本的算法

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

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

相关文章

【推导过程】常用连续分布的数学期望、方差、特征函数

文章目录 相关教程相关文献常用连续分布的数学期望&方差&特征函数正态分布标准正态分布一般正态分布的标准化数学期望方差 3 σ 3\sigma 3σ原则 均匀分布数学期望方差 指数分布无记忆性数学期望方差 伽马分布两个特例数学期望方差 贝塔分布数学期望方差 作者&#xff…

Windows git 配置

需要在git-bash的目录下,配置.ssh 的配置文件 要 .ssh 目录下的配置无法使用

【SPIE独立出版】第四届计算机、信息工程与电子材料国际学术会议 (CTIEEM 2024,2024年11月15-17日 )

第四届计算机、信息工程与电子材料国际学术会议 (CTIEEM 2024) The 4th International Conference on Computer Technology, Information Engineering and Electron Materials 会议官网&#xff1a;www.ctieem.org The 4th International Conference on Computer Technology,…

python中的global和nonlocal关键字以及闭包和模块

global i 这样的用法在于 Python 中&#xff0c;但需要在一个函数内部使用&#xff0c;以便将变量 i 声明为全局变量。让我们来详细讲解一下它的用法。 什么是全局变量&#xff1f; 全局变量是指在函数外部定义的变量&#xff0c;可以在任何函数中访问和修改。如果你需要在函数…

C#无标题栏窗体拖动

要实现C#无标题栏窗体的拖动功能&#xff0c;可以使用以下步骤&#xff1a; 在窗体的构造函数中添加以下代码&#xff0c;将窗体的边框样式设置为无标题栏和可调整大小的窗体&#xff1a; this.FormBorderStyle FormBorderStyle.Sizable; this.Text String.Empty;添加以下代…

【解决】nvidia nx板运行python程序出现Segmentation fault (core dumped)问题

问题&#xff1a;运行python程序出现Segmentation fault (core dumped)问题。 bdlfbdlf-desktop:~/2、car_detect$ python3 test_zxh.py Segmentation fault (core dumped) 解决思路&#xff1a; 在主程序最开始加入两行代码&#xff1a; import faulthandler faulthandler.…

阿里 C++面试,算法题没做出来,,,

我本人是非科班学 C 后端和嵌入式的。在我面试的过程中&#xff0c;竟然得到了阿里​ C 研发工程师的面试机会。因为&#xff0c;阿里主要是用 Java 比较多&#xff0c;C 的岗位比较少​&#xff0c;所以感觉这个机会还是挺难得的。 阿里 C 研发工程师面试考了我一道类似于快速…

Android上的AES加密

基础算法说明 https://www.youtube.com/watch?vlnKPoWZnNNM 虽然这个视频讲的非常详细&#xff0c;但是涉及到具体底层算法&#xff0c;大致流程 1. 将数据转成HEX或者byte array 2.将数据分层一块块等大小的数据 3.将数据和key 进行一次混合&#xff0c;加密之后的输出&…

嵌入式系统---看门狗

在嵌入式系统中&#xff0c;看门狗定时器&#xff08;Watchdog Timer&#xff0c;WDT&#xff09;是一种常用的机制&#xff0c;用于检测和恢复系统在异常情况下的故障。如果系统因为某种原因&#xff08;如软件死循环&#xff09;而变得无响应&#xff0c;看门狗定时器可以自动…

在三维空间中旋转向量时的,旋转方向

在三维空间中旋转向量时&#xff0c;旋转的方向由定义的旋转轴和旋转角度决定。根据数学约定&#xff0c;通常遵循右手定则来确定旋转方向。 右手定则 对任意旋转操作&#xff0c;右手定则定义了旋转的方向&#xff1a; 伸展右手&#xff0c;大拇指指向旋转轴的正方向&#…

如何使用GeoIP和ELK(Elasticsearch、Logstash和Kibana)映射用户位置

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 IP 地理定位是用于确定 IP 地址的物理位置的过程&#xff0c;可以用于各种目的&#xff0c;如内容个性化和流量分析。通过地理位置…

ClickHouse的原理及使用,

1、前言 一款MPP查询分析型数据库——ClickHouse。它是一个开源的&#xff0c;面向列的分析数据库&#xff0c;由Yandex为OLAP和大数据用例创建。ClickHouse对实时查询处理的支持使其适用于需要亚秒级分析结果的应用程序。ClickHouse的查询语言是SQL的一种方言&#xff0c;它支…

【排序】——1.冒泡排序法(含优化)

冒泡排序 1.原理 左边大于右边交换一趟排下来最大的交换到右边来(接下来所以文章用升序举例) 从左到右&#xff0c;相邻元素进行比较。 每次比较一轮&#xff0c;就会找到序列中最大的一个&#xff08;最小的一个——降序&#xff09;。这个数就会从序列的最右边冒出来。 以…

算法时间、空间复杂度(二)

目录 大O渐进表示法 一、时间复杂度量级的判断 定义&#xff1a; 例一&#xff1a;执行2*N&#xff0b;1次 例二&#xff1a;执行MN次 例三&#xff1a;执行已知次数 例四:存在最好情况和最坏情况 顺序查找 冒泡排序 二分查找 例五&#xff1a;阶乘递归 ​编辑 例…

JIT详解

文章目录 JIT为什么说 Java 语言“编译与解释并存”&#xff1f; JIT原理JVM 架构简览JIT 编译流程JIT 编译器的实现优化策略方法内联逃逸分析 JIT 在Java中&#xff0c;JIT&#xff08;Just-In-Time&#xff09;编译器是Java虚拟机&#xff08;JVM&#xff09;的一个重要组成…

韩国 NEL动物医疗中心:犬二尖瓣修复术连获成功

“守护心脏的神之手” 在小型犬心脏疾病根本治疗&#xff08;犬心脏修复手术&#xff09;方面取得重大突破&#xff0c;已成功完成 16 例手术。 韩国 NEL动物医疗中心&#xff08;NEL ANIMAL MEDICAL CENTER&#xff09;严泰欽院长带领的心脏手术团队&#xff0c;为 16 只宠物…

自定义拦截器处理token

目录 1、WebConfig 配置类 2、TSUserContext 把用户信息放到context中 3、自定义拦截器 4、在controller中可以使用 5、参考链接 1、WebConfig 配置类 @Configuration public class WebConfig implements WebMvcConfigurer {@Autowiredprivate AccessControlInterceptor …

Lumerical学习——分析工具(Analysis tools)

一、分析工具和模拟环境&#xff08;Analysis tools and the simulation environment&#xff09; 模拟计算完成后&#xff0c;模拟计算数据紧接着写到模拟工程文件中&#xff1b;甚至当模拟计算提前结束时计算得到的部分数据集也会写到文件中。当模拟完成后单击退出按钮、或者…

【行业观察】三折机不够看?苹果研发四折叠屏iPhone

随着智能手机市场的日益成熟&#xff0c;消费者对手机形态和功能的需求也在不断升级。近年来&#xff0c;折叠屏手机凭借其独特的形态和更大的显示面积&#xff0c;成为了市场的新宠。而在这场折叠屏手机的竞争中&#xff0c;苹果作为智能手机行业的领头羊&#xff0c;自然也不…

Visual Studio 2022常用快捷键

1. 基本编辑快捷键 Ctrl X&#xff1a;剪切选中内容Ctrl C&#xff1a;复制选中内容Ctrl V&#xff1a;粘贴内容Ctrl Z&#xff1a;撤销Ctrl Y&#xff1a;重做Ctrl Shift L&#xff1a;删除当前行Ctrl K, Ctrl C&#xff1a;注释选中的代码Ctrl K, Ctrl U&#xf…