Sedgewieck的书

时间:2015-09-07 18:11:49

标签: string algorithm search

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

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

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

我的第二个问题是"当i和j指向不匹配的字符(...)时,模式匹配的下一个可能位置从位置i-dfa开始[txt.charAt(i)] [ j]的&#34 ;.对于相同的示例,当i = j = 0时,发生不匹配,然后i-dfa [txt.charAt(i)] [j] = 0。根据该文本,然后模式匹配的下一个可能位置从位置i-dfa [txt.charAt(i)] [j] = 0开始。难道这并不意味着我会永远留在0吗?然后搜索根本没有继续?

谢谢!

enter image description here

enter image description here

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

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

1 个答案:

答案 0 :(得分:0)

你误解了他在说什么。

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

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