具有唯一值的排序字节数组 - 最大可能的压缩

时间:2014-02-26 08:50:09

标签: algorithm compression

我的字节数组有以下约束:

  • 长度介于1到256之间
  • 长度中位数约为128,但我必须在较大的数据集上验证这一点
  • 值按升序排列
  • 值是唯一的

我正在寻找最大可能压缩此数据的算法。 如果数组已满,则最大未压缩大小为256B。中位数为128B。

现在最好的压缩我知道如果byte在数组中是否使用位字段存储,我可以省略尾随零。 因此,对于一个数组,我将使用ceiling("max value" / 8) B。 对于完整数组(或包含248的数组),这将是32B。

这通常会减小大小,但对于稀疏数组来说却很糟糕 长度< 32.如果事实证明未压缩数组小于压缩数据,我可以使用flag来存储压缩或未压缩的数据。

我可以使用其他技巧/优化/压缩来进一步缩小尺寸吗?

消除误解的数据的一个简短示例,请注意此数组比数据中的预期数组短:

{ 0, 1, 5, 7, 88, 105, 233, 234, 235, 255 }

2 个答案:

答案 0 :(得分:3)

一种选择可能是:

  1. 计算连续值之间的差异。这些差异通常是小的正数。
  2. 使用Golomb,Huffman或算术编码对差异进行编码,其中小数字编码的位数少于大数字。

答案 1 :(得分:0)

您可以做的最好的事情是算术压缩,使用的模型具有下一个符号均匀分布在剩余的未使用字节值上的概率。然后,用于每个符号的比特数大约是剩余字节值数量的对数基数2。这相当于大约68位。

在压缩成本方面,你可以用下一个符号的固定位数来模拟这个,这是表示剩余符号数的最小位数。对于您给出的示例,您将为前七个值中的每一个使用八位,并为每个剩余值使用五位。总共71位。还是有点不到256位。

根据您知道序列的长度或压缩数据的长度,您可能需要保留一个状态以指示序列的结束。因此,如果恰好在序列中的下一个条目处以2的幂为正,则需要添加一点。然后第一个条目需要是9位,第一个位为1表示空序列。

正如您所建议的,在此之前您可能有一个初始位,用于确定是使用了此编码还是位图。编码时,你会选择最小的。