找到集合成员资格的有效方法

时间:2014-10-29 17:03:10

标签: performance algorithm set time-complexity bitstring

我正在使用2 ^ n向量,例如n = 3可能的值是:

000,001,010,011,100,101,110,111

我想找到最有效的方法,给定一组组合说

<000> 000,000,1001,100,000,110,000,110

如何查找给定值是否在可能的集合中。

一种方法是浏览整个列表(蛮力)。另一种方法是使用任何经典搜索方法,例如log_2(n)+1的二进制搜索等

另一种方法是使用Bloom过滤器,尽管这是一种概率方法

我想知道是否有其他任何东西,给定一个位串列表,以有效地测试其成员资格。

2 个答案:

答案 0 :(得分:0)

任何数据结构都可行。无论您的本地词典结构是什么,我都可以使用,因为这样做很简单并且是经过良好测试的代码。通常这是一个哈希,虽然它经常被称为字典,HashMap或std :: unordered_map。有时它是二叉树。 hash(Perl),字典(Python),HashMap。

如果我要为这个问题推出一个“完美的数据结构”,我可能想要一个特里的变体。但是从中获得的最大胜利是一个相当小的因素加速,所以为什么要打扰,除非我知道它是需要的?

答案 1 :(得分:0)

某种类型的基于散列的集合(例如Java中的HashSet)将以分摊的常量时间进行插入和查找,这是您将获得的最佳渐近项。

如果你真的想把船推开,并且该组将是密集的(即,预期存在可能的比特串的相当比例),则将它们转换为整数并使用位域。这也是恒定时间,但速度更快。