- 1、本文档共32页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
KMP算法amp;AC自动机.ppt
KMP算法 AC自动机 By Cajon Pass 字符串匹配 字符串匹配中的几个概念 模式串:等待被在主串中匹配的串 主串:被模式串匹配的串 字符串匹配:在主串中查找模式串的过程 比如对于主串: aabbcc 与模式串:aa 来说,一般所要进行的匹配是在主串中查找模式串第一次出现的位置,比如模式串:aa 在主串:aabbcc 中第一次出现的位置是1。 字符串匹配的暴力算法 暴力算法的实现 设i指针为主串s第i位置的字符,j指针为模式串p第j位置的字符,最开始i与j均从0开始,当s[i]==p[j]时,i++,j++,主串与模式串开始比较下一位。当s[i]!=p[j]时,j设为0,i设为上一次s[i]==p[j]时i的值加1,即将模式串往后滑动一位,并且模式串与主串的匹配再次从模式串的第0个字符开始,若有哪些信誉好的足球投注网站到模式串即记录下来,若未有哪些信誉好的足球投注网站到模式串,将会在i指针到达主串s末尾时结束程序。 很显然时间复杂度为O(nm) 代码: KMP算法 概述 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。 KMP算法 如何让模式匹配加速 s串:abcdddabcdddabcdddabcdddabcdddaa p串:abcdddabcdddabcdddaa 求p串在s串中第一次出现的位置 第一次匹配: s:abcdddabcdddabcdddabcdddabcdddaap:abcdddabcdddabcdddaa 在蓝色字符处失配,按照暴力算法,我们应该将p串右移一位,从p串的第一个字符开始重新与s串比较,但是我们可以发现,我们并不需要这样比较。 我们可以发现,事实上,p串的绿色与红色部分和红色与橙色部分是相同的,也就是说,对于绿色与红色部分的任意一段字符,它在主串中下一次出现的位置必然是是红色与橙色部分中与之对应的那段字符的位置。 比如说abcddda在主串中下一次出现的位置必然是abcddda 同理abcdddabcddda下一次出现的位置必然是abcdddabcddda 所以我们在进行下一次匹配的时候直接将abcdddabcdddab中的b与失配的那个b继续对比即可,不再需要做无谓的重复计算,而如果失配的位置不在模式串尾部,我们也可以通过当前位置之前字符串的头与尾的相同字符段位置计算出下一次比较的位置。 而如何记录到每一个位置时之前相同的字符段的位置,或是说最大长度(因为必然从头开始,位置与最大长度是同一个值)呢?这时候就需要喜闻乐见的next数组了。 NEXT数组 关于NEXT数组 有了上面的铺垫,我们就可以知道next数组的作用了,它的作用就是记录字符串每一个位置之前的子字符串中头部与尾部相同的字符段的最大长度,换句话说,就是记录到当前位置(不包括当前字符)之前的那一段子字符串头与尾中相同的字符段的最长长度。 如字符串 agctagcagctagctg 的next数组值就为 -1 0 0 0 0 1 2 3 1 2 3 4 5 6 3 4 NEXT数组 如何求解NEXT数组? 现在我们面临着一个实际的问题:如何求一段字符串的NEXT数组值。 其实很简单 对于字符串 agctagcagctagctg 来说 我们指定两个指针i,j。i指定当前求解的next值的位置,j为以i位置前一个字符为尾的子字符串中的next值,换句话说就是以i位置前一个字符为尾的子字符串中头与尾匹配的头部所能到达的最大位置。最开始时i=1,j=0。 现在开始讨论几种情况: 当j==-1时,代表已经找不到长度大于1的字符串循环了,此时就可以将i位置的next值设为0,然后i++,j++,如果存在长度等于1的字符串循环的话,在下一次判断时i+1的值就会为1(这是正确的,因为关于i的next值是i之前(不包括i)的子字符串的最大循环长度) 当t[i]==t[j]时,说明延续了前一个子字符串的对称性,i++,j++,并将next[i]=j,这样子就可以将当前位置为尾(i)的next值赋值进下一个位置(i+1),并且下一次判断也就从(i+1)这个位置开始了。 当t[i]!=t[j]且j!=-1时,说明不可能延续前一个子字符串的对称性,也不一定不存在更小的字符串循环,此时将j=next[j],它的意思就是在当前的对称中继续寻找子对称(因为如果t[i]是某个更小的字符串循环的最后一个字符,那么为了保证它前方字符同样存在对称性,以t[i]为尾的更小的字符串循环必然在当前已经存在的t[
您可能关注的文档
- 2018年建筑证书挂靠行情表、最全2019年挂靠价格.pdf
- 2018新编第7课法兰克王国课件.ppt
- 2018部编人教版三年级上册语文全册教案.pdf
- 23.木兰从军ppt.ppt
- 25化学(师范)本科专业人才培养方案.pdf
- 3.《邓小平爷爷植树》.ppt.ppt
- 4礼仪文明之四:观德之射,君子之争.ppt
- 5G进展及技术专题交流(华为).pdf
- 6.1 储蓄存款和商业银行 PPT课件1.ppt
- 9、史沫特莱的“中国儿子”.ppt
- 艺术疗法行业商业机会挖掘与战略布局策略研究报告.docx
- 智能家庭娱乐系统行业商业机会挖掘与战略布局策略研究报告.docx
- 医疗纠纷预防和处理条例与医疗事故处理条例的思考分享PPT课件.pptx
- 新冀教版(2025)七年级数学下册《6.1 二元一次方程组》习题课件.pptx
- 新冀教版(2025)七年级数学下册精品课件:6.2.3 二元一次方程组的解法代入、加减消元法的综合应用.pptx
- 导演节目行业市场发展趋势及投资咨询报告.docx
- 制作和服培训行业风险投资态势及投融资策略指引报告.docx
- 医疗转诊的行政服务行业消费市场分析.docx
- 文件装订行业市场发展趋势及投资咨询报告.docx
- 在线语言艺术教育行业分析及未来五至十年行业发展报告.docx
文档评论(0)