【问题标题】:Compress shuffled sequence of integers [0, N)压缩打乱的整数序列 [0, N)
【发布时间】:2015-10-01 02:22:25
【问题描述】:

令 A 为整数序列 [1, N),例如,对于 N=5:0,1,2,3,4。 然后让我们随机将其洗牌到 S 中(对于 N=5,它可能是:4,1,3,2,0)。 有没有什么聪明的方法来压缩 S(包含 [0, N) 中的每个整数的随机数组恰好一次)?

我能想到的最好的办法听起来不像是最佳解决方案:维护一个“未使用”整数列表(用 [0, N) 初始化)并使用最小值将每个序列项作为该列表中的索引输出位数(由于未使用的会变小,输出每个索引所需的位数也会减少)。像这样的:

unused = [0, N)
for x in S:
   k = index of x in unused
   nbits = log2(len(unused))
   output k as nbits integer
   remove x from unused

【问题讨论】:

  • @ymonad 谢谢,这很有帮助。我特别喜欢 Antoine Comeau 的交换技巧,它允许在 O(n) 中完成。由于需要更多 64 位的数学运算,因此对于较大的 N 将不会有效。但是,我后来意识到,我可以使用带有缩小模型的算术编解码器(一旦使用符号,概率变为 0)以获得相似的结果。

标签: algorithm compression signal-processing


【解决方案1】:

在您的示例中,有 5 个! = 120 种可能的方式来打乱序列。假设所有 shuffle 的可能性相同,您能做的最好的事情就是将每个 shuffle 编码为 0..119 中的整数。

您可以查看@ymonad 在评论中链接的answer to the question,了解如何做到这一点。

让我们举一个更大的例子,看看你能做多好。假设我们将整数 0..255 随机打乱。存储它的最直接的方法,以及您可能需要它才能使用它的形式,是一个 256 字节的序列。表示 0..256!-1 中的整数所需的位数为 1684 位,即 210.5 字节。所以你能做的最好的事情就是从简单的表示中剔除大约 18% 的位。更长的随机播放给你更少的压缩。在极限情况下,你得到的压缩比大约是 1 - 1 / ln(n),其中 n 是洗牌的唯一项目数。

因此您的里程将受到限制。您可能会考虑不去尝试压缩它。

【讨论】:

  • 是的,我也已经意识到了,但是感谢您的确认,我有点怀疑我的计算是否正确。这个plot 显示了从 16 到 16384 的 N 的 shorts(2 个字节)序列的压缩率。所以平均而言,~1.5 是我可以预期的最好值。绝对不值得努力。
猜你喜欢
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 2011-02-03
  • 2015-08-07
  • 1970-01-01
  • 2012-09-21
相关资源
最近更新 更多