我想知道我们可以进行无损数据压缩到什么程度?我无法找到无损算法的在线模拟器来执行一些经验测试。我可以自己做一个,但是不幸的是我在这段时间没有足够的时间。我仍然对自己的直觉感到好奇,我将要解释一下。
让我们仅采用两种比较流行的算法:Huffman Coding
和Run-lenght Enconding
。
假设我们有一个数字A
符号的字母和该字母的任意长符号序列:例如:
Alphabet = {A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, X, W, Y, Z}
Sequence1 = SFBJNERUSNJGSDKKDEIJGNMSDJDDSUSJNF
Sequence2 = MNMNMNREGUHSDFJUF
Sequence3 = MMMMMNNNNNASDUERJGASIUJMMMNNNUNS
现在,如果仅用固定长度的n
位字对每个符号进行编码,那么我们就拥有未压缩的序列,即长的N
位。
如果我们使用霍夫曼编码序列,则将使用H
位代替N
位,从而节省(1-H/N)*100%
空间。
如果我们使用RLE编码相同的序列,则将使用R
bits进行保存(1-R/N)*100%
。
我想知道,如果我们应用RLE + Huffman
或者Huffman + RLE
比仅使用其中之一可以节省更多空间,会发生什么。
对我来说,这似乎是一个非常基本的想法,但是在谷歌搜索中,我没有发现任何与此主题相关的问题。
编辑:嗯,我可能没有考虑过,如果我先使用RLE,将无法使用霍夫曼,因为与单个符号的固定长度代码的对应关系将会丢失;但是仍然应该可以先使用Huffman,然后再使用RLE。
顺便说一句,我对其中的逻辑很感兴趣,我的意思是串联使用多个以上的无损压缩算法。
编辑2:当我评论马克·阿德勒的答复时,我意识到我可能已经找到了我问题的答案。就是这个:
符号到符号代码的霍夫曼如何影响检测?
假设我们有以下代码:AABCABAAB
。用纯二进制00 00 01 10 00 01 00 00 01
格式,它将被编码为(obv空间仅出于可读性目的)。Huffman会将其编码为0 0 11 10 0 11 0 0 11
。空格进一步显示了如何不更改字符串,因此假设我们正在此范围(符号方式)接近代码,则有可能检测到完全相同的重复次数。
这就引出了我的另一点(鉴于这已经是很长的评论了,在这里我将不讨论):逐位分析代码。
因此,我实际上认为我得出了一个结论:众所周知,任何字典(或基于替换的)编码器将可变数量的符号分组为固定长度的码字,而Huffman(或任何其他熵编码器)对固定长度的符号进行编码变成可变数量的比特,从而使熵近似为最小值;ERGO,这将是毫无意义的(且仅计算的废物)首先让霍夫曼运行,因为其他的算法将最有可能引入更多的冗余这霍夫曼也能减少。
当然,这只是理论上的论文,因为在实践中我们可以考虑其他因素(例如计算时间)……更不用说要编码的字符串的不同配置可能导致不同结果的事实。但是,对我来说这很有意义。:)
这些组合是常规完成的。您应该阅读一些有关压缩的书。
LZ77是RLE的一种更通用的形式,它复制先前字符串的重复。(距离1和长度n的匹配对最后一个字节的n个副本进行编码。)LZ77通常后面跟随霍夫曼,算术或范围编码。
Huffman应该跟随LZ77或RLE,而不是跟随它。霍夫曼编码将使检测重复变得更加困难,而不是更加容易。为了首先使用RLE,您只需将符号集扩展到文字之外。作为一个示例,在zip,gzip,zlib等中使用的Deflate格式具有286个符号集,用于编码256个文字字节,29个长度前缀代码和流码的一端。29个长度前缀代码中的每一个都隐含一个零到五位的后缀,该后缀跟随该代码添加到基本值以获取长度。长度代码及其后缀的存在意味着它后面是另一个霍夫曼代码,它是30个距离代码前缀之一,每个前缀的后缀为0到13位,以指定匹配返回的距离。
还有许多其他转换(可能会或可能不会自行压缩),然后进行熵编码。这些包括Burrows-Wheeler变换(BWT),Move-To-Front变换(MTF)(通常遵循BWT),图像的离散余弦变换(可以无损地进行,但最常用于有损压缩算法中)变换以可逆的方式对数据中的组公共性进行分组,从而为熵编码步骤提供了更大的收益。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句