当前位置:首页 » 文件管理 » 数据压缩算法

数据压缩算法

发布时间: 2022-11-05 12:00:14

⑴ RAR和ZIP两种格式的压缩算法分别是什么

RAR文件的扩展名是.rar(不区分大小写,),MIME类型是application/x-rar-compressed。同样是无损数据压缩,RAR文件通常比ZIP文件压缩比要高,但是压缩速度较慢。因为RAR文件头也要占据一定空间,在数据压缩余地不大时,压缩过的文件可能比原文件要大。RAR的一个主要优点是可以把文件压缩目标分割到多个文件,并且很容易从这样的分割的压缩文件解压出源文件。另外,RAR也支持紧缩格式,把所有文件压缩到同一个数据区以加大压缩比,代价是解压一个单独的文件时必须解压其前面的所有文件。新的RAR的加密算法使用的是AES,而旧的RAR的加密算法是私有的。这两种算法都很难破解,所以在没有密码的情况下只能用字典暴力破解法来破解。RAR中也可以加入冗余的修复信息,在文件损坏但是修复信息足够完好时可以对压缩包进行修复。

⑵ 数据无损压缩技术到底怎么实现的

无损数据压缩(Lossless Compression)是指使用压缩后的数据进行重构(或者叫做还原,解压缩),重构后的数据与原来的数据完全相同;无损压缩用于要求重构的信号与原始信号完全一致的场合。也就是说数据经过压缩后信息不受损失,还能完全恢复到压缩前的原样。它和有损数据压缩相对。这种压缩通常压缩比小于有损数据压缩的压缩比。
一个很常见的例子是磁盘文件的压缩。根据目前的技术水平,无损压缩算法一般可以把普通文件的数据压缩到原来的1/2~1/4。一些常用的无损压缩算法有霍夫曼(Huffman)算法和LZW(Lenpel-Ziv & Welch)压缩算法。

⑶ Elasticsearch之数据压缩算法

Lucene使用FST算法以字节的方式来存储所有的Term,重复利用Term Index的前缀和后缀,使Term Index小到可以放进内存,减少存储空间,不过相对的也会占用更多的cpu资源。FST在Lucene4.0以后的版本中用于快速定位所查单词在字典中的位置。

Finite StateTranscers,简称 FST,通常中文译作 有穷状态转换器 ,在语音识别和自然语言搜索、处理等方向被广泛应用。

FST的功能类似于字典,可以表示成FST<Key, Value>的形式。其最大的特点是,可以用 O(length(key)) 的复杂度来找到key对应的value,也就是说查找复杂度仅取决于所查找的key长度。

假设我们现在要将以下term index映射到term dictionary的block序号:

最简单的做法就是定义个Map<string, integer="">,大家找到自己的位置对应入座就好了,但从内存占用少的角度想想,有没有更优的办法呢?答案就是FST。

对于经典FST算法来说,要求 Key必须按字典序从小到大加入到FST 中。上面的例子中key已经排好序了。

按照以下步骤建立FST:

最后加入 dogs ,得到最后的结果:

从上图可以看出,每条边有两条属性,一个表示label(key的元素),另一个表示Value(out)。注意Value不一定是数字,还可一是另一个字符串,但要求Value必须满足叠加性,如这里的正整数2 + 8 = 10。字符串的叠加行为: aa + b = aab。

建完这个图之后,我们就可以很容易的查找出任意一个key的Value了。例如:查找dog,我们查找的路径为:0 → 4 → 8 → 9。 其权值和为: 2 + 0 + 0 + 0 = 2。其中最后一个零表示 node[9].finalOut = 0。所以“dog”的Value为2。

Lucene除了上面说到用FST压缩term index外,对posting list也会进行压缩。

有人可能会有疑问:“posting list不是已经只存储文档id了吗?还需要压缩吗?”。设想这样一种情况,Lucene需要对一千万个同学的性别进行索引,而世界上只有男/女这样两个性别,每个posting list都会有数百万个文档id,这里显然有很大的压缩空间与价值,对于减少索引尺寸有非常重要的意义。

Lucene使用 Frame Of Reference 编码来实现对posting list压缩,其思路简单来说就是: 增量编码压缩,将大数变小数,按字节存储

