Java 用于数字检索的空间高效概率数据结构

Java 用于数字检索的空间高效概率数据结构,java,algorithm,data-structures,probability,bloom-filter,Java,Algorithm,Data Structures,Probability,Bloom Filter,假设我们有一个算法,它接收假设长的密钥流。然后,当我们处理它时,它为每个关键点生成一个介于0和1之间的值,用于后验检索。输入集足够大,我们无法为每个键存储一个值。值生成规则跨键独立 现在,假设我们可以容忍后验查找中的错误,但我们仍然希望最小化检索到的值与原始值之间的差异(即,在许多随机检索中渐近地) 例如,如果给定键的原始值为0.008,则检索0.06要比检索0.6好得多 我们可以使用什么数据结构或算法来解决这个问题 Bloom过滤器是我能想到的最接近的数据结构。人们可以量化输出范围,对每个桶使

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

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

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

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

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


理想情况下,我正在寻找一种可以参数化空间和错误率之间折衷的解决方案。

可能是Bloom过滤器的一种变体,称为:类似Bloom过滤器,但一般化,因此条目是来自晶格的值。 这里的晶格只是在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,最佳数量取决于表的大小以及放入表中的项目的数量和分布。这篇论文并没有解决我们这里的错误,所以结果可能会有点不同,我将研究一个bit@AmelioVazquez-Reina如果我们想用比条目更多的值来“填充”表,这真的很糟糕,不管d值是多少,它都会很快地达到一个平均误差,这比它对每一项都猜测0.5更糟糕,至少如果值在[0..1]中是一致的。实际上,更高的d甚至更糟,d=1是最好的。因此,这毕竟不是紧凑型近似器的合适用例。。