2014-04-28 73 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