示意图如下:

除此之外,Lucene在执行filter操作还会使用一种叫做 Roaring bitmaps 的数据结构来存储文档ID,同样可以达到压缩存储空间的目的。

说到Roaring bitmaps,就必须先从bitmap说起。bitmap是一种很直观的数据结构,假设有某个posting list:

对应的bitmap就是:

非常直观,用0/1表示某个值是否存在,比如10这个值就对应第10位,对应的bit值是1,这样用一个字节就可以代表8个文档id,旧版本(5.0之前)的Lucene就是用这样的方式来压缩的,但这样的压缩方式仍然不够高效,如果有1亿个文档,那么需要12.5MB的存储空间,这仅仅是对应一个索引字段(我们往往会有很多个索引字段)。于是有人想出了Roaring bitmaps这样更高效的数据结构。Roaring bitmaps压缩的原理可以理解为,与其保存100个0,占用100个bit,还不如保存0一次,然后声明这个0有100个。

Bitmap的缺点是存储空间随着文档个数线性增长,Roaring bitmaps需要打破这个魔咒就一定要用到某些指数特性:

将posting list按照65535为界限分块,比如第一块所包含的文档id范围在0 65535之间,第二块的id范围65536 131071,以此类推。再用<商,余数>的组合表示每一组id,这样每组里的id范围都在0~65535内了,剩下的就好办了,既然每组id不会变得无限大,那么我们就可以通过最有效的方式对这里的id存储。

为什么是以65535为界限呢?

程序员的世界里除了1024外,65535也是一个经典值,因为它=2^16-1,正好是用2个字节能表示的最大数,一个short的存储单位,注意到上图里的最后一行“If a block has more than 4096 values, encode as a bit set, and otherwise as a simple array using 2 bytes per value”,如果是大块,用节省点用bitset存,小块就豪爽点,2个字节我也不计较了,用一个short[]存着方便。

那为什么用4096来区分大块还是小块呢?

都说程序员的世界是二进制的,4096*2bytes = 8192bytes < 1KB, 磁盘一次寻道可以顺序把一个小块的内容都读出来,再大一位就超过1KB了,需要两次读。

一种常见的压缩存储时间序列的方式是把多个数据点合并成一行。Opentsdb支持海量数据的一个绝招就是定期把很多行数据合并成一行,这个过程叫compaction。类似的vivdcortext使用mysql存储的时候,也把一分钟的很多数据点合并存储到mysql的一行里以减少行数。

这个过程可以示例如下:

合并之后就变成了:

可以看到,行变成了列了。每一列可以代表这一分钟内一秒的数据。

Elasticsearch有一个功能可以实现类似的优化效果,那就是Nested Document。我们可以把一段时间的很多个数据点打包存储到一个父文档里,变成其嵌套的子文档。示例如下:

可以打包成:

这样可以把数据点公共的维度字段上移到父文档里,而不用在每个子文档里重复存储,从而减少索引的尺寸。

在存储的时候,无论父文档还是子文档,对于 Lucene 来说都是文档,都会有文档 Id。但是对于嵌套文档来说,可以保存起子文档和父文档的文档 id 是连续的,而且父文档总是最后一个。有这样一个排序性作为保障,那么有一个所有父文档的 posting list 就可以跟踪所有的父子关系。也可以很容易地在父子文档 id 之间做转换。把父子关系也理解为一个 filter,那么查询时检索的时候不过是又 AND 了另外一个 filter 而已。前面我们已经看到了 Elasticsearch 可以非常高效地处理多 filter 的情况,充分利用底层的索引。

使用了嵌套文档之后,对于 term 的 posting list 只需要保存父文档的 doc id 就可以了,可以比保存所有的数据点的 doc id 要少很多。如果我们可以在一个父文档里塞入 50 个嵌套文档,那么 posting list 可以变成之前的 1/50。

⑷ 数据压缩

数据压缩技术主要研究数据的表示、传输和转换方法,目的是减少数据所占据的存储空间和缩短数据传输时所需要的时间。

衡量数据压缩的3个主要指标:一是压缩前后所需的信息存储量之比要大;二是实现压缩的算法要简单,压缩、解压缩速度快,要尽可能做到实时压缩和解压缩;三是恢复效果要好,要尽可能完全恢复原始数据。

