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

news2024/10/17 13:30:59

【前言】

变长编码,统计压缩编码都是基于单个字符的编码,字典编码基于数个连续字符(也叫基于单词),例如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.coloradmin.cn/o/2217085.html

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

相关文章

哪吒汽车的工资到底发没发?

联网圈第一预言家&#xff0c;也就是美团的王兴&#xff0c;早在新能源热钱最多的那几年就预言&#xff0c;未来中国汽车格局大概率是「3333」。 也就是3家央企、3家地方国企、3家民企和3家新势力…… 此言论一出&#xff0c;当时可以说惹急了很多车企&#xff0c;比如已经退…

Leetcode—1115. 交替打印 FooBar【中等】(多线程)

2024每日刷题&#xff08;180&#xff09; Leetcode—1115. 交替打印 FooBar C实现代码 class FooBar { private:int n;sem_t fooSem;sem_t barSem;public:FooBar(int n) {this->n n;sem_init(&fooSem, 0, 1);sem_init(&barSem, 0, 0);}~FooBar() {sem_destroy(&…

ARINC 429总线协议

一、概述 ARINC 是美国航空无线电公司英文字头的缩写&#xff0c; 该公司1977年7月21日出版了“ARINC 429规范”一书&#xff0c;429规范就是飞机电子系统之间数字式数据传输的标准格式&#xff0c;在飞机上使用429总线的电子设备均应遵守这个规范&#xff0c;这样才能保证电子…

Debug-029-el-table实现自动滚动分批请求数据

前情提要 最近做了一个小优化&#xff0c;还是关于展示大屏方面的。大屏中使用el-table展示列表数据&#xff0c;最初的方案是将数据全部返回&#xff0c;确实随着数据变多有性能问题&#xff0c;有时请求时间比较长。这里做的优化就是实现列表的滚动到距离底部一定高度时再次请…

如何处理多频段时序特征?这个Transformer变体显著提升预测效果

Transformer 模型已在时间序列预测中展现了卓越的性能。然而&#xff0c;在一些复杂场景中&#xff0c;它倾向于学习数据中的低频特征&#xff0c;而忽略了高频特征&#xff0c;表现出一种频率偏差。这种偏差阻碍了模型准确捕捉重要的高频数据特征。 本文介绍一篇来自 KDD 202…

菜鸟笔记006 截图识别文字插件 textOCR

随手可得的截图识别文字插件 textOCR&#xff0c;识别出来的文字可直接输入到illustrator的当前文档中&#xff1a; 执行条件 1、需截图软件支持&#xff0c;推荐笔记截图工具 2、截好图片直接拖入面板即可完成识别 ****后期可完成实现在illustrator选择图片对象完成文字识别。…

Docker-Harbor概述及构建

文章目录 一、Docker Harbor概述1.Harbor的特性2.Harbor的构成 二、搭建本地私有仓库三、部署 Docker-Harbor 服务四、在其他客户端上传镜像五、维护管理Harbor 一、Docker Harbor概述 Harbor 是 VMware 公司开源的企业级 Docker Registry 项目&#xff0c;其目标是帮助用户迅…

方波信号发生器(完整SCL源代码)

正弦和余弦信号发生器请参考下面文章链接: 1、博途PLC平台 PLC信号发生器(博途SCL)_博图软件波形发生器怎么用-CSDN博客文章浏览阅读1.1k次。本文介绍了如何使用博途SCL编程实现不同周期和幅值的信号发生器,包括余弦和正弦信号。通过信号发生器,可以用于验证PLC的滤波器效…

cesium模型加载

注意cesium版本&#xff1a; "three": "^0.168.0", 代码&#xff1a; <template><Layout :bg-color"black"><template #content><div id"cesiumContainers"><div id"cesiumContainer" class&q…

【C++】——二叉搜索树

