- 1、本文档共2页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
KMP算法详解(NEXT数组修正的补充)
程序没有使用一个数组来保存未修正时的NEXT值而直接用J来充当这个功能但是J是由NEXT(已修正)得来的那么有没有可能J得不到正确的值?
这个问题最先是我自己想的后来验证了一下J一定能够得到正确的值下面我们来分析一下
下标 0 1 2 3 4 5 6 7 8 910111213
目标串
0 1
0
0
1
0
1
0
1
0
0
0
01
j(未修正的next)
-10
0
1
1
2
3
2
3
2
3
4
1 1
修正了的next -10-1 1 0-1 3-13-1 0 4 1 0
让我们看看但模式串比较到了12位的时候(下标为11)next[11]=4;next[4]=0;j|4=1...
这时候next[4]拿到的并不是正确的J值!!
这会导致什么?会导致略过一个比较即p[11]与p[1]的比较被略过!直接比较了p[11]与p[0]!
是否可以略过这个比较?!答案是肯定的.
根据逻辑推理如果p[11]与p[4]不等而p[4]=p[1]那么p[11]与p[1]一定不等所以可以略过这样说似乎很牵强我们再回想一下NEXT数组的意义即当我们比较到i位时不等应该由哪一位重新开始比较而实际上这个过程相当于在7-11的这个串中查找0-3!所以根据NEXT数组的意义我们也可以知道这里并不会导致错误由于被略去的比较一定不需比较因此J始终可以得到正确的未修正的NEXT值!
看这个例子:
p=aaaba ,t=aaabbaaaaaaaba
a a a b b a a a a a a a b a
a a ab a
a a a b a
(第一次)
(第二次)
...............
a
a
a b a(成功匹配)
1.为什么要进行修正? 我们把next数组比喻成第一次比较. 在第一次比较中,比较失败的是第4个字符a,这表明前4个字符是成功的!而p中的b的前3个字符并没有出现b,也就是说在下一趟比较中,至少应该将p向右移动4个字符;因此得到了未修正的next值=4.2.而实际上,p的头个字符与最后一个字符是一样的(a).也就是说如果按照上面所说的4进
行移位,再从p的头个字符开始比较同样肯定是不等的(将会出现下面的情况)
a a a b b a a a a a a a b a
a a ab a (第一次)
a a a b a (这次第一个字符a 和第一次比较最后一个字符是一样的,因此移4位肯定也不等)
得出结论是:应该将p向右移动五位.再从p的头个字符进行比较.
3.所以说对于某个字符串,在算出next[i]的值后,不一定会得到最快速的移动位数).拿上面的例子说,第2次其实移4和5位其实最后都能比较出正确答案.但移5位最好(得到休整值最好).
文档评论(0)