具有小词典的压缩算法

时间:2011-05-08 19:28:03

标签: compression

我正在寻找一种适用于小于一个字节的符号的压缩算法。我对压缩算法进行了快速研究,很难找到所用符号的大小。无论如何,有些符号小于8位的流。 DEFLATE是否有一个参数来定义其符号的大小?

2 个答案:

答案 0 :(得分:3)

小于一个字节的明文符号

LZ77和LZ78的原始描述用十进制数字序列(大约是字节大小的一半的符号)来描述它们。

如果你谷歌的“DNA压缩算法”,你可以得到一堆专门针对压缩文件的算法的信息,这些文件几乎完全由4个字母AGCT组成,这是一个4个符号的字典,每个符号大约1/4为小到一个字节。 也许其中一种算法可能适合你,只需要相对较少的调整。

LZMA中使用的LZ77样式压缩对于它压缩的前几个符号,似乎每个符号使用两个字节。 但压缩了几百个明文符号后 (自然语言文本的字母,或十进制数字的序列,或代表DNA碱基的4个字母的序列等),LZMA发出的双字节压缩“块”通常代表十几个或更多的明文符号。 (我怀疑所有类似算法都是如此,例如DEFLATE中使用的LZ77算法)。

如果您的文件仅使用远低于所有256个可能字节值的受限字母表, 原则上,程序员可以调整DEFLATE(或其他算法)的变体,该变体可以利用有关该字母表的信息来生成比使用标准DEFLATE压缩的相同文件小一些的压缩文件。 但是,许多面向字节的文本压缩算法--LZ77,LZW,LZMA,DEFLATE等构建了一个常见长字符串的字典,并且可以在自定义适应的百分之几内提供压缩性能(具有足够大的源文件)变体 - 通常使用标准压缩文件格式的优点是值得牺牲百分之几的潜在空间节省。

压缩符号小于一个字节

许多压缩算法,包括一些在基准文件上提供最佳已知压缩的压缩算法,逐位输出压缩信息(例如大多数PAQ系列压缩器和某些算术编码器),而其他算法输出变量不考虑字节边界的长度压缩信息(例如霍夫曼压缩)。

描述算术编码的一些方法谈论被压缩为“少于一位信息”的信息片段,例如单个位或像素。

编辑: “计数参数”解释了为什么不可能将所有可能的字节,更不用说所有可能的字节和几个常见的字节序列压缩成长度都小于8位的码字。 然而,几种压缩算法可以并且经常表示代表一些字节或(更少)某些字节序列,每个字节序列具有小于8位长的码字,通过“牺牲”或“转义”最不常见的字节结束由其他代码字表示(包括“转义”)长度超过8位。

此类算法包括:

Pike算法使用4位“0101”表示'e'(或在某些上下文中'E'),8位“0000 0001”表示单词“the”(4个字节,包括之前的空格)它)(或在某些情况下“The”或“THE”)等。 它有一个包含大约200个最常用英语单词的小字典, 包括16个非常常见的英语单词的子词典。

当使用面向字节的霍夫曼编码压缩英文文本时,序列“e”(e空格)被压缩为两个码字,总共通常为6位。

唉,当涉及到霍夫曼编码时,我无法告诉你那些“小”代码字的确切大小,或者甚至告诉你一个小代码字代表什么字节或字节序列,因为它对于每个文件都是不同的。 通常,相同的码字表示同一文件中不同位置的不同字节(或不同的字节序列)。 解码器基于报头中的压缩器留下的线索以及到目前为止解压缩的数据来决定码字表示哪个字节或字节序列。 对于范围编码或算术编码,“码字”甚至可能不是整数位。

答案 1 :(得分:1)

您可能需要查看Golomb代码。 golomb代码使用分而治之算法来压缩inout。这不是字典压缩,但值得一提。