存储精确集合成员资格的最有效方法?

时间:2017-11-15 17:03:10

标签: algorithm serialization set membership

我有N个广告位。占用M个广告位。

我希望能够准确地告诉 每个插槽是否已被占用。 (请不要使用Bloom过滤器答案。)

M << N存储此信息的绝对最大存储空间有效方式是什么?

  • 猜0:N位的位图。
  • 猜1:被占用的位置的数组。小M合理的好。
  • 猜2:p0 + (M-1)p1 + (M-1)(M-2)p2 + ...其中pX是剩余未占用的插槽中占用插槽的位置。这比猜测1更有效,因为当插槽被填满时,未占用插槽的选择变窄。

猜猜2仍然有很多浪费;它包括填充槽的顺序,这是不需要的信息。

哪种方法比猜猜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,并按如下方式对序列中的每个值进行编码:

  1. 而δ> 2 k ,发送1位并从δ减去2 k

  2. 现在δ可以用 k 位写入。发送0后跟 k 位值δ

  3. 我们可以选择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)。 (我们还必须发送参数kM,因此会产生一些开销。)

    现在,让我们考虑一下最佳传输大小。有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执行的次数远远少于最大次数。)