Knuth-Morris-Pratt(KMP)搜索算法和Boyer-Moore(BM)搜索算法有哪些主要区别?
我知道KMP在X中搜索Y,试图在Y中定义一个模式,并将该模式保存在向量中。我也知道BM对于像DNA(ACTG)这样的小词更有效。
它们的工作方式有什么主要区别?哪一个更快?哪一个占用计算机资源较少?在哪些情况下使用哪个更好?
Knuth-Morris-Pratt(KMP)搜索算法和Boyer-Moore(BM)搜索算法有哪些主要区别?
我知道KMP在X中搜索Y,试图在Y中定义一个模式,并将该模式保存在向量中。我也知道BM对于像DNA(ACTG)这样的小词更有效。
它们的工作方式有什么主要区别?哪一个更快?哪一个占用计算机资源较少?在哪些情况下使用哪个更好?
简单来说,Boyer-Moore算法是从模式串的末尾开始匹配,通过假设如果在末尾没有匹配,则不需要在开头进行匹配。因此,这种算法可实现“大跨步”,因此适用于搜索类似于“自然文本”(例如英语)的文本。
Knuth-Morris-Pratt算法通过观察当出现不匹配时,可以利用“单词”W本身所包含的足够信息来确定下一个匹配位置,从而避免重新检查先前已匹配的字符。 (来源: 维基百科)
这意味着KMP算法更适用于小集合,例如DNA(ACTG)。
Moore的德克萨斯大学网页详细介绍了Knuth-Morris-Pratt和Boyer-Moore算法(他还提供了各种技术来源):
根据Moore自己的说法,
经典的Boyer-Moore算法在小字母表(如DNA)上的效率不高。由于子字符串经常重新出现,跳过的距离往往随着模式长度停止增长。通过记住已匹配的更多内容,可以在文本中获得更大的跳过。甚至可以安排“完美的记忆”,从而最多只查看每个字符一次,而Boyer-Moore算法虽然是线性的,但可能会多次检查来自文本的字符。其他人已经在文献中探讨过更多记忆的想法。它需要非常大的表或状态机。
然而,已经有一些修改的BM算法使小字母表搜索成为可能。
Boyer-Moore技术从右到左匹配字符,适用于长模式。Knuth Morris Pratt技术从左到右匹配字符,适用于短模式,并且速度较快。