问题:
我想压缩非固定长度的非负整数数组(但应该是300到400),主要包含0,1,1,2。虽然不太可能,但也有可能有更大的数字。
例如,这是一个包含360个元素的数组:
0,0,0,的 1 下,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,的 1 下,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 1 下,0,0,0,0,0,0, 2 下,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,的 1,1 下,0,0,0,0,0,0, 0,0,的 4 下,0,0,0,0,0,0, 3 下,0,0,0,0,0,0,0,0, 0, 1 下,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0, 2 下,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,的 1 下,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1 下,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1 下,0,0,0,0 ,0,0,0,的 5,2 下,0,0,0, 0,0,0,0,的 1 下,0,0,0,0,0,0,0, 1 下,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,的 1,2,1 下,0,0,0,0,0,0,0,0, 1 下,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0。
目标:
目标是使用字母和数字将这样的数组压缩成尽可能短的编码。理想情况下,例如:sd58x7y
我尝试了什么:
我尝试使用“delta encoding”,并使用零来表示任何高于1的值。例如:{0,0,1,0,0,0, 2 ,0, 1}将表示为:2,3, 0 ,1。要对它进行解码,可以从左到右读取,并写下“2个零,一个,3个零,一个,0个零,一个(这将添加到前一个,因此有两个),1个零,一个”
为了消除分隔符(逗号)的需要,从而节省更多空间,我尝试仅使用一个字母数字字符来表示0到35的delta值(使用0到y),而将字母z保留为“35 PLUS下一个字符“。我认为这被称为“变量位”或类似的东西。例如,如果一行中有40个零,我将其编码为“z5”。
这就是我得到的...结果字符串仍然很长(在上面的例子中它长约20个字符)。理想情况下,我想要8个字符甚至更短的字符。谢谢你的时间;任何帮助或灵感将不胜感激!
答案 0 :(得分:2)
在您的数据中,您有:
14 1s (3.89% of data)
4 2s (1.11%)
1 3s, 4s and 5s (0.28%)
339 0s (94.17%)
假设您的数字彼此不相关且您没有任何其他信息,则数据的总熵为每个数字0.407位,即总共146.4212位(18.3字节)。所以不可能用8个字节进行编码。
答案 1 :(得分:2)
由于您的示例包含长时间的零,因此您的第一步(您已经采用它)可能是使用run-lenth encoding(RLE)来压缩它们。此步骤的输出将是一个整数列表,从行程计数的零开始,然后在该值和非零值之间交替。 (0
的零游程将表示连续的非零值...)
其次,您可以使用一类名为universal codes的方法,以少量位编码整数。这些方法通常使用比较大整数更少的位来压缩小整数,并且还提供编码任何大小的整数的能力(这非常漂亮......)。您可以根据预期的确切分布调整编码以改进压缩。
您可能还想了解JPEG样式编码的工作原理。在DCT和量化之后,JPEG熵编码问题看起来与您的类似。
最后,如果你想进行最大程度的压缩,你可能需要查找arithmetic encoding,它可以任意压缩你的数据,接近统计最小熵。
以上链接解释了如何压缩到原始位流。为了将它们转换为字母和数字字符串,您需要添加另一个编码步骤,将原始位转换为此类字符串。正如一位评论者指出的那样,您可能希望研究base64表示;或者(为了获得最高效率,无论使用哪种字母表),您可以尝试“反向”使用算术压缩。
关于压缩的其他注意事项:“尽可能短的编码”在很大程度上取决于数据源的确切属性。实际上,任何给定的压缩技术都会描述最佳压缩数据类型的统计模型。
此外,一旦根据您期望的数据类型设置编码,如果您尝试在数据上使用它而不是您期望的那种,结果可能是扩展,而不是压缩。您可以通过提供替代的,未压缩的格式来限制此扩展,以便在这种情况下使用...