什么时候使用KMP算法好?

时间:2017-02-22 21:38:07

标签: string algorithm substring big-o knuth-morris-pratt

据我所知,KMP算法依赖于辅助数组,前缀类似于后缀。 当上述条件未满足时,它将无效,因为辅助数组中包含全零。 运行时是否为O(m + n)? 如果我是对的,在这种情况下什么是更好的子串算法?

1 个答案:

答案 0 :(得分:2)

要了解KMP何时使用是一个很好的算法,提问“替代方案有什么用途”通常会有所帮助。

KMP具有很好的优势,可以保证最坏情况下的效率。预处理时间始终为O(n),搜索时间始终为O(m)。没有最坏情况的输入,没有不幸的可能性等。如果你在非常大的字符串(大m)内搜索非常长的字符串(大n),与其他算法相比,这可能是非常需要的。幼稚的(在坏情况下可能需要时间Θ(mn)),Rabin-Karp(病理输入可能需要时间Θ(mn)),或Boyer-Moore(最坏情况可以是Θ(mn))。你是对的,在字符串没有很多重叠部分的情况下KMP可能不是那么必要,但事实上你永远不需要担心是否有一个坏的情况,这绝对是一件好事!

KMP还具有很好的属性,可以一次完成处理。如果你知道你将要多次搜索相同的子字符串,你可以进行一次O(n)预处理工作,然后能够及时搜索你想要的任何长度为m的字符串。 (M)。