【问题标题】:Sorted byte arrays with unique values - maximal possible compression具有唯一值的排序字节数组 - 最大可能压缩
【发布时间】:2018-05-23 00:30:27
【问题描述】:

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

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

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

目前我知道的最佳压缩是使用位域来存储字节是否在数组中,并且我可以省略尾随零。 所以对于一个数组,我将使用ceiling("max value" / 8) B。 对于完整数组(或包含 248 个数组),这将是 32B。

这通常会减小大小,但对于具有 长度

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

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

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

【问题讨论】:

  • 您需要了解,如果不延长一些“压缩”时间,任何压缩过程都无法工作。可以有 2^256 个不同的数组,您可以使用 256 位整数对其进行编号。如果您希望数字短于 256 位,那么您将不足以代表所有可能性。因此,如果某些编码较短,则某些编码必须更长。压缩是关于巧妙地选择哪些数组编码更短,以平均获得真正的压缩。所以你需要知道数组分布的一些性质,比如“偶数多于奇数”、“经常有很大的差距”……

标签: algorithm compression


【解决方案1】:

一种选择可能是:

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

【讨论】:

  • 我可以有标志来确定压缩,而不是比较未压缩的数据、位域方法和您的方法,而不是使用最小长度的方法。看看它是如何分布的会很有趣。生病必须更多地研究这种编码。谢谢!
【解决方案2】:

您可以做的最好的事情是算术压缩,使用一个模型,该模型使下一个符号的概率均匀分布在剩余的未使用字节值上。然后用于每个符号的位数将近似为剩余字节值数量的对数基数 2。加起来大约 68 位。

以一定的压缩成本,您可以使用固定位数的下一个符号来模拟这一点,这是表示剩余符号数的最少位数。对于您给出的示例,您将为前七个值中的每一个使用八位,为其余的每个值使用五位。所以总共 71 位。仍然比 256 位少一点。

根据您如何知道序列的长度或压缩数据的长度,您可能需要保留一个状态来指示序列的结束。因此,如果您恰好是序列中下一个条目的 2 次幂,则需要添加一些内容。那么第一个条目需要是 9 位,第一位为 1 表示一个空序列。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多