簡體   English   中英

檢查String是否包含字典文件中的單詞的快速方法?

[英]Fast way to check if String contains a word from a dictionary file?

說我有一個文字文件:

  • 蘋果
  • 培根
  • 電話
  • 等等,大約有2000個單詞。

然后我有一個字符串:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM