【发布时间】: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