【问题标题】:Understanding the Knuth Morris Pratt(KMP) Failure Function了解 Knuth Morris Pratt (KMP) 失效函数
【发布时间】:2013-02-06 20:25:39
【问题描述】:

我一直在阅读Wikipedia article about the Knuth-Morris-Pratt algorithm,我对如何在跳转/部分匹配表中找到这些值感到困惑。

  i  |  0  1  2  3  4  5  6
W[i] |  A  B  C  D  A  B  D
T[i] | -1  0  0  0  0  1  2

如果有人能更清楚地解释捷径规则,因为这句话

“假设我们发现了一个适当的后缀,它是一个适当的前缀,以 W[2] 结尾,长度为 2(可能的最大值)”

令人困惑。如果正确的后缀以 W[2] 结尾,它的大小不是 3 吗?

我也想知道为什么当前缀和后缀大小为 1 时 T[4] 不是 1:A。

感谢您提供的任何帮助。

【问题讨论】:

    标签: string algorithm string-matching knuth-morris-pratt


    【解决方案1】:

    请注意,失效函数 T[i] 不使用 i 作为索引,而是作为长度。因此,T[2] 表示由 W 的前两个字符形成的字符串的最长正确边界(既是前缀又是后缀的字符串)的长度,而不是由以字符结尾的字符串形成的最长正确边界的长度2. 这就是为什么 T[2] 的最大可能值为 2 而不是 3 - 由 W 的前两个字符形成的子字符串的长度不能大于 2。

    使用这种解释,也更容易看出为什么 T[4] 是 0 而不是 1。由 W 的前四个字符形成的 W 的子串是 ABCD,它没有适当的前缀也是适当的后缀。

    希望这会有所帮助!

    【讨论】:

    • 好的,这很有帮助。您能否帮助阐明快捷规则的工作原理?
    • @Shaun- “快捷方式规则”是什么意思?我对 KMP 很熟悉,但以前从未听说过这个术语。
    • 据我了解,它利用 T[i] 的先前值来计算当前值。我想知道它是怎么做到的。
    • @Shaun- 啊,我明白了。我有自己的算法(连同 Python 源代码)可在此处获得:keithschwarz.com/interesting/code/?dir=knuth-morris-pratt。 cmets 给出了如何从失效函数的旧值计算失效函数的推导。如果您有任何问题,请告诉我!
    • 感谢您的链接!如果我有任何问题,我一定会发布。
    【解决方案2】:

    “假设我们发现了一个适当的后缀,它是一个适当的前缀,以 W[2] 结尾,长度为 2(可能的最大值)”

    好的,长度最大可以是2,没错,这就是为什么... 一个事实:“正确”前缀不能是整个字符串,“正确”后缀(如正确子集)也是如此

    Lets, W[0]=A W[1]=A W[2]=A ,即模式是“AAA”,因此,(最大长度)正确的前缀可以是“AA”(从左到右)和,(最大长度)正确的后缀可以是“AA”(从右到左) //是的,前缀和后缀有重叠(中间的“A”)

    因此,值将是 2 而不是 3,只有在前缀不正确的情况下才会是 3。

    【讨论】:

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