【问题标题】:What is best compression algorithm for integers?什么是整数的最佳压缩算法?
【发布时间】:2013-06-21 03:38:36
【问题描述】:

我想要随机数列表的最佳压缩算法。

列表示例:

224.19
225.57
226.09
222.74
222.20
222.11
223.14
540.56
538.96
540.14
540.44
336.45
338.47
340.78
156.73
160.02
158.56
156.23
55.08
56.33
54.88
53.45

我可以跳过小数部分。就像上面给出的示例一样,我有大量数字列表,这就是需要压缩它的原因。

你能推荐一些东西吗?

【问题讨论】:

  • 这些数字看起来一点也不随机。您可以尝试将它们存储在具有基数和要添加到该基数的数字的块中。
  • 好的随机数不能被压缩。
  • @Waqas 为什么要压缩它们?你能解释一下你的问题吗?
  • @Sirko 这些数字以百万计,是的,它们并不是那么随机,但它们确实会发生变化。例如,几百个在 230 到 240 的范围内,下一个模式将是其他一些数字范围等等。
  • @AlexWien 我们有随机数,但它们有模式,例如 (540-545) 有 245 个数字 (230-240) 有 100 个数字 (340-350) 有 400 个数字等等。跨度>

标签: algorithm compression data-compression


【解决方案1】:

不要使用浮点数,如果需要,可以使用带有某种控制字符的整数来表示小数点,但如果可以跳过它,那就更好了。

看看Variable byte encodings。它的优点是您不需要为小整数分配 64 位内存。

如果您的数字彼此之间存在某种依赖关系,您可以查看 Delta encoding - 它存储两个数字之间的差异,而不是数字本身。

可变字节编码和增量编码被谷歌和任何其他与搜索引擎打交道的公司用作压缩倒排列表索引的核心方法。

【讨论】:

  • @XapaJlaMnu 谢谢你的回答。我们已经应用了差分压缩技术并获得了平均 67% 的压缩率,我正在努力对差分压缩数据应用增量编码和可变字节编码。将这些应用于数据后,让我们看看是否有所改善。
【解决方案2】:

如 cmets 所述,您的数字远非随机。

我将首先删除小数点,因为您的所有数字似乎都可以用小数点后两位数来描述。因此,压缩时只需将所有数字乘以 100,解压缩时再除以 100。

其次,我会通过从每个数字中减去最后一个数字来对数字进行增量编码。第一个数字不变。重构是显而易见的。那么你最终得到:

22419, 138, 52, -335, -54, -9, 103, 31742, -160, 118, 30, -20399,
202, 231, -18405, 329, -146, -233, -10115, 125, -145, -143

编码。现在我们正在取得进展。我们通常有小的三角洲,偶尔会有大的跳跃。然后使用可变长度整数对其进行编码。然后,增量的直方图对于构建该代码很有用。一个简单的例子是每字节 7 位,高位是一个表示整数结束的位。比特级别的更复杂的方案可能更优化,具体取决于概率分布。

【讨论】:

    猜你喜欢
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    相关资源
    最近更新 更多