【发布时间】: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.
【问题讨论】: