数据压缩(5)——上下文转换编码

统计压缩编码基于单个字符,字典编码基于单词;上下文变换基于具有联系的上下文,例如:

RLE编码针对重复字符:AAAABCCC可以记为[A,4]B[C,3]

增量编码针对数值型数据:通过一些运算以减少数值的变化范围,进而可以用更少的二进制位表示,例如:

  • [1,3,6,8,10]用第二个数减去第一个数可以得到[1,2,3,2,2]
  • [129,130,120,140,121]选择120为基数可以得到[9,10,0,20,1]

【MTF编码】

MTF(Move-To-Front Transfrom)编码,利用数据的空间局部性,也就是最近出现过的字符很可能在接下来的文本附近再次出现。

 对于许多连续的、相同的字符,将被替换为多个0;最近使用过的字符,会被小的index替换;最近很久没有使用过的字符,会被较大的index替换。

编码后文本就可以使用一串数字表示,随后可以再用RLE编码或增量编码

 如果ASCII表中各类字符大部分都在数据集中出现过,那么MTF编码的效果一般。

 MTF的关键在于用小的Index代替字符,移动字符有多种方式:

  • 出现了就移动到开头
  • 出现N次再移动到开头
  • 出现了往前移动N个位置

具体的移动方式可以结合数据集的特征来选择

【BWT编码】

BWT(Burrows Wheeler Transform)编码提供了一种全新的编码思路,其通过打乱字符顺序使得重复的字串聚集在一起,为后续的压缩提供更好的数据流。

可以将BWT的输出作为MTF的输入,再用统计编码

编码

  1. 依次将长度为N的字符串右移一位N次,得到N个不同的长度为N的字符串,以BANANA为例
  2. 将N个字符串排序
  3. 取最后一个字符由上而下组成的字符串为 NNBAAA,原字符串的索引为3(索引从0开始),编码输出为3 NNBAAA

  ///    BANANA   ABANAN
  ///    ABANAN   ANABAN
  ///    NABANA   ANANAB
  ///    ANABAN   BANANA
  ///    NANABA   NABANA
  ///    ANANAB   NANABA

解码

  1. 不断的由上而下,从前往后插入输出并排序
  2. 取索引为3的字符串 为BANANA

    /// N   A   NA  AB   NAB    ABA     NABA    ABAN    NABAN    ABANA    NABANA    ABANAN      
    /// N   A   NA  AN   NAN    ANA     NANA    ANAB    NANAB    ANABA    NANABA    ANABAN
    /// B   A   BA  AN   BAN    ANA     BANA    ANAN    BANAN    ANANA    BANANA    ANANAB
    /// A   B   AB  BA   ABA    BAN     ABAN    BANA    ABANA    BANAN    ABANAN    BANANA
    /// A   N   AN  NA   ANA    NAB     ANAB    NABA    ANABA    NABAN    ANABAN    NABANA
    /// A   N   AN  NA   ANA    NAN     ANAN    NANA    ANANA    NANAB    ANANAB    NANABA

注意,BWT需要N*N的空间,所以编码的数据集不能过大,对于大的数据集需要分块处理

【PPM编码】

马尔科夫链

上文的上下文编码的上下文关系都是必然的,而PPM(Prediction by Partial Matching,部分预测匹配)编码是基于马尔科夫链的概率联系,具有预测性质的编码。

在变长编码中,根据字符出现的概率分配码字,字符多但概率分布不均,会导致较长的码字;在自适应变长编码中,动态计算概率,动态分配码字,使得长码字出现的更少

基于马尔科夫链来算概率,字符的概率变得更高,使得长码字出现的更少。例如:

在ABACAB中,读取到ABACA时,在其他情况下,下一个出现B时在表中对应的概率0.2(这可以视为0阶马尔可夫链);在1阶马尔可夫链下,下一个出现B时在表中的概率为0.5

更通俗的例子为:英文小写字母有26个,这是全部的状态值

