【问题标题】:A paragraph of KMP search method in Sedgewieck's bookSedgewick书中的一段KMP搜索方法
【发布时间】:2015-12-03 07:56:24
【问题描述】:

我正在阅读 Sedgewick 和 Wayne 教授的 KMP 搜索方法。有一段描述方法如下,

一旦我们计算了 dfa[][] 数组,我们有子字符串搜索 下一页顶部的方法:当 i 和 j 指向不匹配的字符(测试 a 模式匹配从文本字符串中的位置 i-j+1 开始),然后是下一个可能的 模式匹配的位置从位置 i-dfa[txt.charAt(i)][j] 开始。但是 通过构造,该位置的第一个 dfa[txt.charAt(i)][j] 字符匹配 模式的第一个 dfa[txt.charAt(i)][j] 个字符,所以不需要返回 向上 i 指针:我们可以简单地将 j 设置为 dfa[txt.charAt(i)][j] 并增加 i, 这正是我们在 i 和 j 指向匹配字符时所做的。

我不明白为什么它说“当我和 j 指向不匹配的字符(测试 a 模式匹配从文本字符串中的位置 i-j+1 开始)”。如附图所示(也来自教科书),如果文本是“ABABAC”,而模式是“BBBBBB”,那么它在 i 处不匹配= j = 0,这意味着我们正在测试从文本字符串中的 0 位置开始的模式匹配。如何测试从文本字符串中位置 i-j+1 = 1 开始的模式匹配?

我的第二个问题是“当 i 和 j 指向不匹配的字符(...)时,模式匹配的下一个可能位置是从位置 i-dfa[txt.charAt(i)][j] 开始” .对于同一个例子,当 i=j=0 时,会发生不匹配,则 i-dfa[txt.charAt(i)][j]=0。根据文本,模式匹配的下一个可能位置是从位置 i-dfa[txt.charAt(i)][j]=0 开始。这是否意味着我将永远停留在0?那么搜索就根本不继续了?

谢谢!

重新思考了这一段之后,我认为教授们在这里犯了一个错误。应该是

当 i 和 j 指向不匹配的字符(测试从文本字符串中位置 ij 开始的模式匹配),那么模式匹配的下一个可能位置是从位置 i-dfa[txt.charAt(i) ][j]+1.

【问题讨论】:

    标签: string algorithm search


    【解决方案1】:

    你误解了他在说什么。

    在您发现 txt.charAt(i+j) 和 pat.charAt(j) 不匹配后,您在位置 i-j+1 处测试不匹配。您无需查看 txt.substring(i, i + j + 1) 的第一个字符,因为您已经知道它会导致您找到刚刚发现的不匹配。

    至于您的第二个问题,当您备份指向 i-dfa[txt.charAt(i)][j] 的 i 指针时,在您的示例中,它不会永远存在,因为您忘记了我们处于一个循环中,每次迭代都会将 i 递增 1,因此我们将遍历字符串“ABABAC”,直到找到第一个“B”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 2017-01-11
      相关资源
      最近更新 更多