给定一组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;
}
注意:
答案 0 :(得分:1)
“我希望这个功能更快”的问题在于它几乎总是会在其他地方涉及一些额外的工作。这可能意味着也可能并不意味着改善是“值得的”。所有这些都取决于您要查找的字符串集合在其余代码中的用途。如果它只是“是这个列表中的单词然后执行X”(例如,对提交消息进行错误的单词检查,其中不得有咒骂词和公司名称),那么我会将向量更改为{{1} }。这有一个O(1)搜索时间,看起来像:
unordered_set
但是这当然会在其他地方产生影响,如果你依赖列表作为向量,那么例如在代码中的其他地方迭代它就会很快,这可能会减慢那部分。
编辑:你有,我接受它,在一个真实的用例中描述你的代码,并发现这个特定的功能需要花费大量的时间。否则,你最好先测量一下。
答案 1 :(得分:0)
最后我找到了我要找的东西:
有一个名为BloomFilter的工具,允许预先计算字符串集合的哈希值。
的代码开发了我的解决方案代码如下:
优点是字符串不需要存储在内存中,就像在set,unordered_set或任何类似的对象中一样。
在我的特定对象中,我有一个包含10M字符串(800MB)的字符串表。 内存中过滤器的大小约为20M,搜索速度非常快。
&#39; Bloom Filter&#39;是一种统计算法,所以它可能有一些误报。 - 但是这个概率非常低(由参数控制)
请注意,没有误报。