我能想到的最好的事情听起来并不是一个最佳解决方案:维护一个未使用过的"整数(用[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
答案 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 是混洗的唯一项目数。
所以你的里程将是有限的。您可能会考虑不要尝试压缩它。