KMP算法的跳转是否容易出错?

时间:2017-06-08 03:54:58

标签: algorithm

让我们考虑一个例子: text =" AABCAABDCAAB", pattern =" AABCAAB"

在此示例中,模式将匹配index = 0
AABCAAB DCAAB
AABCAAB

根据KMP算法,当j =模式长度时,我们发现匹配并重置j = lps [模式长度-1] = 3,这意味着模式[j] =' C'

算法跳了一下:
AABCAAB的 d CAAB
_____ AAB C AAB

不考虑跳跃之间的情况,例如:
AABCAABDCAAB
_AABCAAB

AABCAABDCAAB
__AABCAAB
...

在这种情况下可以忽略一些比赛吗?

1 个答案:

答案 0 :(得分:2)

证明KMP算法在所有情况下都能正常工作。它背后的主要思想是,如果你匹配了模式的前k个字符,你就知道文本的k个字符,因为它们完全匹配那些k个字符。计算移位表,以便在匹配k个字符时使用的移位尽可能安全地使用,只要知道这些k个字符。

在您的示例中,您刚刚匹配AABCAAB,因此您知道文本是AABCAAB。您刚刚匹配的模式中只有一个C,因此您必须将模式移动到足以使得用于匹配的C在下一次尝试匹配时不与模式的任何部分重叠,这种情况为您提供下一次尝试的匹配位置。

(我注意到KMP算法通常被描述并证明不是模式的不规则变化,而是沿着要搜索的文本定期踩踏,并计算到目前为止已经匹配了多少个模式的字符。因为那里是使用该算法视图的证据,我们知道它适用于所有情况。)