KMP算法中的前缀函数
来源:互联网 发布:净化网络环境的议论文 编辑:程序博客网 时间:2024/06/05 09:27
虽然在上一篇文章中已经全面介绍了KMP算法和前缀函数的计算过程。但是鉴于前缀函数的计算比较难以理解,这里再专门详细解释一下KMP算法中next[]数组的含义和实现过程,帮助加深理解。
简单的说,前缀函数主要是求出模式串中的next数组,那么什么是模式串呢?模式串模式串的概念很简单。举个例子:“给出一个字符串 T,再给出 n 个字符串 S1、S2...Sn,问 S1、S2...Sn 中有哪些是 T 的子串?”在这个例子中,S1、S2...Sn 便是 n 个模式串,T便是被匹配串。模式串是用来与被匹配串匹配的。
next数组的主要意义是:若模式串 P 的前 i 个字符组成的子串为S,那么S的前next[i]个字符’与‘S的后 next[i]个字符’相同。
如果理解了这个意思,那么这个前缀函数的模板就很好看懂了。
模板:
如果理解了这个意思,那么这个前缀函数的模板就很好看懂了。
模板:
//T是被匹配的串。 //P是模式串。 //字符串都是从下标1开始的。 void COMPUTE_PREFIX_FUNCTION(char P[]) { int m=strlen(P+1); //这里是因为要从P[ 1 ]开始输入字符串的 next[1]=0; for(int k=0,q=2;q<=m;q++) //这段代码我感觉用通俗的语句说就是k是用来表示子串中前k个和后k个是相同的,q是用来遍历数组的需要 { while(k>0&&P[k+1]!=P[q]) //如果P[k+1]和P[q]中字符不同说明匹配是失败,要把k的值重新退到next[ k ],直到两者相同才停止。这样做的好处是没必要再重新从头再来,节约时间。 k=next[k]; if(P[k+1]==P[q]) k++; next[q]=k; } }
这里有一个前缀函数计算过程的flash动画例解,做的很好,共参考:
前缀函数实现过程的flash动画:http://ds.fzu.edu.cn/fine/resources/FlashContent.asp?id=41
- KMP算法中的前缀函数
- 【算法讲解】前缀函数(KMP的next函数)
- 前缀中的周期---非优化KMP算法的运用
- KMP算法中的next函数
- 关于KMP算法中前缀函数(next函数)的一点个人理解
- KMP匹配算法中的失效函数 (ZT)
- KMP算法中的next函数的证明
- KMP算法、next数组与前缀中的周期(相关题目:Power strings, poj2406)
- 求所有前缀-后缀字符串相等的长度(kmp算法中的nxet数组)
- strstr函数(KMP算法)
- KMP算法的前缀next数组最通俗的解释
- KMP算法的前缀next数组最通俗的解释
- 字符串匹配的KMP算法--前缀和后缀的详解
- KMP算法的前缀next数组最通俗的解释
- KMP算法的前缀next数组最通俗的解释
- KMP(1)-前缀函数(Prefix function)KMP的next函数
- KMP算法实现strstr()函数
- KMP算法中next函数
- 关于ListView中item问题
- 编程能力与编程年龄
- acm湖南大学长沙赛区 铁牌
- hdu 1216 Assistance Required
- liunx 常用信息显示命令
- KMP算法中的前缀函数
- JVM虚拟机时区设置问题
- SQL Server 2008 自动备份数据库
- this is my first eassy
- php 生成图片水印且合并多个图片 Demo
- 视频教程
- php四种排序
- mac 快捷键
- 如何学习嵌入式(转载)