当前位置: 首页 > 知识库问答 >
问题:

结合无损数据压缩算法

郭琦
2023-03-14

我想知道我们可以在多大程度上进行无损数据压缩;我无法找到一个无损算法的在线模拟器来执行一些经验测试。我可以自己做一个,但不幸的是,我在这段时间没有足够的时间;我仍然对我的直觉感到好奇,我将解释一下。

让我们只看两种更流行的算法:Huffman编码和Run-lenght-encoding。

假设我们有一个由数字符号组成的字母表和该字母表中任意长的符号序列:例如:

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位。

如果我们使用Huffman对序列进行编码,我们将使用H位而不是N位,节省(1-H/N)*100%位空间。

如果我们使用RLE对相同的序列进行编码,我们将使用R位,节省(1-R/N)*100%

我想知道,如果我们应用RLE-Huffman或〈code〉Huffman-RLE,我们可以比只使用其中一个节省更多的空间,会发生什么。

这对我来说似乎是一个非常基本的想法,但在谷歌上我没有找到任何关于这个话题的有趣的东西。

编辑:嗯,我可能没有考虑到如果我先使用RLE,我将无法使用Huffman,因为与单个符号的固定长度代码的相关性会丢失;但仍然应该可以首先使用Huffman,然后使用RLE。

顺便说一句,我对其中的逻辑很感兴趣,我的意思是串联使用多个无损压缩算法。

编辑2:当我对马克·阿德勒的回复发表评论时,我意识到我可能已经找到了问题的答案。就是这样:

哈夫曼是一种符号到符号的代码,它如何影响检测?

假设我们有以下代码:AABCABAAB。在普通二进制中,它将被编码为00 00 01 10 00 01 00 01(obv空格仅用于可读性目的)。哈夫曼将其编码为0 11 10 11 0 11。空格更能显示字符串是如何不改变的,因此,假设我们在这个范围(符号方面)接近代码,则可以检测到完全相同的重复量。

这让我想到了另一点(鉴于这已经是一个很长的注释,我将在这里不讨论):逐位分析代码。

所以,我实际上认为我得出了一个结论:正如我们所知,任何字典(或基于替换的)编码器都会将可变数量的符号分组到固定长度的码字中,而霍夫曼(或任何其他熵编码器)将固定长度的符号编码为可变数量的比特,从而将熵逼近到最小值;因此,让霍夫曼先运行是毫无意义的(并且只会浪费计算),因为其他算法很可能会引入霍夫曼可以减少的更多冗余。

当然,这只是一篇理论论文,因为在实践中,我们可以考虑其他因素(例如计算时间)。。。更不用说要编码的字符串的不同配置可能会导致不同的结果。但是,嗯。。。这对我来说很有意义


共有1个答案

夏侯宏旷
2023-03-14

这些组合是例行进行的。你应该读一些关于压缩的书。

LZ77是RLE的一种更一般的形式,它复制先前字符串的重复。(距离1和长度n的匹配编码最后字节的n个副本的运行。)LZ77通常后跟哈夫曼、算术或范围编码。

哈夫曼应该遵循LZ77或RLE,而不是在它之前。哈夫曼编码将使检测重复更加困难,而不是更容易。为了首先使用RLE,只需将符号集扩展到文字之外。例如,在zip、gzip、zlib等中使用的Deflate格式具有286个符号集,用于编码256个文字字节、29个长度前缀代码和流代码的一端。29个长度前缀代码中的每一个都意味着一个零到五位的后缀,该后缀跟随代码添加到基值以获得长度。长度码及其后缀的存在意味着它后面跟着另一个哈夫曼码,30个距离码前缀之一,每个前缀的后缀为0到13位,以指定匹配的后面距离。

还有许多其他变换(可能会压缩,也可能不会压缩)都是在熵编码之后进行的。其中包括Burrows-Wheeler变换(BWT)、通常遵循BWT的移前变换(MTF)、图像的离散余弦变换(可以无损完成,但最常用于有损压缩算法)等。这些变换以可逆的方式将数据中的公共性分组,为熵编码步骤提供更多增益。

 类似资料:
  • 我正在寻找一种好的无损压缩算法,它可以非常快速地压缩/解压缩少量数据,例如0到1之间的256个浮点。我知道RLE,但也许还有更好的。 背景是我正在使用CUDA处理体积数据(例如384³浮点),而不是显式存储体积,我希望将其划分为8x4大小的块并存储压缩块。CUDA内核(每个块由8x8x4个线程组成)解压缩相应的块,对其进行处理并再次压缩。 非常感谢您的建议!

  • 本文向大家介绍有损压缩和无损压缩之间的区别,包括了有损压缩和无损压缩之间的区别的使用技巧和注意事项,需要的朋友参考一下 数据压缩是指将大文件缩小为较小大小的文件并可以再次将其解压缩为大文件的技术。有损压缩会将大文件恢复为原始格式,但会丢失一些数据,这是不明显的,而无损压缩会将大文件恢复为原始格式而不会丢失任何数据。 以下是有损压缩和无损压缩之间的一些重要区别。 序号 键 有损压缩 无损压缩 1 数

  • 本文向大家介绍C#无损压缩图片,包括了C#无损压缩图片的使用技巧和注意事项,需要的朋友参考一下 话不多说,请看代码: 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!

  • 这些是我正在使用的当前论点: 根据:http://www.imagemagick.org/script/command-line-options.php#define 和http://www.w3.org/tr/png-filters.html null 问题: 这是无损压缩吗?如果没有,错在哪里? 知道如何实现更好的无损压缩吗?

  • 我目前正试图为我正在从事的一个项目实现一种无损数据压缩算法。目标是压缩浮点值的固定大小列表。代码必须用C编写,不能使用动态内存分配。这让我很伤心,因为大多数无损算法(如果不是全部的话)都需要一些动态分配。 我一直在研究的两个主要算法是哈夫曼算法和算术算法。如果没有动态内存分配,这个任务可能吗?你们有什么方法或想法吗?如果您认为不可能,请告诉我原因:-) 任何帮助/建议都会有帮助!

  • 问题内容: 在通过网络发送数据包之前压缩数据包的最佳压缩算法是什么?数据包使用JSON编码。LZW会是一个不错的选择吗?还是有更好的选择? 问题答案: 我认为有两个问题会影响您的答案: 1)在不知道程序的任何特定运行情况下会如何预测数据的组成?例如,如果您的数据包如下所示: -那么您可能会通过创建一个不断出现在数据中的文本字符串的硬编码字典来获得最佳压缩,并用适当的字典索引替换每个出现的文本字符串