就像标题所说的那样,我试图找到大型常数数组N中存在的M元素。大多数时候,N中没有M的元素存在,所以在M上进行的绝大多数搜索都是浪费时间。
我正在寻找一些方法来创建一个要检查的索引,然后再进行M的全面搜索。类似于我的项目从M的每个元素的前几个字节创建一个位数组,并从我的内容理解,利用位级并行来快速搜索它。我完全不明白这是如何运作的。
那么我可以使用哪些技巧来减少不必要地搜索M的机会?
这是一个主要与语言无关的问题,但为了尽可能完整,我正在使用C ++。
答案 0 :(得分:4)
您可能会想到Bloom filters,它们恰好用于此案例。他们可以给你误报,在这种情况下你必须在真实的桌子上搜索,但在大多数情况下,如果你没有存储该项目,将从一开始就告诉你。
哈希表通常是存储的最佳选择;但如果您的密钥空间远远大于目标数量,那么您将有大量的哈希冲突,您必须检查存储在那里的目标是否真的是您正在寻找的密钥。如果密钥比较昂贵,它很快就会成为一个因素。
答案 1 :(得分:2)
您可以构建一个哈希表,其值为N作为键。
然后你尝试访问哈希[M [i]],如果它返回一个值然后它存在,那就是O(1)(忽略冲突。)
答案 2 :(得分:1)
由于N是静态的,您可以考虑为N创建Perfect Hash函数。这将使您的搜索保证 O(1)时间。
关于算法的CLR书上有一章,上面的维基页面上有你可能会觉得有用的链接。它可能过于复杂,但并且您可能很难找到有用的实现。。请查看Gperf以了解实施情况。
尽管如此,您仍然可以使用通常可用的哈希表,其中包含预期的O(1)。
我想你正在存储一些你想要检索的额外信息,知道它在哪里?你是如何存储的?
在这种情况下,您可能会发现B-Tree非常有用(行业标准数据库通常会使用这些数据库的某些变体),甚至可以作为索引!所以,你搜索,如果你找到它,你有数据/指针。您可以在网上找到许多这些实现。