KMP算法中next讲解.docx

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
KMP算法中next讲解

KMP算法中next[]函数讲解KMP算法的功能是要在主串S中寻找是否存在子串T。理解这个算法的核心是next[]函数。Next[]函数见下面。由于case1和case3情况比较简单,我们仅对case2进行探讨。case2中做的事情是在子串T中(T[1]~T[j])的范围内找到最大重叠的前缀和后缀。并且要求前缀顶头,后缀顶尾。即前缀从T[1](即P1)开始,后缀到T[j-1](即P(j-1))为止。Next[]函数实现如下。程序1如上所示,j为后缀的指针,k为前缀的指针。当T[j]==T[k]时,继续比较T[j+1]和T[k+1],并且将k赋值给next[j],此时串T[1]~T[j-1]中,最大匹配前后缀的长度为(k-1);若T[j]!=T[k],此时k回溯为next[k]。我们接下来讲解为什么k回溯为next[k],而不是其他值如图1所示,在子串T中求前后缀最大匹配数量。当T[j]!=T[k]时,即T[j]和T[k]不匹配,但同时也说明之前还是匹配的,如图1两个蓝色块A:T[1]~T[k-1]与B:T[j-k+1]~T[j-1]是匹配的。此时可以将T[1]到T[j]看做串S’,将串T[1]到T[k]看做T’,那么问题转变成主串S’和子串T’的匹配问题,正好对应的是KMP问题。如图2所示。串S’代表主串,串T’代表子串,主串和子串比较到第k位的时候发生不匹配,此时在不减少主串指针j的情况下,寻找子串中新的指针位置k’,使得下一次迭代时,直接比较S’[j]和T’[k’]就可以了(如图3所示)。图1图2图3如图3所示,子串T’在位置k发生与S’不匹配时,k回溯到k’位置。由KMP算法思想可知,k’=next[k]。这就又巧妙借用了KMP算法的思想,从比较宏观的角度解释了为什么不匹配时,k回溯为next[k]。如果你觉得上面的解释还不够形象和具体,下面我们再以微观的实例进一步阐释这一问题:为什么是回溯位置k’是next[k],而不是其他的值。当k’=next[k]时,根据next函数的含义,此时代表在串T’[1]到T’[k-1]之间,找到最大重叠的前后缀长度为(k’-1),图4分别用绿色块D和E表示最大匹配的前缀和后缀。由于蓝色块A和块B是匹配的,因此在块B中也存在对应的绿色块F和G,{D、E、F、G}四个绿色块互相都是匹配的,由于这里推断出D和G匹配,因此程序无需再比较(节省计算步骤),那么就可以直接比较S’[j]和T’[k’]了。此时T’[1]对齐S’中的元素S’[j-k’+1]。图4通过上一段的说明,我们知道将k回溯为next[k]是完全可以的,那么k回溯为其他值是否可以呢?接下来我们用反证的方法,先假设可以,推导出矛盾,再推翻。当k回溯为next[k]时,移动子串T’的结果是T’[1]对应S’[j-k’+1](如图4所示)。反证时我们分别考虑T’[1]对应S’中其他值的几种情况:(1) T’[1]移动后对应S’区间位于{S’[1]~S’[j-k+1],如图5区间(a)所示; (2) T’[1]移动后对应S’区间是{S’[j-K+1]~S’[j-k’+1],如图5区间(b)所示;;(3) T’[1]移动后对应S’区间是{S’[j-k’+1]~S’[j],如图5区间(c)所示。下面分别讨论以上三种情况是否成立。图5若T’移动后T’[1]的位置对应在S’区间(a)的位置m,如图6所示。若此种情况可以匹配,则在S’中必然存在一个绿色块Q (S’[m]~S’[j-1])与T’中H(T’[1]~T’[k’-1])匹配。由于S’和T’其实是同一个串,因此S’[1]~S’[k-1]与Q (S’[m]~S’[j-1])相匹配,推断出S’[1]~S’[j-1]串中,存在最长匹配前后缀长度为(k’-1)(或j-m)。而由之前所知,k=next[j],可知S’[1]~S’[j-1]中前后缀最大匹配长度为(k-1)。由于(k’-1) (k-1),超越了已知的前后缀匹配的最大长度(即绿色部分大于蓝色部分),因此假设不成立,T’[1]位置不能位于区间(a)。图6若T’移动后T’[1]的位置对应S’的位置m位于区间(b),如图7所示。此时S’和’对应的匹配部分记为绿色块Q与H,由于S’中前后缀两个蓝色块是匹配的,可以推断出,在蓝色块(S’[1]~S’[k-1])中,存在前后缀匹配的最大长度就是绿色块H,其长度为(j-m),大于先前已经知道的蓝色块中前后缀匹配的最大长度(即图5中的绿色部分,长度为图5中所示的k’-1)。也推出矛盾。假设不成立,T’[1]位置不能位于区间(b)。图7若T’移动后T’[1]的位置对应在S’中位置m位于区间(c)中,如图8所示。我们在此说明当前比较时,T’[1]的位置不能越过区间(b)(c)的交界而进入区间(c),因为这样会遗漏

文档评论(0)

haihang2017 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档