【发布时间】:2017-03-17 11:21:41
【问题描述】:
来自一个面试问题:
“确定一个单词是否在存储列表中。该列表不适合内存。不允许磁盘访问,用于查找,仅限内存访问。不允许误报,误报正常。”
布隆过滤器正好相反:允许误报,不允许误报。
我的想法:我们不能使用散列函数,因为我们可能会遇到违反“无误报”要求的冲突。即使使用计数布隆过滤器,碰撞仍然会导致误报。 IE。两个字符串产生相同的哈希,所以当第一个被“插入”时,我们查找第二个,它会在那里显示它,尽管它不是。
我认为答案有点复杂,因为我们不能有误报。听起来对吗?
【问题讨论】:
-
开放链式哈希呢?我认为我们应该能够使用它。
-
对于提出的问题,只需将列表的一部分存储在排序数组中也符合要求:)
-
要跳过@twotwotwo的答案,也不存储任何满足要求的东西,总是回答no。
-
我认为
a bit array的答案很有趣:虽然我知道数组可能是什么,但我不知道如何索引它或者它的值是多少该指数的意思。 (对于不大于内存的列表,我可能会第二次开放链式散列(对探测有限制)。如果有足够的公共前缀,即使列表不适合,也可以使用 trie。)