情况A:在0阶马尔可夫链下,就是什么都不告诉你,给1张纸条,让你猜纸条上写的哪个字母,那么任何一个都可能,你只有1/26的概率猜对

情况B:在1阶马尔可夫链下,给你的第1张纸条上写的l,让你猜第2张纸条上写的是哪个字母,你可能仍然没头绪,你仍只有1/26的概率猜对

情况C:在4阶马尔可夫链下,依次给了你4张纸条,分别写着hell,让你猜第5张纸条上写的是哪个字母,你可能会猜o,你猜对的概率>1/26

情况D:在4阶马尔可夫链下,依次给你发了6张纸条,分别写着hellol,但你手里只能有4张纸条,he要去掉,剩下的是llol,让你猜第7张纸条上写的是哪个字母,那么你猜o的概率比情况B要大

也即在有上文的情况下,我们猜对下文的概率变大。反应在编码上,就是有上文时,下文出现时对应的概率变大,分配的码字变短。

这里N阶马尔可夫链就是N阶上下文,每多一阶,多取一个字符。对每个字符,都需要建立N个表,为了提高性能,通常要采用树结构。

编码

假设二阶上下文,对ABACAB编码:

  1. 读取A,没有表,输出A,0阶表记录[A,1],A的码字为0
  2. 读取B,表中没有B,输出B;0阶表记录[A,1],[B,1],AB各出现依次1次,A和B的码字分别为0、1;A的1阶表记录[B,1],B的码字为0,结合之前的输出为A B
  3. 读取A,0阶表中有A,输出0;0阶表记录[A,2],[B,1],概率A>B,A和B的码字分别为0、1;B的1阶表记录[A,1],码字为1;A的2阶表记录为[BA,1];,结合之前的输出为A B 0
  4. 读取C,0阶表中没有C,输出C;0阶表记录[A,2],[B,1],[C,1],概率A>B=C,码字分别为0,10,11;A的1阶表记录[B,1],[C,1],BC的码字分别为0、1;A的2阶表记录为[AC,1];A结合之前的输出为A B 0 C
  5. 读取A,0阶表中有A,C的1阶表没有A,A的二阶表没有CA,输出0;0阶表记录[A,3],[B,1],[C,1];C的1阶表记录[A,1];A的2阶表记录为[BA,1],[CA,1];A B 0 C 0
  6. 读取B,0阶表中有B,A的1阶段表有B,C的2阶表没有AB,取A的1阶表,输出0;A B 0 C 0 0

解码

  1. 读取A,输出A,0阶表记录[A,1],码字为0
  2. 读取B,输出B,0阶表记录[A,1][B,1],码字分别为0,A的1阶表为[B,1]
  3. 读取0,0阶表码字为0对应A,输出A;0阶表记录[A,2][B,1];B的1阶表为[A,1];A的2阶表为[BA,1]
  4. 读取C,输出C,0阶表记录[A,2][B,1][C,1];A的1阶表为[B,1][C,1];B的2阶表为[AC,1]
  5. 读取0,A没有2阶表为C?,C没有1阶表,取0阶表,为A,输出A;0阶表记录[A,3][B,1][C,1];C的1阶表为[A,1];A的2阶表为[BA,1],[CA,1]
  6. 读取0,C没有2阶表,A有1阶段表,且有码字0,对应B,输出B

综合输出为ABACAB

综合考虑,性能、内存、压缩率,一般将N的值设置为5或6

【PAQ编码】

上文的各类编码都基于这样的假设,数据的相邻性与它的最佳编码方式有关。

然而,数据可能和上下文多个地方相关,例如,当前字符可能上文间隔几个字符的地方相关,而不仅仅是邻近的;在图像上,当前像素可能和周围8个像素相关等。

PAQ(Prediction by Adaptive Quadratic estimation)编码利用更多的相关性都使得下一个字符出现的概率变高,码字变短,能获得更好的压缩效果。

PPM是对相关性建模的一种方式,可以进一步优化成自适应PPM,其对于当前字符,有特定的概率计算