数据压缩主要应用于两个方面。一是传输:通过压缩发送端的原始数据,并在接收端进行解压恢复,可以有效地减少传输时间和增加信道带宽。二是存储:在存储时压缩原始数据,在使用时进行解压,可大大提高存储介质的存储量。

数据压缩按照压缩的失真度分成两种类型:一种叫作无损压缩,另一种叫作有损压缩。

无损压缩是指使用压缩后的数据进行重构(或者叫作还原、解压缩),重构后的数据与原来的数据完全相同;无损压缩用于要求重构的信号与原始信号完全一致的场合。一个很常见的例子是磁盘文件的压缩。根据目前的技术水平,无损压缩算法一般可以把普通文件的数据压缩到原来的1/4~1/2。一些常用的无损压缩算法有霍夫曼(Huffman)算法、算术算法、游程算法和LZW(Lenpel-Ziv & Welch)压缩算法。

1)霍夫曼算法属于统计式压缩方法,其原理是根据原始数据符号发生的概率进行编码。在原始数据中出现概率越高的符合,相应的码长越短,出现概率越少的符合,其码长越长。从而达到用尽可能少的符号来表示原始数据,实现对数据的压缩。

2)算术算法是基于统计原理,无损压缩效率最高的算法。即将整段要压缩的数据映射到一段实数半封闭的范围[0,1)内的某一区段。该区段的范围或宽度等于该段信息概率。即是所有使用在该信息内的符号出现概率全部相乘后的概率值。当要被编码的信息越来越长时,用来代表该信息的区段就会越来越窄,用来表示这个区段的位就会增加。

3)游程算法是针对一些文本数据特点所设计的压缩方法。主要是去除文本中的冗余字符或字节中的冗余位,从而达到减少数据文件所占的存储空间。压缩处理流程类似于空白压缩,区别是在压缩指示字符之后加上一个字符,用于表明压缩对象,随后是该字符的重复次数。本算法具有局限性,很少单独使用,多与其他算法配合使用。

4)LZW算法的原理是用字典词条的编码代替在压缩数据中的字符串。因此字典中的词条越多,压缩率越高,加大字典的容量可以提高压缩率。字典的容量受计算机的内存限制。

有损压缩是指使用压缩后的数据进行重构,重构后的数据与原来的数据有所不同,但不影响人对原始资料表达的信息造成误解。有损压缩适用于重构信号不一定非要和原始信号完全相同的场合。例如,图像和声音的压缩就可以采用有损压缩,因为其中包含的数据往往多于我们的视觉系统和听觉系统所能接收的信息,丢掉一些数据而不至于对声音或者图像所表达的意思产生误解,但可大大提高压缩比。

⑸ 压缩算法原理

哈夫曼
哈夫曼编码是无损压缩当中最好的方法。它使用预先二进制描述来替换每个符号,长度由特殊符号出现的频率决定。常见的符号需要很少的位来表示,而不常见的符号需要很多为来表示。

哈夫曼算法在改变任何符号二进制编码引起少量密集表现方面是最佳的。然而,它并不处理符号的顺序和重复或序号的序列。

2.1 原理
我不打算探究哈夫曼编码的所有实际的细节,但基本的原理是为每个符号找到新的二进制表示,从而通常符号使用很少的位,不常见的符号使用较多的位。

简短的说,这个问题的解决方案是为了查找每个符号的通用程度,我们建立一个未压缩数据的柱状图;通过递归拆分这个柱状图为两部分来创建一个二叉树,每个递归的一半应该和另一半具有同样的权(权是 ∑ N K =1 符号数 k , N 是分之中符号的数量,符号数 k 是符号 k出现的次数 )

这棵树有两个目的:

1. 编码器使用这棵树来找到每个符号最优的表示方法

2. 解码器使用这棵树唯一的标识在压缩流中每个编码的开始和结束,其通过在读压缩数据位的时候自顶向底的遍历树,选择基于数据流中的每个独立位的分支,一旦一个到达叶子节点,解码器知道一个完整的编码已经读出来了。

