【问题标题】:Space-efficient probabilistic data structures for number retrieval用于数字检索的节省空间的概率数据结构
【发布时间】:2016-02-14 08:36:22
【问题描述】:

假设我们有一个算法可以接收假设的长密钥流。然后它为每个键生成一个介于 0 和 1 之间的值,当我们处理它时,用于后验检索。输入集足够大,我们无法为每个键存储一个值。值生成规则在键之间是独立的。

现在,假设我们可以容忍后验查找中的错误,但我们仍希望最小化检索到的原始值的差异(即在许多随机检索上渐近)。

例如,如果给定键的原始值为 0.008,则检索 0.06 比检索 0.6 好得多。

我们可以使用哪些数据结构或算法来解决这个问题?

布隆过滤器是我能想到的最接近的数据结构。可以量化输出范围,对每个桶使用布隆过滤器,并在检索时以某种方式组合它们的输出以估计最可能的值。在我继续这条道路并重新发明轮子之前,是否有任何已知的数据结构、算法、理论或实践方法来解决这个问题?

理想情况下,我正在寻找一种能够参数化空间和错误率之间权衡的解决方案。

【问题讨论】:

  • 我们可以进行范围划分并编写一个哈希函数将每个数字映射到特定范围。范围内的值可以根据误差因素进行控制。

标签: java algorithm data-structures probability bloom-filter


【解决方案1】:

也许是名为Compact Approximator 的布隆过滤器的一个变体:类似于布隆过滤器,但被泛化,因此条目是来自格子的值。 那个格子在这里只是在 0 和 1 之间浮动(它的结构不仅仅是一个格子,但它满足要求),或者你正在存储这些数字。

更新用它和被记住的值之间的最大值替换相关条目,查询计算所有相关条目的最小值(下面的示例)。结果只能高估真实值。通过颠倒顺序(交换最小值和最大值并初始化为 1 而不是 0),您可以得到低估,同时给出包含真实值的区间。


例如,使用第一个近似值(高估),输入一个数字如下所示:

index1 = hash1(key)
data[index1] = max(data[index1], value);
index2 = hash2(key)
data[index2] = max(data[index2], value);
... etc

得到高估看起来像:

result = 1
index1 = hash1(key)
result = min(data[index1], result);
index2 = hash2(key)
result = min(data[index2], result);
... etc

【讨论】:

  • 打败我。打得好。
  • 谢谢@harold。非常有帮助。我认为一个数字检索的例子会让这个变得完美。您介意添加一个吗?
  • 谢谢!阅读原始论文,看起来可以使用与 d 无关的哈希函数。 (即使用“一个 d 维、m 桶紧凑逼近器”)在我们的例子中 d 必须是 = 2 吗?是什么关系?
  • @AmelioVazquez-Reina 它不必是 2,最佳数量取决于桌子的大小以及放入其中的物品的数量和分布。那篇论文没有解决我们在这里所遇到的错误,所以结果可能有点不同,我会调查一下
  • @AmelioVazquez-Reina 事实证明,如果我们想用比条目更多的值“填充”表格,这真的很糟糕,无论 d 很快达到平均错误比它更糟糕至少在 [0..1] 中的值一致的情况下,对所有内容都猜测为 0.5。实际上更高的 d 甚至更糟,d=1 是最好的。所以事实证明这毕竟不是紧凑逼近器的合适用例..
猜你喜欢
  • 2010-09-26
  • 2020-09-22
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
相关资源
最近更新 更多