什么搜索算法最快失败

时间:2012-11-22 05:02:58

标签: algorithm

给定一个整数,我需要从一个小集合中找到匹配。整数几乎总是在集合中。对于大多数搜索算法,这是最糟糕的情况(耗时最长)。但对于此应用程序,搜索时间将取决于搜索失败的速度。所以我想要一个最好的案例是“找不到”的算法。

这样的事情存在吗?

整数远非随机,是数组索引 - 比如说0..10k(15位)。这些集合将包含0..7个整数,这对于简单的线性搜索来说已经足够了。但几乎在所有情况下都是最糟糕的情况。

我唯一能想到的就是Bloom Filter。它的工作原理如下:定义F(int)=设置位(i和1Fh)(即设置了一位的32位整数)。对于每个集合,我将OR存储在一起的值(每个元素)(一个32位整数,其中n个元素设置了最大n位)。然后搜索将是IF(F(i)AND F(set))> 0然后执行线性搜索。

因此,除非至少一个集合元素具有与测试整数i相同的低5位,否则永远不会执行搜索。可以根据下一个最低的5位添加第二个测试。

更好的想法?

1 个答案:

答案 0 :(得分:0)

我能想象的最快的算法,它会立即成功或失败,是一个巨大的数组0..MaxInt of Boolean,除了True [Array]之外都是False。搜索将是一个简单的数组查找:

Found = Array[Test]  

但是内存足迹是荒谬的。常见的优化是哈希数组。

作为测试,我使用Set Members的位来实现Perfect Hash。函数PHash(int)返回一个整数0..15,它是匹配的数组索引如果存在。然后搜索:

IF Array[PHash(Test)] = Test 
  THEN Found at Index PHash(Test) 
  ELSE Not Found  

对于分析显示这比线性搜索慢,没有人会感到惊讶。 (叹气)

当然,没有一个Hash可以将15位整数减少到不同的4位整数。我使用许多不同的哈希函数。为了产生Set,我发现哪个函数为该Set产生不同的4位哈希值,然后将Set存储为Hash函数指针加上16个元素的数组。每个Array元素都是X或一个Set Member,其中X不在设定范围内。 (未能找到Perfect Hash会抛出一个尚未发生的异常。)这种开销在编译时都不重要,因为它在程序启动时完成了一次。

要在Set中查找Test整数,我调用Set.HashFunction(Test),然后将Test与该Set.Array元素进行比较。最终比较与线性搜索的每个步骤相同。为了更快,哈希函数必须比线性搜索的剩余比较更快。所以这个可以是一个更快的算法,但只适用于足够大的设置大小。

我没有尝试过找到那个尺寸。无论如何,它将取决于每个散列函数的速度。