我们可以对其他模式做建模,比如取当前字符连续N个间隔8个字符的字符等,根据这个模型,对于当前字符,也有特性的概率计算。

每多一个模型,就多一个概率计算。那么要去哪个模型的结果呢?

典型的如何从多个数据中取一个数据的问题:

可以最简单的独立取值

考虑的模型之前可能具有相关性,可以用最简单的线性混合,

更准确要用逻辑混合, 在逻辑混合中,人类可认知到的相关性是有限的,特定的,不能通用,这时候就需要神经网络来更新权重。

最后,开发应该关注到,增加模型会导致内存增大、性能降低。

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

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

相关文章

03.顺序表实现

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删改查。一般见到的顺序表都是在结构体中定义的数组,只是比普通数组多了增删改查等一些其他功能函数。 上节已经介绍了顺序表有…

【android studio】Gradle和Gradle插件版本关系/配置/常见ERR示例

参考链接: Android之Gradle和Gradle插件区别及联系 grdle 的安装与配置 、gradle和jdk版本对应关系 Android Gradle Plugin与Gradle版本、JDK版本对应关系 配置示例 常见err 主要原因 1.编译版本未设定 2.有多个module而且gradle 版本设置不一致 修改如下&#xf…

虚幻闪烁灯光材质

创建一个材质 材质域改成光照函数 , Time让材质动起来 参数B用来控制速度 , Sine 让灯光闪烁 , Frac 增加了闪烁细节 把材质放到灯光材质上 效果还是挺不错的! 可以用于一些恐怖游戏~

OpenCV高级图形用户界面(8)在指定的窗口中显示一幅图像函数imshow()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在指定的窗口中显示一幅图像。 函数 imshow 在指定的窗口中显示一幅图像。如果窗口是以 cv::WINDOW_AUTOSIZE 标志创建的,图像将以原…

仕考网:国考笔试没进面还有机会吗?

在国家公务员考试及各省公务员考试中,除了常规的招录程序之外,还有调剂、递补和补录多重机会。 调剂:于笔试结束之后至面试启动之前.针对因报名人数不足未达到预定面试比例的岗位,将开放公开调剂。只要考生的笔试成绩超越了国考设…

React面试题笔记(一)

一、react基础面试题 1.react中keys的作用是什么? key是是用于追踪哪些列表被修改,被添加或者被移除的辅助标识。 在开发过程中,我们需要保证某个元素的 key 在其同级元素中具有唯一性。在 React Diff 算法中 React 会借助元素的 Key 值来判断该元素是…

如何查看默认网关地址:详细步骤

在日常的网络配置与故障排查中,了解并正确查看默认网关地址是一项基础且至关重要的技能。默认网关是连接本地网络与外部网络(如互联网)的关键节点,它扮演着数据包转发的重要角色。无论是家庭网络、办公室网络还是更复杂的网络环境…

Chromium html<iframe>对应c++接口定义

HTML <iframe> 标签 使用 <iframe> 标签 在当前 HTML 文档中嵌入另一个文档&#xff1a; <!DOCTYPE html> <html> <body><h1>iframe 元素</h1><iframe src"https://www.w3school.com.cn" title"W3School 在线教…

一些简单的编程题(Java与C语言)

引言&#xff1a; 这篇文章呢&#xff0c;小编将会举一些简单的编程题用来帮助大家理解一下Java代码&#xff0c;并且与C语言做个对比&#xff0c;不过这篇文章所出现的题目小编不会向随缘解题系列里面那样详细的讲解每一到题&#xff0c;本篇文章的主要目的是帮助小编和读者们…

vcenter的使用

1 配置 1.1 时间配置 报错原因&#xff1a;ESXI主机没有配置DNS无法解析NTP服务器网址。 解决办法&#xff1a;配置ESXI主机DNS&#xff0c;操作如下图。 点击【配置】、【服务】 【编辑启动策略】 我们可以看到当前的【NTP服务状态】处于 已停止的状态 点击【配置】、【时间…

