说我有一个包含文字的文件:
然后我有一个字符串:
I was eating some Apple-bacon when the phoNe rang.
我正试图找到一种快速的方法:
I was eating some *****-***** when the ***** rang.
我基本上试图审查一个聊天框。我只是想知道是否有比迭代矢量更好的方法。我只使用标准库,因此不可能使用boost hashmap。
我正在使用C ++ 98。
答案 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搜索可能是最好的方法。构建字典中所有单词的树,并比较顶部的输入。当看到非字母字母时,重置并从树顶再次开始