Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 将整数数组编码为短字符串_Algorithm_Compression - Fatal编程技术网

Algorithm 将整数数组编码为短字符串

Algorithm 将整数数组编码为短字符串,algorithm,compression,Algorithm,Compression,问题: 我想压缩一个长度不固定的非负整数数组(但应该是300到400),其中大部分包含0、一些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,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,

问题:

我想压缩一个长度不固定的非负整数数组(但应该是300到400),其中大部分包含0、一些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,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,1,1,0,0,0,0,0,0,0, 0,0,4,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,5,2,0,0,0, 0,0,0,0,1,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,1,2,1,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

目标:

目标是将这样的数组压缩为使用字母和数字的尽可能短的编码。理想情况下,类似于:sd58x7y

我所尝试的:

我尝试使用“增量编码”,并使用零表示任何大于1的值。例如:{0,0,1,0,0,0,2,0,1}将被表示为:2,3,0,1。要解码它,人们会从左到右读取,并写下“2个零,1,3个零,1,0个零,1(这将添加到前一个,因此有一个2),1个零,1”

为了消除分隔符(逗号)的需要,从而节省更多的空间,我尝试只使用一个字母数字字符来表示0到35的增量值(使用0到y),同时将字母z保留为“35加上下一个字符”。我认为这就是所谓的“可变位”或类似的东西。例如,如果一行中有40个零,我会将其编码为“z5”

就我所知。。。结果字符串仍然很长(在上面的示例中大约有20个字符长)。理想情况下,我想要8个字符或更短的字符。谢谢你的时间;任何帮助或灵感都将不胜感激

在您的数据中,您有:

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个字节进行编码。

在您的数据中:

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个字节进行编码。

因为您的示例包含大量的零,所以您的第一步(看起来您已经采取了)可能是使用(RLE)压缩它们。此步骤的输出将是一个整数列表,从零的运行长度计数开始,然后在该值和非零值之间交替。(零运行长度
0
表示连续的非零值…)

其次,您可以使用一类称为的方法,将整数编码为少量位。这些方法通常使用比大整数更少的比特数压缩小整数,并且还提供了对任何大小的整数进行编码的能力(这非常漂亮…)。您可以根据预期的确切分布调整编码以改进压缩

您可能还想了解样式编码是如何工作的。经过DCT和量化后,JPEG熵编码问题似乎与您的类似

最后,如果您想进行最大压缩,您可能需要查找,它可以将数据压缩到任意接近统计最小熵的程度


上面的链接解释了如何压缩为原始比特流。为了将它们转换为字母和数字字符串,您需要添加另一个编码步骤,将原始位转换为这样的字符串。正如一位评论者所指出的,你可能想研究表现;或者(为了最大限度地提高可用字母表的效率),您可以尝试“反向”使用算术压缩

关于一般压缩的附加说明:“尽可能短的编码”在很大程度上取决于数据源的确切属性。实际上,任何给定的压缩技术都描述了其压缩效果最好的数据类型的统计模型


此外,一旦您根据您期望的数据类型设置了编码,如果您尝试在与您期望的数据类型不同的数据上使用它,结果可能是扩展,而不是压缩。您可以通过提供一种可供选择的未压缩格式来限制这种扩展,以便在这种情况下使用…

由于您的示例中包含大量的零,因此您的第一步(看起来您已经采取了)可能是使用(RLE)压缩它们。此步骤的输出将是一个整数列表,从零的运行长度计数开始,然后在该值和非零值之间交替。(零运行长度
0
表示连续的非零值…)

其次,您可以使用一类称为的方法,将整数编码为少量位。这些方法通常使用比大整数更少的比特数压缩小整数,并且还提供了对任何大小的整数进行编码的能力(这非常漂亮…)。您可以调整编码以改进压缩