[英]Fast way to check if String contains a word from a dictionary file?
說我有一個文字文件:
然后我有一個字符串:
I was eating some Apple-bacon when the phoNe rang.
我正試圖找到一種快速的方法:
I was eating some *****-***** when the ***** rang.
我基本上試圖審查一個聊天框。 我只是想知道是否有比迭代矢量更好的方法。 我只使用標准庫,因此不可能使用boost hashmap。
我正在使用C ++ 98。
我只是想知道是否有比迭代矢量更好的方法。
在排序向量或std::set
上使用binary_search
以保證O(lg n )查找時間。 lg(2000)= 7.6,理論上速度提高263倍,無論任何常數因素。
(雖然這真的更適合正則表達式。)
如果要審查的字符串很長,您可以嘗試通過僅迭代字符串一次來優化。
使用您正在搜索的單詞列表中的字母構造一棵樹,並編寫一個使用此地圖查找單詞的函數。 設計很復雜,但對於長字符串和許多單詞來搜索可能是最快的。
例:
單詞:Ape,Ace,Apa,By,
樹
A B
/ | |
p c y
/| |
e a e
搜索:
1)迭代通過字符串中的每個字符為頂級字符(A或B)
2)如果發現檢查下一封信是否是第一個孩子。
請注意,對於每個strchr
,無論如何strchr
對字符串中的迭代字符進行迭代,並且因為分支預測而快速,並且應該是regexp的基本實現。
有幾種方法可以加快搜索速度。
如果你已經有了一個單詞向量,那么更簡單的方法之一就是對向量進行排序並進行binary_search
第一次嘗試是將短語標記化並查找地圖或集合中的每個單詞。
但是,如果你有一個必須處理大量消息的服務器,你可以考慮更聰明地實現它。 逐字逐句地遍歷字符串,並在一些更好的數據結構中搜索:
然后用*替換原來的字符。
后綴樹應該非常快,但浪費了很多內存。 散列值可能比集合實現更快,但您必須提出一個聰明的算法。
Trie搜索可能是最好的方法。 構建字典中所有單詞的樹,並比較頂部的輸入。 當看到非字母字母時,重置並再次從樹頂開始
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.