2011-02-14 29 views
3

我有幾百萬字符串X,每個字符串少於20個單詞。我也有一個數列候選子串C的列表,對於X中的每個x,我想看看C中是否有任何包含在x中的字符串。現在我正在使用一個天真的雙循環,但它已經有一段時間了,它還沒有完成...有什麼建議嗎?如果任何人知道一個很好的實現,我使用python,但任何語言或一般算法的鏈接也會很好。用於測試多個字符串中的多重子字符串的算法

+0

嘗試使用散列。 – ruslik 2011-02-14 16:10:41

回答

4

將其中一組字符串編碼爲trie(我建議使用更大的集合)。查找時間應該比不完美的散列更快,並且您也會節省一些內存。

1

這將是一個 while。你必須對數千個候選子串中的每一個檢查數百萬個字符串中的每一個,這意味着你將會進行(幾百萬*幾千個)字符串比較。是的,這需要一段時間。

如果這是你只打算做一次或偶爾做的事情,我會建議使用fgrep。如果這是你經常要做的事情,那麼你需要考慮實施諸如Aho-Corasick string matching算法。

0

如果您在X X只包含文字,你只想匹配的話,你可以做到以下幾點:

插入關鍵字,一組,這使得訪問日誌(N),然後檢查x中的每個單詞如果包含在該集合中。

,如:

keywords = set(['bla', 'fubar']) 
for w in [x.split(' ') for x in X]: 
    if w in keywords: 
     pass # do what you need to do 

一個很好的選擇是使用谷歌RE2庫,使用超好看的自動機理論產生有效的匹配。 (http://code.google.com/p/re2/)

編輯:請確保您使用適當的緩衝和某種編譯語言,使它快得多。如果它少於幾GB,它應該與Python一起工作。

0

,你可以嘗試使用正則表達式

subs=re.compile('|'.join(C)) 
for x in X: 
    if subs.search(x): 
     print 'found' 
相關問題