高效的is_in(vector <string>&amp; S,string P)函数

时间:2017-04-10 05:54:54

标签: c++ algorithm

给定一组S字符串{S0,S2,S3,...,Sn-1}和字符串P,如何确定函数 bool is_in(string,vector)做了明显的循环。

意思是我不想这样做:

 bool is_in(vector<string>& S, string P)
 {
      for(int i=0; i<S.size(); i++) 
            if(P == S[i]) return true;
      return false; 
 }

理想情况下,我想有一种哈希函数,我可以计算先验。像这样:

 bool is_in(vector<string>& S, string P)
 {
       someHashType h = hash( S );
       if( someFunction( h, S ) return true;
       return false;
 }

注意:

  • S是静态向量(在我的例子中,大小为1000,未排序)
  • P我正在测试的字符串集合的条目S(也是未分类的)(在我的情况下,10M) -
  • 这就是我需要快速的原因。
  • 这不是作业问题 - 而是大型软件的一部分。

2 个答案:

答案 0 :(得分:1)

“我希望这个功能更快”的问题在于它几乎总是会在其他地方涉及一些额外的工作。这可能意味着也可能并不意味着改善是“值得的”。所有这些都取决于您要查找的字符串集合在其余代码中的用途。如果它只是“是这个列表中的单词然后执行X”(例如,对提交消息进行错误的单词检查,其中不得有咒骂词和公司名称),那么我会将向量更改为{{1} }。这有一个O(1)搜索时间,看起来像:

unordered_set

但是这当然会在其他地方产生影响,如果你依赖列表作为向量,那么例如在代码中的其他地方迭代它就会很快,这可能会减慢那部分。

编辑:你有,我接受它,在一个真实的用例中描述你的代码,并发现这个特定的功能需要花费大量的时间。否则,你最好先测量一下。

答案 1 :(得分:0)

最后我找到了我要找的东西:

有一个名为BloomFilter的工具,允许预先计算字符串集合的哈希值。

我围绕位于C++Bloom Filter Library

的代码开发了我的解决方案

代码如下:

  • 将所有字符串插入&#39; bloom&#39;过滤
  • 检查过滤器中是否有给定的字符串。

优点是字符串不需要存储在内存中,就像在set,unordered_set或任何类似的对象中一样。

在我的特定对象中,我有一个包含10M字符串(800MB)的字符串表。 内存中过滤器的大小约为20M,搜索速度非常快。

&#39; Bloom Filter&#39;是一种统计算法,所以它可能有一些误报。 - 但是这个概率非常低(由参数控制)

请注意,没有误报。