2014-04-28 70 views
13

我已經使用以下字母表生成了一個字符串。 {A,C,G,T}。而我的字符串包含超過10000個字符。我正在尋找下面的模式。何時使用Rabin-Karp或KMP算法?

  • ATGGA
  • TGGAC
  • CCGT

我已要求使用字符串匹配算法具有O(m+n)運行時間。

m = pattern length 
n = text length 

KMP and Rabin-Karp algorithms都有這個運行時間。在這種情況下什麼是最合適的算法(在Rabin-Carp和KMP之間)?

+0

如果您已經有一個或兩個執行一些代碼,你可能還需要張貼此在codereview.stackexchange.com –

+0

感謝您的快速反應。我已經發展到產生字符串。我想驗證要使用的算法是什麼。然後,只有我能繼續發展 – Sukeshini

+0

拉賓,卡普是'O(N * M)'(最壞情況)。 –

回答

14

當你想搜索的多模式tipically正確的選擇是使用Aho-Corasick這是有點KMP的推廣。現在在你的情況下,你只是在尋找3種模式,所以KMP的速度可能不會太慢​​(最多三次),但這是一般的方法。

拉賓,卡普更容易實現,如果我們假設碰撞永遠不會發生,但如果你有這個問題是一個典型的字符串搜索KMP會更加穩定,無論你有什麼輸入。然而,拉賓卡普有許多其他應用程序,其中KMP不是一種選擇。

+0

那麼KMP應該被用來解決上述問題? – Sukeshini

+5

在這種特殊情況下你的字符串是非常小的,所以你可以計算出完美的散列,避免衝突(與算法稍作修改)。因此我認爲這兩種方法都可行。如果搜索模式可能變得更長,這是不可能的。我的答案旨在解釋類似問題的一般邏輯。對於這個問題,我認爲這兩種方法同樣好。也許你可以基準這兩個解決方案,並選擇更好的表現? –

+0

Ivaylo Strandjev:+1爲清楚的解釋。非常感謝 – Sukeshini