压缩后的数据流是 24 位(三个字节),原来是 80 位( 10 个字节)。当然,我应该存储哈夫曼树,这样解码器就能够解码出对应的压缩流了,这就使得该例子中的真正数据流比输入的流数据量大。这是相对较短的数据上的副作用。对于大数据量来说,上面的哈夫曼树就不占太多比例了。

解码的时候,从上到下遍历树,为压缩的流选择从左 / 右分支,每次碰到一个叶子节点的时候,就可以将对应的字节写到解压输出流中,然后再从根开始遍历。

2.2 实现
哈夫曼编码器可以在基本压缩库中找到,其是非常直接的实现。

这个实现的基本缺陷是:

1. 慢位流实现

2. 相当慢的解码(比编码慢)

3. 最大的树深度是 32 (编码器在任何超过 32 位大小的时候退出)。如果我不是搞错的话,这是不可能的,除非输出的数据大于 2 32字节。

另一方面,这个实现有几个优点:

1. 哈夫曼树以一个紧密的形式每个符号要求 12 位(对于 8 位的符号)的方式存储,这意味着最大的头为 384 。

2. 编码相当容易理解

哈夫曼编码在数据有噪音的情况(不是有规律的,例如 RLE )下非常好,这中情况下大多数基于字典方式的编码器都有问题。

⑹ 数据压缩算法可分无损压缩和( )压缩两种

有损压缩。无损压缩是指对原数据毫无损害完全保留,有损是指牺牲一部分数据真实性且对原数据影响不大的情况下,换取更小的压缩后存储空间。

⑺ 数据的压缩方法有几种

总的来说,数据压缩方法可分为三类:静态、动态及混合方法。所谓静态方法就是在 信文传送之前源文集和码子集之间的映射关系就已确定,以后给定信文无论什么时刻出现 在信文集中总被表示为相同的码字。而动态方法是在信文集和码子集之间建立一种随着时 间的变化而变化的映射关系,动态方法也称为自适应编码,即它们不断地修改源信文集与 码字的对就关系以便更好地适应于信文集特征随时间的变化。所有的自适应方法都是一次 操作方法,即只需对源文集扫描一次。静态编码需要二次操作:第一次计算概率并确定映 射,第二次传送码字。当一个算法既不完全静态又不完全动态时,就称为混合方法。一种 简单的混合方法是让发送方和接收方保持一致的含K个静态码子的编码本。每次传送信息 时,发送方必须选择预先约定的K个码字中的一个,并通知接收方应译码。

⑻ 数据压缩技术一般分哪两种各有什么特点

数据压缩可分成两种类型,一种叫做无损压缩,另一种叫做有损压缩。
无损压缩是指使用压缩后的数据进行重构(或者叫做还原,解压缩),重构后的数据与原来的数据完全相同;无损压缩用于要求重构的信号与原始信号完全一致的场合。一个很常见的例子是磁盘文件的压缩。根据目前的技术水平,无损压缩算法一般可以把普通文件的数据压缩到原来的1/2~1/4。一些常用的无损压缩算法有霍夫曼(Huffman)算法和LZW(Lenpel-Ziv & Welch)压缩算法。
有损压缩是指使用压缩后的数据进行重构,重构后的数据与原来的数据有所不同,但不影响人对原始资料表达的信息造成误解。有损压缩适用于重构信号不一定非要和原始信号完全相同的场合。例如,图像和声音的压缩就可以采用有损压缩,因为其中包含的数据往往多于我们的视觉系统和听觉系统所能接收的信息,丢掉一些数据而不至于对声音或者图像所表达的意思产生误解,但可大大提高压缩比。

⑼ 二进制压缩算法有哪些

二进制数据压缩算法二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。

20世纪被称作第三次科技革命的重要标志之一的计算机的发明与应用,因为数字计算机只能识别和处理由‘0’。‘1’符号串组成的代码。其运算模式正是二进制。19世纪爱尔兰逻辑学家乔治布尔对逻辑命题的思考过程转化为对符号“0‘’。‘’1‘’的某种代数演算,二进制是逢2进位的进位制。0、1是基本算符。因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。

二进制压缩 - 算法

二进制压缩

