【问题标题】:Pattern prefix-function computation in Knuth-Morris-Pratt AlgorithmKnuth-Morris-Pratt 算法中的模式前缀函数计算
【发布时间】:2012-03-27 05:44:52
【问题描述】:

在给定模式的前缀函数中是否有可能有这样的东西,

0 0 1 2 3 0 1 2 3 4 5 3 4 5 6 7 0 1 2

在上面的 4 5 之后的前缀函数中是否只有 6 或 0 的可能性?如果在 4 5 之后有可能出现例如 3(小于 5 且大于 0),如上述那样,那么模式应该如何。

我只能想到类似于这个的模式,

a b a b a b a b c a 
0 0 1 2 3 4 5 6 0 1

谢谢。

【问题讨论】:

  • 你坚持用 5 举例吗?我可以向您展示一个 6 后有 3 的示例模式。
  • 我看到你的回答,错了

标签: string algorithm substring knuth-morris-pratt


【解决方案1】:

这是一个示例模式,其中链接 4 在 6 之后失败:

a b c a b c d a b c a b c a
0 0 0 1 2 3 0 1 2 3 4 5 6 4

【讨论】:

  • 我正在使用维基百科文章中定义的失败链接:en.wikipedia.org/wiki/…
  • @AnanthaKrishnan 6 和 7 在您的失败链接中肯定是错误的。剩下的只是解释的问题......
  • @AnanthaKrishnan izomorphius 已经做到了。唯一需要解释的是,您是否像他那样(像您一样)添加了一个额外的 0。这两种方式都可以工作,您只需对故障链接的使用进行稍微不同的编码
  • 为什么你有 1 代表“abcab”序列?不应该是2吗?
  • @AlexeyAlexandrov 实际上我相信上面有不止 1 个错误。我真的不记得我当时在想什么。我将修复失败的链接。谢谢。
【解决方案2】:

您的特定示例是不可能的。当您开始从所需的前缀表构造字符串时,您会得到

0 0 1 2 3 0 1 2 3 4 5 3 4 5 6 7 0 1 2
a b a b a c a b a b a
  1. 第一个符号是任意的,比如a
  2. 第二个符号必须与第一个不同,否则前缀长度为 1
  3. 第三个必须与第一个相同
  4. 第四个必须与第二个相同
  5. 第五个必须与第三个相同
  6. 不能是目前使用的两个符号中的任何一个,a 给出的前缀长度为 1,b 的前缀长度为 4
  7. 第七个必须是第一个
  8. 必须是第二个
  9. 必须是第三个
  10. 必须是第四个
  11. 必须是第五个
  12. a 会给出前缀长度 1,b 会给出 4,c 会给出 6,其他的都是 0

表中与长度为p 的前缀对应的条目给出了该前缀的最宽边框b 的宽度,例如w。下一个条目只能是w+1(如果b 是可扩展的)、0(如果没有前缀匹配),或者比b 的某个边框的宽度大一。

所以如果table[p]包含length-p前缀的最宽边框的宽度(带有table[0] = -1),那么table[p+1]1+table[p]1+table[table[p]]、...、1+table[table[...[table[p]]]] = 1 + table[0] = 0之一.

【讨论】:

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