布隆过滤器的一个经典例子是连字算法。它甚至是关于 Bloom 过滤器的原始论文中给出的示例。
连字符算法被定义为接受输入单词并返回该单词可以被连字符的可能方式。
Bloom 过滤器是否会同时包含连字符和连字符,并且客户端代码会查询过滤器的连字符、连字符、连字符……?
这是原始论文所说的:
对于这种情况,
字典存储在磁盘上,包含所有带有正确连字符的单词,
Bloom 过滤器只包含需要特殊连字符的键,例如也许连字符本身,
布隆过滤器以“可能”或“否”响应。
那么找到一个单词可能的连字符的算法是:
word = "hyphenation"; (or some other word)
x = bloomFilter.probablyContains(word);
if (x == "probably") {
lookupInDictionary(word).getHypenation();
} else {
// x == "no" case
useSimpleRuleBasedHypenation(word);
}
如果 Bloom 过滤器以“可能”响应,则算法必须在字典中读取磁盘。
如果实际上没有特殊规则,布隆过滤器有时会以“可能”响应,在这种情况下,磁盘 I/O 是不必要的。但这没关系,只要不经常发生(误报率很低,例如 1/16)。
布隆过滤器,因为它没有漏报,永远不会响应“否”,因为案例确实有特殊的连字符。