压缩整数序列[0,N]

时间:2015-10-01 02:22:25

标签: algorithm compression signal-processing

例如,对于N = 5:0,1,2,3,4,设A是整数的序列[1,N]。 然后让它随机地将其随机混合到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

1 个答案:

答案 0 :(得分:2)

在你的例子中,有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 是混洗的唯一项目数。

所以你的里程将是有限的。您可能会考虑不要尝试压缩它。