浅谈KMP算法
2017-06-09 14:52
239 查看
KMP算法用于解决一些比较简单的字符串匹配问题,在双文本比较中,效率是很高的
假设有两个字符串,一个为文本,一个为模板,我们要在文本中找到模板从头至尾匹配出来的字符串的开头
对于这次匹配,我们可以发现匹配点是6和l,从6开始,6,7,8,9可以和模板串匹配上,l,m,o,p可以和模板匹配上
有一个朴素的算法,我们可以for每个开始点,如果没有和模板匹配上就直接开始点后移,然后重复以上操作
朴素算法其实对于随机数据表现非常好
—-刘汝佳
那么KMP算法是什么呢?先用O(m)的时间预处理模板(其中m是模板的长度),然后再O(n)的时间内完成匹配
网上讲解KMP的博客不少,大家可以进行搜索,下面给出代码(233我好像根本没讲KMP,好嘛反正是浅谈)
getfail指针的操作
假设有两个字符串,一个为文本,一个为模板,我们要在文本中找到模板从头至尾匹配出来的字符串的开头
对于这次匹配,我们可以发现匹配点是6和l,从6开始,6,7,8,9可以和模板串匹配上,l,m,o,p可以和模板匹配上
有一个朴素的算法,我们可以for每个开始点,如果没有和模板匹配上就直接开始点后移,然后重复以上操作
朴素算法其实对于随机数据表现非常好
—-刘汝佳
那么KMP算法是什么呢?先用O(m)的时间预处理模板(其中m是模板的长度),然后再O(n)的时间内完成匹配
网上讲解KMP的博客不少,大家可以进行搜索,下面给出代码(233我好像根本没讲KMP,好嘛反正是浅谈)
getfail指针的操作
void getfail(char* P,int* f){ int m=strlen(P); f[0]=0;f[1]=0; for(register int i=0;i<m;i++){ int j=f[i]; while(j&&P[i]!=P[j]) j=f[j]; f[i+1]=P[i]==P[j]?j+1:0; }