给定一个整数,我需要从一个小集合中找到一个匹配项。整数几乎总是不在集合中。对于大多数搜索算法,这是最坏的情况(花费时间最长)。但是对于这个应用程序,搜索时间将取决于搜索失败的速度。所以我想要一个最好的情况是“找不到”的算法。
这样的事情存在吗?
整数远非随机,是数组索引——比如 0..10k(15 位)。这些集合将包含 0..7 个整数,这对于简单的线性搜索来说是足够少的。但这在几乎所有情况下都是最坏的情况。
我唯一能想到的就是布隆过滤器。它会像这样工作:定义 F(int) = Set Bit (i AND 1Fh)(即,一个 32 位整数,一个位被设置)。对于每个集合,我会将 F(每个元素)的 OR'd 值存储在一起(一个 32 位整数,为 n 个元素设置最大 n 位)。然后搜索将是 IF (F(i) AND F(set))>0 然后执行线性搜索。
因此,除非至少一个集合元素具有与测试整数 i 相同的低 5 位,否则永远不会执行搜索。可以根据下一个最低 5 位添加第二个测试。
有更好的想法吗?