基于直播美颜SDK的实时美颜平台开发指南

随着直播平台的快速发展&#xff0c;用户对视频质量的要求越来越高&#xff0c;尤其是对于美颜效果的需求。为满足这一市场需求&#xff0c;基于直播美颜SDK的实时美颜平台应运而生。本文将探讨如何开发这样一个平台&#xff0c;助力开发者在激烈的竞争中脱颖而出。 一、理解美…

前端容易错的题2

v-if 和 v-show 区别 使用了 v-if 的时候&#xff0c;如果值为 false &#xff0c;那么页面将不会有这个 html 标签生成。 v-show 则是不管值为 true 还是 false &#xff0c;html 元素都会存在&#xff0c;只是 CSS 中的 display 显示或隐藏 $route和$router的区别 $rou…

PHP DateTime基础用法

PHP DateTime 的用法详解 一、引言 在开发 PHP 应用程序时&#xff0c;处理日期和时间是一个至关重要的任务。PHP 提供了强大的日期和时间处理功能&#xff0c;其中 DateTime 类是最常用的工具之一。DateTime 类提供了丰富的方法来创建、格式化、计算和比较日期时间&#xff…

C#学习笔记(三)

C#学习笔记&#xff08;三&#xff09; 第 二 章 命名空间和类、数据类型、变量和代码规范二、类的组成和使用分析1. 基本概念2. 类的内容组成3. 方法的初步理解 第 二 章 命名空间和类、数据类型、变量和代码规范 二、类的组成和使用分析 1. 基本概念 类是程序的基本单元&a…

OpenCV高级图形用户界面(6)获取指定窗口中图像的矩形区域函数getWindowImageRect()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 提供窗口中图像的矩形区域。 该函数 getWindowImageRect 返回图像渲染区域的客户端屏幕坐标、宽度和高度。 函数原型 Rect cv::getWindowImage…

STM32_实验1_建立新工程

1、使用STM32CubeIDE建立一个新工程 1.1选择时钟源为外部晶振时钟。 1.2选择调试方式为 serial wire&#xff08;串行线&#xff09;。 1.3配置时钟树. 1.4选择以 c 和 h 文件型式管理工程文件。 1.5生成 hex 可执行文件。&#xff08;完成后点击锤子&#xff09; 2.串口输出调…

Windows环境NodeJS下载配置安装运行

Windows环境NodeJS下载配置安装运行 &#xff08;1&#xff09;下载 Node.js — Run JavaScript Everywhere 安装文件。 一路傻瓜式安装。 如果安装正常&#xff0c;输入命令可显示版本号&#xff1a; &#xff08;2&#xff09;可以查询nodejs默认的后续依赖安装包位置及缓存…

地方门户分类信息网站源码系统 用户可以自由发帖 PHP+MySQL组合开发 带完整的安装代码包以及搭建部署教程

系统概述 地方门户分类信息网站源码系统是一个基于PHP和MySQL开发的强大平台&#xff0c;旨在帮助用户轻松搭建地方性的分类信息网站。该系统集成了众多实用功能&#xff0c;支持用户自由发帖、浏览和搜索各类信息&#xff0c;如二手交易、求职招聘、房屋租售、生活服务、商家…

Winform和WPF的技术对比

WinForms&#xff08;Windows Forms&#xff09;和WPF&#xff08;Windows Presentation Foundation&#xff09;是用于创建桌面应用程序的两种技术。尽管两者都可以用于开发功能强大的Windows应用程序&#xff0c;但它们的设计理念、功能和开发体验都有显著区别。在本文中&…

机器学习——量子机器学习

量子机器学习: 未来的机器学习方法 量子计算和机器学习的结合为计算科学带来了前所未有的前景。量子机器学习(QML)正在迅速发展&#xff0c;目标是利用量子计算的优势来处理传统计算机无法高效解决的问题。本文将深入探讨量子机器学习的基本概念、量子计算的关键技术、具体的量…