检查String是否包含字典文件中的单词的快速方法?

时间:2012-01-03 15:55:09

标签: c++ algorithm

说我有一个包含文字的文件:

  • 苹果
  • 培根
  • 电话
  • 等等,大约有2000个单词。

然后我有一个字符串:

I was eating some Apple-bacon when the phoNe rang.

我正试图找到一种快速的方法:

I was eating some *****-***** when the ***** rang.

我基本上试图审查一个聊天框。我只是想知道是否有比迭代矢量更好的方法。我只使用标准库,因此不可能使用boost hashmap。

我正在使用C ++ 98。

5 个答案:

答案 0 :(得分:6)

  

我只是想知道是否有比迭代矢量更好的方法。

在已排序的向量上使用binary_search或在std::set上使用保证的O(lg n )查找时间。 lg(2000)= 7.6,理论上速度提高263倍,无视任何常数因素。

(虽然这真的更适合正则表达式。)

答案 1 :(得分:2)

如果要审查的字符串很长,您可以尝试通过仅迭代字符串一次来优化 使用您正在搜索的单词列表中的字母构造一棵树,并编写一个使用此地图查找单词的函数。设计很复杂,但对于长字符串和许多单词来搜索可能是最快的。

示例:

单词:Ape,Ace,Apa,By,

       A     B
    /  |     |
    p  c     y
   /|  |
  e a  e

搜索:

1)通过字符串中的每个字符迭代顶层字符(A或B) 2)如果发现,检查下一封信是否是第一个孩子。

请注意,对于每个strchr,无论如何都要在字符串中迭代字符,并且由于branch prediction而快速,并且应该是regexp的原始实现。

答案 2 :(得分:1)

有几种方法可以加快搜索速度 如果你已经有一个单词的向量,一个更简单的方法是sort向量并执行binary_search

答案 3 :(得分:0)

第一次尝试是对短语进行标记并查找地图中的每个单词或set

但是,如果你有一台必须处理大量消息的服务器,你可以考虑更聪明地实现它。逐字逐句地遍历字符串,并在一些更好的数据结构中搜索:

  • 所有单词的后缀树,或
  • 所有单词的哈希值

然后用*。

替换原来的字符

后缀树应该非常快,但浪费了大量内存。哈希值可能比集合实现更快,但你必须提出一个聪明的算法。

答案 4 :(得分:0)

Trie搜索可能是最好的方法。构建字典中所有单词的树,并比较顶部的输入。当看到非字母字母时,重置并从树顶再次开始