节省空间的概率数据结构用于数字检索

10
考虑我们有一个算法,接收一条假设很长的键流。随着我们处理每个密钥,它会生成0到1之间的值,以供后续检索。输入集足够大,因此我们无法为每个键存储一个值。生成值的规则在键之间是独立的。
现在假设我们可以容忍后续查找中的误差,但我们仍希望最小化检索值和原始值之间的差异(即渐近地在许多随机检索中)。
例如,如果给定密钥的原始值为0.008,则检索0.06比检索0.6要好得多。
我们可以使用哪些数据结构或算法来解决这个问题?
布隆过滤器是我能想到的最接近的数据结构。可以量化输出范围,为每个桶使用布隆过滤器,然后在检索时以某种方式组合其输出,以估计最可能的值。在我继续这条路并重新发明轮子之前,是否有任何已知的数据结构、算法、理论或实际方法来解决这个问题?
我理想情况下正在寻找一种可以参数化空间和误差率之间权衡的解决方案。

我们可以进行范围分区并编写哈希函数将每个数字映射到特定的范围。根据误差因素,可以控制范围内的值。 - Ankur Shanbhag
1个回答

6
也许是布隆过滤器的变种紧凑逼近器:类似于布隆过滤器,但是将条目泛化为来自格的值。该格只是介于0和1之间的浮点数(它具有比仅仅是格更多的结构,但它满足要求),或者您存储这些数字的方式。
更新将相关条目替换为其和被记住值之间的最大值,查询计算所有相关条目的最小值(以下是示例)。结果只能高估真实值。通过反转排序(交换min和max并初始化为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

抢先一步了。干得好。 - Louis Wasserman
谢谢@harold。非常有帮助。我认为加上一个数字检索的例子就会完美了。你介意加上一个吗? - Amelio Vazquez-Reina
谢谢!阅读原始论文,看起来可以使用d-独立的哈希函数。(即使用“d维,m桶紧凑逼近器”)在我们的情况下,d是否必须等于2?这之间有什么关系? - Amelio Vazquez-Reina
@AmelioVazquez-Reina,它不一定是2,最优数量取决于表的大小以及放入其中的项目的数量和分布。那篇论文没有涉及我们这里所说的错误,因此结果可能会有所不同,我会进行一些调查。 - harold
@AmelioVazquez-Reina,事实证明,如果我们想要用更多的值来“超填”表格,无论d是什么,这都是非常糟糕的,它很快就会达到比仅猜测每个值为0.5更糟糕的平均误差,至少如果值在[0..1]之间是均匀的。实际上,较高的d甚至更糟糕,d=1是最好的。所以结果证明,这并不是紧凑逼近器的正确使用情况。 - harold
谢谢哈罗德,那很有道理。我很想知道你对@LouisWasserman的看法。 - Amelio Vazquez-Reina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接