我有N
个广告位。占用M
个广告位。
我希望能够准确地告诉 每个插槽是否已被占用。 (请不要使用Bloom过滤器答案。)
为M << N
存储此信息的绝对最大存储空间有效方式是什么?
N
位的位图。M
合理的好。p0 + (M-1)p1 + (M-1)(M-2)p2 + ...
其中pX是剩余未占用的插槽中占用插槽的位置。这比猜测1更有效,因为当插槽被填满时,未占用插槽的选择变窄。猜猜2仍然有很多浪费;它包括填充槽的顺序,这是不需要的信息。
哪种方法比猜猜2更有效?
答案 0 :(得分:2)
如果已知M和N,那么实现最佳压缩的一种方法是存储index of the combination。
有dom-bind
个方法可以选择要填充的M个插槽,因此您始终需要至少t= N!/((N-M)!*M!)
个位来表示此信息。
存储组合索引允许您使用log2(t)
位。
答案 1 :(得分:1)
假设没有关于值分布的其他信息(即,M值的每个可能样本同样可能),那么最佳压缩技术是given by @PeterdeRivaz,这是简单地使用序数从可能的样本集中列举样本。
但是,计算起来并不容易,因为枚举需要对非常大的数字进行算术运算。
相反,可以在Golomb压缩上使用变体,对压缩比的影响很小。
假设样本中的数字是有序的。我们首先计算连续的差异。因为我们永远不会有两个相等的数字,差异的顺序将永远不会包含0;为了获得一个微小的额外压缩,我们从样本的第一个元素开始,而不是第一个元素本身 - 这意味着序列永远不包含0 - 然后从每个值中减去一个。我们现在选择一些方便的位数k
,并按如下方式对序列中的每个值进行编码:
而δ> 2 k ,发送1
位并从δ减去2 k
现在δ可以用 k 位写入。发送0
后跟 k 位值δ
我们可以选择k
作为⌊log2(N/M)⌋
,这意味着N < 2k+1M
。 (取上限是另一种可能性。)因此,上述算法中步骤1的所有迭代中发送的1
位数小于2M
(因为每个1
占该系列累积和的2 k ,小于N)。每个步骤2都准确地发送k + 1
位,并且步骤2的执行完全M
,每个值对应于样本中的每个值。因此,发送的总比特数介于M × (k + 1)
和M × (k + 2)
之间。但由于我们知道k < log2(N/M) + 1
,传输的总大小肯定小于M log2 N - M log2 M + 3M)
。 (我们还必须发送参数k
和M
,因此会产生一些开销。)
现在,让我们考虑一下最佳传输大小。有N choose M
个可能的样本,因此枚举索引的大小(以位为单位)将为log2(N choose M)
。如果N»M,我们可以将N choose M
估算为NM/M!
,然后使用Stirling's approximation得到:
log(N choose M) ≈ M log N − M log M + M
(这实际上是一种轻微的高估,但它是渐近正确的。)
因此,压缩序列和信息理论极限之间的差异小于每个值2比特。 (实际上,每个值通常约为一位,因为步骤1执行的次数远远少于最大次数。)