【给数学不好的人的KMP】字符匹配教程(二)简化运算是为了什么如何移位
来源:互联网 发布:华泰证券软件下载 编辑:程序博客网 时间:2024/06/11 20:36
昨天我们花了那么长的时间,基本搞明白了next数组的作用。我们费尽全力,只为了把上文中的else条件进行更改,即:不更新i,只移动j,从而达到节省时间,把效率从O(mn)降到O(M+N)的水平。
为什么可以略过去的最大位移等于next对应的值呢?
举个例子:
s=abacaba
p=abab,有s[3]!=p[3],如果是BF的话:i=3-3+1=1,j=0;
但是我们可以发现一个规律,因p[0]≠p[1],s[1]=p[1],必有s[1]≠p[0],又因p0=p2,s2=p2,所以必有s2=p0。因此,第二次匹配可直接从i=3, j=1开始。 这就是next数组移位的原理。
下面给出一个能用的模板:
int KMP_Find(string s,string t,int pos) //pos从0开始,输出绝对位置要加1 {build_next(t);int i=pos;int j=0;for(i=pos;i<s.size();i++){while(j>0 && s[i]!=t[j]){j=next[j-1];}if(s[i]==t[j]){j++;}else{j=0;}if(j>=t.size()) //目标串匹配结束 {return i-t.size()+1;}}return -1;}
kmp本身还有一些其他的形式,同样的,他的一个余数的性质可以用来求重复数等。与此衍生的还有bm算法等(不是剑圣。。)虽然只是搜索方向发生了改变,但本质却已经产生了极大的不同。下次再分解之。
- 【给数学不好的人的KMP】字符匹配教程(二)简化运算是为了什么如何移位
- 【给数学不好的人的KMP】字符匹配教程(二)简化运算是为了什么如何移位
- 【给数学不好的人的KMP】字符匹配教程(一)next数组的理解
- 【矩阵乘法入门】给数学不好的人的矩阵乘法模板教程
- 人的存在是为了什么?
- 字符串匹配的KMP算法(二)
- 读书的目的是为了什么
- 卢安克:这样的生活是为了什么
- 我们的工作到底是为了什么?
- 我的存在是为了什么?
- 人活着是为了什么(转载)
- 移位运算符的规则及其数学意义
- 人活着是为了什么?
- 人活着,是为了什么
- 移位运算的问题
- java的移位运算
- 移位运算的误区
- java的移位运算
- F2812程序从Flash搬到RAM中运行
- NSScanner 用法
- Hibernate Annotations
- Mysql命令
- ARC 和 非ARC 之间的转换方法
- 【给数学不好的人的KMP】字符匹配教程(二)简化运算是为了什么如何移位
- 输入WIFI密码,连接按钮显示为灰色
- Rman备份中常见的问题
- redhat/centos-6.3上opennebula-3.8部署
- 将16进制的颜色值变成UIColor
- 关键段,事件,互斥量,信号量的“遗弃”问题
- Quartz 各种绘制图形用法 Quartz 实现画图片、写文字、画线、椭圆、矩形、棱形等。
- DataGridView图像文本单元格
- 肖特基二极管