KMP算法详解.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
KMP 算法详解 1.如果机房马上要关门了,或者你急着要和 MM 约会,请直接跳到第六个自然段。 2.我 们这里说的 KMP 不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法。KMP 算法是拿来处理 字符串匹配的。换句话说,给你两个字符串,你需要回 答,B 串是否是 A 串的子串(A 串是否包含 B 串)。比 如,字符串 A=Im matrix67 ,字符串B=matrix ,我们就说B 是 A 的子串。你可以委婉地问你的MM :“假如 你要向你喜欢的人表白的话,我的名字是你的告白 语中的子串吗?” 3.解决这类问题,通常我们的方法是枚举从 A 串的什么位置起开始与 B 匹配,然后验证是否匹配。假如 A 串长度为n ,B 串长度为 m ,那么这种方法的复杂度是O (mn) 的。虽然很多时候复杂度达不到mn (验证时只看 头一两个字母就发现不匹配了),但我们有许多“最坏情况”,比如,A= aaaaaaaaaaaaaaaaaaaaaaaaaab , B=aaaaaaaab 。我们将介绍的是一种最坏情况下O(n) 的算法(这里假设 m=n ),即传说中的KMP 算法。 4.之所以叫做 KMP ,是因为这个算法是由 Knuth 、Morris 、Pratt 三个提出来的,取 了这三个人的名字的头 一个字母。这时,或许你突然明白了 AVL 树为什么叫 AVL,或者Bellman-Ford 为什么中间是一杠不是一个点。 有时一个东西有七八个人研究过,那怎么命名呢?通常这个东西干脆就不用人名 字命名了,免得发生争议,比 如“3x+1问题”。扯远了。 5.个人认为 KMP 是最没有必要讲的东西,因为这个东西网上能找到很多资料。但网上 的讲法基本上都涉及 到“移动(shift)”、“Next函数”等概念,这非常容易产生误解(至少一年半前我看这些资料学习 KMP 时就没搞清楚)。 在这 里,我换一种方法来解释 KMP 算法。 6.假如,A=abababaababacb ,B=ababacb,我们来看看 KMP 是怎么工作的。我们用两个指针 i 和 j 分别 表示,A[i-j+ 1..i] 与 B[1..j]完全相等。也就是说,i 是不断增加的,随着 i 的增加j 相应地变化,且 j 满足以 A[i] 结尾的长度为j 的字符串正好匹配B 串的前 j 个字符(j 当然越大越好),现在需要检验A[i+1]和 B[j+1] 的关系。 当A[i+1]=B[j+1]时,i 和j 各加一;什么时候j=m 了,我们就 说 B 是 A 的子串(B 串已经整完了),并且可以根 据这时的 i 值算出匹配的位置。当 A[i+1]B[j+1] ,KMP 的策略是调整j 的位置 (减小j 值)使得 A[i-j+1..i] 与 B[1..j]保持匹配且新的 B[j+1]恰好与 A[i+1]匹配(从而使得i 和j 能继续增加)。{一般情况下是让j 的值减一:j=j -1, 即让B 串向后挪一个位置再判断};我们看一看当 i=j=5时的情况。 i = 1 2 3 4 5 6 7 8 9 …… A = a b a b a b a a b a b … B = a b a b a c b j = 1 2 3 4 5 6 7 此 时,A[6]B[6] 。这表明,此时j 不能等于5了,我们要把j 改成比它小的值j 。j 可能是多少呢?仔细想 一下,我们发现,j 必须 要使得 B[1..j] 中的头j 个字母和末 j 个字母完全相等(这样 j 变成了 j 后才能继续保持 i 和j 的性质)。这个j 当然要越大越好。在这里,B [1..5]=ababa ,头3个字母和末3个字母都是aba。而当新的j 为3时,A[6]恰好和 B[4]相等。于是,i 变成了6,而j 则变成了 4 : i = 1 2 3 4 5 6 7 8 9 …… A = a b a b a b a a b a b … B = a b a b a c b j = 1 2 3 4 5 6 7 从 上面的这个例子,我们可以看到,新的 j 可以取多少与 i 无关,只与 B 串有关。我们完全可以预处理出 这样一个数组 P[j] ,表示当匹配到 B 数组的第 j 个字母而 第 j

文档评论(0)

海川电子书城 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档