KMP算法理解,and优化(待发)
来源:互联网 发布:求数组最大值 编辑:程序博客网 时间:2024/06/05 18:12
以前看kmp算法没有重视,如今发现当时的理解存在一些问题。说kmp算法,先要说一般的匹配算法一般匹配算法就是以keyword的首字母为标记。匹配过程遇到不匹配,标记移动到下一位,重新与文本串匹配。当keyword只有一个字母时,效率是一样的,但当keyword较长,极端情况是keyword自己本身没有重复字母,匹配过程中遇到文本子串与keyword最后一位不匹配时,我们自己心里清楚,完全没必要让标记只移动一位,可以整个移动keyword(length)-1位
当然这种情况我们心里清楚,下一步完全可以直接比较key[0]和text[5]。
我们希望能将比较过的过程尽量不要重复,利用比较过的结果
当比较到 key[j]!= text[i] 时 说明key[0,j-1]==text[i-j,i-1]。
我们最希望的状态是 j直接回到0继续和text比较。
但当出现 key[0,,k]==key[(j-1)-k,j-1],时,且text[i]==key[k],我们必须从i,k处继续比较,以避免忽视这种匹配。
上表中k为2,
k就是key的子串key[0,j-1]中前后缀相等的最大长度。(因为数组下标从0开始,比较的是相等串的后一个字母,恰恰是key[k])。
以abcaba为例
可以理解成j前面有几个元素 j-1=-1
这就是一些kmp算法设置next[0]=-1的原因 0 j=1 a 0 j=2 ab 0 j=3 abc 0 j=4 abca 1 j=5 abcab 2
kmp算法中next[j] 就是key[j]对应的k。next的值可以通过key[]的自我比较来确定,如果已知next[i]=k,即必有key[0,k]==key[i-k,i],则当key[i+1]=key[k+1]时,next[i+1]=k+1;否则找key[0,k]内的重复子串,此时可比较key[next[k]]==key[i+1] (相当于使用已知next[]搜索,跟kmp思想是一样的)。
于是就有kmp算法
//kmp主体,本代码只体现思想,并不考虑应用场景int KMP(Str text,Str key,int next[]){ int i=0,j=0; while(i<text.length && j<key.length) { if(text.ch[i]==key.ch[j]) {++i;++j;} else { j=next[j]; if(j==0)++i; } } if(j>=key.length) return i-key.length;//若继续搜索可以把结果先存入数组 else return -1;}//生成next数组void getnext(Str key,int next[]){ int i=1,k=0; next[0]=0;//初始化 next[1]=0; while(i<key.length) { if(key[i]==key[k]) { next[++i]=++k;//next[i+1]=k+1 } else k=next[k];//回溯对比key[next[k]]?=key[i] }}
- KMP算法理解,and优化(待发)
- KMP算法及其优化
- KMP算法优化
- KMP算法的优化
- KMP算法及其优化
- kmp算法的优化
- KMP算法理解
- 深入理解KMP算法
- KMP算法的理解
- 理解KMP算法
- KMP算法初步理解
- 从头到尾理解KMP算法
- 从头到尾理解KMP算法
- KMP算法的理解
- KMP算法理解
- KMP算法---理解
- 从头到尾理解KMP算法
- 对KMP算法理解
- HDOJ 1003-Max Sum【DP】
- Objective-c打僵尸小游戏练习源码
- 每个程序员都应该知道的福利
- android M权限问题
- jlink调试stm32,debug时读取内存值
- KMP算法理解,and优化(待发)
- MacBook pro 13寸2011年换SSD
- hdu 2192 MagicBuilding
- express 构建 myapp
- 使用keepalived来实现nginx的高可用
- 开发过程中待解决的问题
- 中级JavaScript例子, 如何实现一个简单实用的模板套用机制, GXTemplate , 第一章(估计要写9章)
- android studio如何与TortoiesSVN客户端绑定
- cocospod 安装和使用(汇总)