目录 一、前言 二、二叉搜索树 2.1概念 2.2二叉搜索树操作 2.2.1 二叉树的查找 2.2.2 二叉搜索树的插入 2.2.3 二叉搜索树的删除 ​编辑 2.3二叉搜索树的实现 2.3.1查找 2.3.2 插入 2.3.3 删除 2.3.4 打印 2.3.5 拷贝构造和赋值重载 2.3.6 析构函数 2.4 二叉搜索…

智能去毛刺:2D视觉引导机器人如何重塑制造业未来

机器人技术已经深入到各个工业领域中&#xff0c;为制造业带来了前所未有的变革。其中&#xff0c;2D视觉引导机器人技术以其精准、高效的特点&#xff0c;在去毛刺工艺中发挥着越来越重要的作用。本文将为您介绍2D视觉引导机器人技术的基本原理及其在去毛刺工艺中的应用&#…

c++初阶数据结构速成

温馨提示&#xff1a;本篇文章只给大家介绍初阶数据结构的一些常用接口 stl的简单介绍 什么是stl? STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的 组件库&#xff0c;而且是一个包罗数据结构与算法的软件框…

Redis 哨兵模式下DB库操作审计

Redis Sentinel集群环境 主机版本模式NodeSentinelredis-sentinel-node-06.2.12哨兵MasterYesredis-sentinel-node-16.2.12哨兵SlaveYesredis-sentinel-node-26.2.12哨兵SlaveYes 架构设计 命令行&程序验证 1、在redis-sentinel-node-1上使用redis-cli 连接redis-sentine…

2024台州赛CTFwp

备注&#xff1a; 解题过程中&#xff0c;关键步骤不可省略&#xff0c;不可含糊其辞、一笔带过。解题过程中如是自己编写的脚本&#xff0c;不可省略&#xff0c;不可截图&#xff08;代码字体可以调小&#xff1b;而如果代码太长&#xff0c;则贴关键代码函数&#xff09;。…

开放式蓝牙耳机哪个品牌好用?开放式耳机排行榜测评!

开放式耳机&#xff0c;因其特殊的不入耳佩戴模式&#xff0c;让使用者在享受音乐或者进行通话的过程中&#xff0c;依然可以对外界声音保持敏感。在户外运动场景下&#xff0c;这种特性优势尽显&#xff0c;既保证了耳机佩戴的稳定和舒适&#xff0c;又提高了运动的安全性。为…

Netty结构

Netty结构 引导器Bootstrap举例&#xff1a;一个简单的HTTP服务器服务端启动类服务端业务逻辑处理类 二级目录Channel初始化&#xff08;设置Channel类型&#xff09;注册ChannelHandler结合HTTP请求-响应&#xff0c;分析数据在ChannelPipeline中的流向 设置Channel参数端口绑…

java互联网医院智能导诊系统源码,Uniapp前端开发框架,支持一次编写,多端运行

智慧导诊系统源码&#xff0c;java源码&#xff0c;大屏机自动导诊&#xff0c;互联网医院智能导诊系统源码 老是全身无力&#xff0c;挂什么科&#xff1f; 经常头痛&#xff0c;挂什么科&#xff1f; 总是失眠&#xff0c;又得挂哪个科&#xff1f; 世界上最遥远的距离再加…

初识git · 多人协作

目录 前言&#xff1a; 多人协作一 多人协作二 前言&#xff1a; git从发布以来&#xff0c;强大的功能有版本回退以及分支管理&#xff0c;那么分支管理用来不仅是为了维护master的&#xff0c;更多的是多人协作的一种代表&#xff0c;所以多人协作这一章节&#xff0c;基…

2010年国赛高教杯数学建模C题输油管的布置解题全过程文档及程序

2010年国赛高教杯数学建模 C题 输油管的布置 某油田计划在铁路线一侧建造两家炼油厂&#xff0c;同时在铁路线上增建一个车站&#xff0c;用来运送成品油。由于这种模式具有一定的普遍性&#xff0c;油田设计院希望建立管线建设费用最省的一般数学模型与方法。   1. 针对两炼…