【问题标题】:How to compress an array of random positive integers in a certain range?如何压缩一定范围内的随机正整数数组?
【发布时间】:2019-04-01 17:16:20
【问题描述】:

我想压缩一个由 0 到 2^15 范围内的大约 10^5 个随机整数组成的数组。整数未排序,我需要无损压缩它们。

我不太关心运行算法所需的计算量和时间,只是希望有更好的压缩比。

有什么建议的算法吗?

【问题讨论】:

  • 如果您的数据真的是随机的,那么您无能为力。
  • 解压呢?您允许完全减压还是仅按需减压?你关心解压的运行时间吗?
  • @YvesDaoust 抱歉回复晚了,需要完全解压但不用担心解压运行时间。
  • 一劳永逸,你需要保持秩序吗?如果不是,一个值的最大重复次数是多少?
  • @YvesDaoust 是的,我需要保留顺序,值分布有点随机,我不认为有一个特定的数字出现很多时间。我做了一些搜索,但似乎没有任何有效的算法可以解决这类问题。

标签: algorithm integer compression


【解决方案1】:

假设您不需要保留原始顺序,而不是传递数字本身,而是传递计数。如果它们具有正态分布,您可以期望每个数字重复 3 或 4 次。每个数字 3 位,我们最多可以数 7。您可以创建一个 2^15 * 3 位的数组,每 3 位设置该数字的计数。为了处理超过 7 个的极端情况,我们还可以发送这些情况的数字列表及其计数。然后您可以读取 3 位数组并使用计数高于 7 的附加信息覆盖。

【讨论】:

  • 如果平均编码长度没有达到至少 15*10⁵ 位,那么你做错了。
  • @MattTimmermans 我错过了为了使用此方法,您不必关心保留数组元素的顺序。如果需要保留订单,您可能是对的,这是平均长度。
  • 那听起来不错。如果您不需要保留顺序,那么它应该正好占用 33549 位——log₂ C(42768,10000)
【解决方案2】:

对于您的确切示例:只需将每个数字编码为 15 位无符号整数并应用位打包。这是最优的,因为您已在 [0, 2^15) 中以均匀随机的方式声明每个整数,并且此分布的香农熵为 15 位。

对于更通用的解决方案,请应用分位数压缩 (https://github.com/mwlon/quantile-compression/)。它利用任何平滑的数据,并在混洗后的数据上进行近乎最佳的压缩。它的工作原理是使用 Huffman 代码对每个整数进行编码,以使其在分布中的粗略范围,然后在该范围内精确偏移。

这些方法在计算上都很便宜,但在这种情况下,更多的计算不会让你走得更远。

【讨论】:

    猜你喜欢
    • 2021-07-20
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 2014-05-08
    • 2016-01-03
    相关资源
    最近更新 更多