【问题标题】:Is KMP Algorithm's jumps error-prone?KMP 算法的跳转容易出错吗?
【发布时间】:2017-06-08 03:54:57
【问题描述】:

让我们考虑一个例子: 文本 = "AABCAABDCAAB", 模式 = "AABCAAB"

在本例中,模式将匹配索引 = 0
AABCAABDCAAB
AABCAAB

根据KMP算法,当j=pattern length时,我们找到了一个匹配并重置j = lps[pattern length - 1] = 3,这意味着pattern[j] = 'C'

算法实现了跳跃:
AABCAABDCAAB
_____AABCAAB

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

AABCAABDCAAB
__AABCAAB
...

在这种情况下是否可以忽略一些匹配项?

【问题讨论】:

    标签: algorithm


    【解决方案1】:

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

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

    (我注意到 KMP 算法通常被描述和证明不是对模式进行不规则移动,而是沿着要搜索的文本有规律地步进并计算出到目前为止匹配了多少个模式字符。因为有是使用我们知道它适用于所有情况的算法视图的证明)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多