【问题标题】:Knuth-Morris-Pratt Fail tableKnuth-Morris-Pratt 失败表
【发布时间】:2014-06-09 06:26:32
【问题描述】:

我正在准备考试,并且正在研究 Knuth-Morris-Pratt 算法。考试内容是 Fail 表和 DFA 构造。我了解 DFA 构造,但我并不真正了解如何制作失败表。

如果我有一个模式“abababc”的示例,我该如何构建一个失败表?解决办法是:

失败表:

0 1 2 3 4 5 6 7

0 0 0 1 2 3 4 0

但是我怎么得到呢?没有代码只是解释如何获得它是必要的。

【问题讨论】:

标签: algorithm knuth-morris-pratt


【解决方案1】:

字符串s的失败表中单元格i的值定义如下:取s的子字符串以位置i结束,单元格中的值为字符串的长度此子字符串的最长正确(不是整个字符串)后缀,等于其相同长度的前缀。

让我们以您的示例为例,考虑6 的值。 s 的长度为 6 的子串是 ababab。它有 6 个后缀:bababababbababb 另一方面,它的正确前缀是 ababaabababa、@9876543387@ 和@。现在很容易看出,等于相同长度前缀的后缀是ababab。其中较长的是abab,因此单元格6中的值是它的长度-4

【讨论】:

  • 这是为 DFA 计算不匹配表的唯一方法吗?我认为它的实现将具有 O(n^3) 的复杂性。
  • 有点容易注意到复杂度不超过平方,如果你多考虑一下你会注意到,实际上如果正确实施,算法将具有 O 级的复杂度(n)。
  • 感谢@Ivaylo Strandjev 的澄清。事实上,复杂性是线性的。事实上,我刚刚实现了幻灯片 20 中presentation 中概述的不匹配表。
【解决方案2】:

模式 P = {abababc} P[0] = 'a'。 P[1] = 'b'。 P[2] = 'a'。 P[3] = 'b'。 P[4] = 'a'。 P[5] = 'b'。 P[6] = 'c'。

失败表的目的是识别最大可能的偏移(这样我们就不会错过任何模式匹配,但也不会进行不必要的比较),如果模式字符串的第一个“i”字符匹配并且在第 i+1 个字符处找到中断。

失败表中的数字表示如果模式的第一个 i 字符与文本匹配,则移位后仍有多少字符继续匹配。

令 FailTable 为 FT[]。

FT[1] - 'a' 与文本匹配。在 'b' (P[1]) 处发现中断。我们是否有一个正确的“a”后缀与“a”的正确前缀匹配?答案是否定的。因此移位后仍继续匹配的字符串长度为 0。因此 FT[1] = 0。

FT[2] - 'ab' 与文本匹配。在 'a' (P[2]) 处发现中断。我们是否有一个正确的“ab”后缀与“ab”的正确前缀匹配?答案是否定的。因此移位后仍继续匹配的字符串的长度为 0。因此 FT[2] = 0。

FT[3] - 'aba' 与文本匹配。在 'b' (P[3]) 处发现中断。我们是否有一个正确的后缀 aba 与正确的前缀 aba 相匹配?答案是肯定的('a')。因此移位后仍继续匹配的字符串的长度为 1。因此 FT[3] = 1。

FT[4] - 'abab' 与文本匹配。在 'a' (P[4]) 处发现中断。我们是否有一个正确的“abab”后缀与“abab”的正确前缀匹配?答案是肯定的('ab')。因此,移位后仍继续匹配的字符串长度为 2。因此 FT[4] = 2。

FT[5] - 'ababa' 与文本匹配。在 'b' (P[5]) 处发现中断。我们是否有一个正确的“ababa”后缀与“ababa”的正确前缀相匹配?答案是肯定的('aba')。因此,移位后仍继续匹配的字符串的长度为 3。因此 FT[5] = 3。

FT[6] - 'ababab' 与文本匹配。在 'a' (P[6]) 处发现中断。我们是否有一个正确的“ababab”后缀与“ababab”的正确前缀匹配?答案是肯定的('abab')。因此,移位后仍继续匹配的字符串的长度为 4。因此 FT[6] = 4。

FT[7] - 'abababc' 与文本匹配。完全没有发现中断,Pattern 与文本匹配。我们是否有一个正确的“abababc”后缀与“abababc”的正确前缀相匹配?答案是否定的。因此,移位后仍继续匹配的字符串的长度为 0。因此 FT[7] = 0。

因此最终的数组是 FT = [0,0,1,2,3,4,0]

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2014-02-21
    • 1970-01-01
    • 2014-05-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多