以下i表示主串位置,j表示模式串位置,s为主串,t为模式串.
KMP算法的牛逼之处就是免去i的回溯, 否则普通的扫描扫着扫着不相等,i又回溯到之前的起始位置的下一个位置,j也回溯到1,又开始匹配.
而KMP则是i一直向前走,一旦遇到不匹配的字符,j回溯到一个可以用来比较的位置,而j之前的t部分串与s串i之前的部分是最大匹配的,然后检测s[i],t[j]是否相等,相等则i可以+1,j+1,继续检测,此时i能够后移的原因是,i之前的部分串已最长的匹配t串,这种理解只可意会,不可言传....
next的作用: 当扫描过程中,如果s[i]!=t[j],那么j=next[j],然后比较s[i]与t[j],此时.....s[i-1]与......t[j-1]是最长匹配的,如果s[i]==t[j],那么++i,++j,继续扫描下一位,如果不相等,那么继续j=next[j],再找一个次长的匹配,比较s[i]与s[j],如果一直到j==0都没有匹配i位的字符,那么说明整个模式串与s[i]以及之前的一段都没有匹配,则++i,++j, 即继续从j=1,i=i+1比较。
next怎么求的:这个非常飘渺, next只与模式串有关,因为在s与t匹配过程中一旦遇到一个字符不匹配,那么就应该尝试用已经匹配的那一段t与已经匹配的s的部分去匹配,然后比较t的部分匹配的下一个位置与s[i]是否相等. 所以求next就相当于t与t进行匹配的过程, 与KMP算法非常类似的,首先令i=1,j=0,next[1]=0,表示如果t[1]与主串的字符不匹配,那么应该去和t[0]比较且t[0]之前部分匹配,但是t[0]没有字符,所以if j==0, ++i,++j, 这一位t[i]已经没法匹配了。
如果t[i]与t[j],则++i,++j,并且++i,++j之前的i,j之前的段属于匹配的,所以++i,++j以后的next[i]=j,即如果s[某一位]与t[i]不相等,那么就可以根据next[i]找到j,用s[某一位]与t[j]比较看是否相等.
nextval怎么求:这个是next的升级版,思想是建立在next之上的,但是并不是说要先求next才能求nextval, nextval只是在next的思想上进一步优化了。 如果求next的过程中,t[i]==t[j],那么本来可以直接写 next[++i]=++j; 但是这时候有一些问题,如果t[++i]与主串s[某位]不相等的时候,我们用next[++i],结果t[next[++i]]与t[++i]又相等,虽然i之前的t串与s串某一位之前完全匹配,但是这样的比较是没有意义的,因为既然匹配过程中已不相等,根据next滑动t串后的比较位与t之前的比较位一样,肯定也不匹配,所以这时候我们就非常需要nextval发挥作用了。
所以如果求next的过程中,t[++i]==t[++j],那么我们应该让j回溯到nextval[j]以找到一个不相等的位匹配,这样就最终求得了nextval的所有情况.
的确是只可意会不可言传,权当自己的思路笔记了。。。。。。。。。。不指望别人能读懂
分享到:
相关推荐
此程序配合清华大学出版《数据结构(C语言版)》 P83-84页的KMP算法 win tc调试通过
严蔚敏数据结构kmp算法详解PPT学习教案.pptx 本资源摘要信息将对严蔚敏数据结构kmp算法的学习教案进行详细的讲解和分析。KMP算法是字符串匹配算法中的一种重要算法,它可以高效地进行字符串匹配。 首先,我们需要...
本人从严蔚敏 的 数据结构算法一书中 精选的KMP算法 的实例,希望对大家有用!
我们使用的教材是清华大学严蔚敏教授编写的《数据结构(C语言版)》,该教材难度较大,其实验方法特别是ADT方法在教材中介绍较少,KMP算法更是从理论分析的角度介绍了匹配算法和next的计算,自学难度很大。...
严蔚敏-数据结构-kmp算法详解.ppt该文档详细且完整,值得借鉴下载使用,欢迎下载使用,有问题可以第一时间联系作者~
在理解了KMP算法的基本原理和失配表的构造后,我们还需要掌握如何使用KMP算法进行字符串匹配的具体步骤。具体包括: 1. 根据模式串构建失配表。 2. 使用构建好的失配表在文本串中进行匹配,根据失配表移动模式串...
### KMP算法分析 #### 算法使用条件及特点 KMP算法(Knuth-Morris-Pratt算法)是一种高效的字符串匹配算法,它适用于在主串与模式串之间存在许多“部分匹配”的情况下进行匹配操作。相比于朴素的字符串匹配算法...
- KMP算法:介绍一种高效的字符串匹配算法,避免了不必要的回溯。 4. **第四章:数组与矩阵** - 多维数组:了解多维数组的表示方法,尤其是矩阵的运算,如矩阵加法、乘法等。 - 散列(Hash)技术:介绍散列函数...
总结来说,KMP算法教学应注重理解next值的计算和其在避免无效比较中的作用,同时强调算法的实际应用价值,以激发学生的学习兴趣和探索精神。通过实践和讨论,学生能更好地掌握这一复杂但高效的字符串匹配算法。
这部分会讨论串的基本操作,如连接、查找、替换等,以及模式匹配问题,如KMP算法等。 5. **数组和广义表 (ch5.rar)**:数组是数据结构的基础,讨论一维、二维数组和多维数组的操作。广义表是更灵活的数据结构,可以...
配套实现程序则为理论知识提供了实践平台,帮助学习者更直观地理解各种数据结构的运作机制和算法的实现细节。 1. **线性表**: 在这本书中,线性表可能包括数组和链表两种形式。数组是最基础的数据结构,存储相同...
7. **字符串处理**:涉及到KMP算法、Rabin-Karp算法、Boyer-Moore算法等字符串匹配方法,以及动态规划在解决字符串问题中的应用。 8. **动态规划**:动态规划是一种求解最优化问题的有效方法,例如背包问题、最长...
7. **字符串处理**:涉及到字符串匹配算法,如 KMP 算法,以及文本处理中的其他算法。 8. **图论算法**:如 Dijkstra 算法、Floyd 算法解决最短路径问题,以及 Ford-Fulkerson 方法解决最大流问题。 源代码部分则...
通过学习KMP算法,我们可以更好地理解字符串匹配的高效策略,并将其应用于实际的编程任务中,提升代码的执行效率。在数据结构的学习中,深入研究并熟练掌握KMP算法,无疑会增强我们在算法设计和问题解决上的能力。
9. **字符串处理**:如KMP算法、Trie树(字典树)和Rabin-Karp滚动哈希等,用于模式匹配和字符串查找。 这些实现程序不仅帮助读者直观地理解数据结构和算法的工作原理,还提供了实践经验,使学习者能够调试代码,...
4. **字符串处理算法**:如KMP算法,这是一种高效的字符串匹配算法,可以避免不必要的回溯。 5. **树**:二叉树的各种遍历方法,包括前序、中序、后序遍历,其中前序和中序遍历还可以通过线索二叉树实现。层次遍历...
6. 字符串处理:KMP算法(不回溯的模式匹配)、Rabin-Karp算法(滚动哈希实现的模式匹配)。 7. 分治策略:如快速幂运算、归并排序等,将大问题分解为小问题来解决。 严蔚敏教授的讲稿可能会深入探讨这些算法的...
严蔚敏教授的教材在数据结构和算法的教学中非常权威,其中对KMP算法的解释深入浅出,适合初学者理解和掌握。通过阅读和实践书中的代码,可以更好地理解KMP算法的原理,并能够熟练地运用到实际问题中去。