编程时遇到每个数据只有两种状态,且 dfs 或者 bfs 时遍历时间复杂度高时,可以采用二进制压缩数据,尤其是二维数组。LZFSE

1,zlib和gzip都对deflate进行了封装,比deflate多了数据头和尾

1,苹果开源了新的无损压缩算法 LZFSE ,该算法是去年在iOS 9和OS X 10.10中 引入 的。按照苹果公司的说法,LZFE的压缩增益和ZLib level 5相同,但速度要快2~3倍,能源效率也更高。

LZFSE基于Lempel-Ziv,并使用了 有限状态熵编码,后者基于Jarek Duda在

非对称数字系统(ANS)方面所做的熵编码工作。简单地讲,ANS旨在“终结速度和比率的平衡”,既可以用于精确编码,又可以用于快速编码,并且具有数据加密功能。使用ANS代替更为传统的

Huffman和 算术编码方法的压缩库 越来越多,LZFSE就位列其中。

显然,LZFSE的目标不是成为最好或最快的算法。事实上,苹果公司指出,

LZ4的压缩速度比LZFSE快,而 LZMA提供了更高的压缩率,但代价是比Apple

SDK提供的其他选项要慢一个数量级。当压缩率和速度几乎同等重要,而你又希望降低能源效率时,LZFSE是苹果推荐的选项。

GitHub上提供了LZFSE的参考实现。在MacOS上构建和运行一样简单:

$ xcodebuild install DSTROOT=/tmp/lzfse.dst

如果希望针对当前的iOS设备构建LZFSE,可以执行:

xcodebuild -configuration “Release” -arch armv7 install DSTROOT=/tmp/lzfse.dst

除了 API文档之外,苹果去年还提供了一个 示例项目,展示如何使用LZFSE 进行块和流压缩,这是一个实用的LZFSE入门资源。

LZFSE是在谷歌 brotli之后发布的,后者在去年开源。与LZFSE相比,brotli 似乎是针对一个不同的应用场景进行了优化,比如压缩静态Web资产和Android APK,在这些情况下,压缩率是最重要的。

⑽ 什么是压缩算法

LZW压缩算法的基本概念:LZW压缩有三个重要的对象:数据流(CharStream)、编码流(CodeStream)和编译表(String Table)。在编码时,数据流是输入对象(文本文件的据序列),编码流就是输出对象(经过压缩运算的编码数据);在解码时,编码流则是输入对象,数据流是输出对象;而编译表是在编码和解码时都须要用借助的对象。字符(Character):最基础的数据元素,在文本文件中就是一个字节,在光栅数据中就是一个像素的颜色在指定的颜色列表中的索引值;字符串(String):由几个连续的字符组成; 前缀(Prefix):也是一个字符串,不过通常用在另一个字符的前面,而且它的长度可以为0;根(Root):一个长度的字符串;编码(Code):一个数字,按照固定长度(编码长度)从编码流中取出,编译表的映射值;图案:一个字符串,按不定长度从数据流中读出,映射到编译表条目. LZW压缩算法的基本原理:提取原始文本文件数据中的不同字符,基于这些字符创建一个编译表,然后用编译表中的字符的索引来替代原始文本文件数据中的相应字符,减少原始数据大小。看起来和调色板图象的实现原理差不多,但是应该注意到的是,我们这里的编译表不是事先创建好的,而是根据原始文件数据动态创建的,解码时还要从已编码的数据中还原出原来的编译表.

热点内容
负数幂算法 发布:2024-10-06 18:29:48 浏览:350
iphone手机id密码是多少位 发布:2024-10-06 18:29:46 浏览:839
易经隔骨算法真的准吗 发布:2024-10-06 18:29:44 浏览:44
数据库有损坏 发布:2024-10-06 18:29:43 浏览:311
数据结构对算法的影响 发布:2024-10-06 18:21:28 浏览:33
服务器托管ip不变 发布:2024-10-06 18:21:20 浏览:422
网盘加密软件 发布:2024-10-06 18:16:17 浏览:124
儿童配置保险怎么买 发布:2024-10-06 18:07:32 浏览:734
ipad存储器 发布:2024-10-06 18:00:07 浏览:535
c语言void返回值 发布:2024-10-06 18:00:02 浏览:320