KMP算法中的next数组的求法
从《严书》上看到了KMP算法,看了一遍没懂,但觉得挺神奇的,就花费了几天时间深入的理解。
算法的原理其实不难,难的就是那个巧妙的next数组,这个next数组很吸引我,我的大部分时间也都是花费在这个数组上面的。这个next数组是KMP里面一个很关键的地方,对于在数据结构书上看过一遍整个算法流程的人,能够把next数组搞明白,整个KMP算法的整体思想就差不多理解了。然后在一些细节上面深入思考一下,就可以理解和领会改进的KMP算法。
一、KMP算法简单介绍
KMP算法是字符串匹配算法的一种,相对于朴素的字符串匹配算法而言,可以大大避免重复遍历的情况。此算法可以在O(n+m)的时间数量级上完成字符串匹配操作。
二、神奇的next数组
关于KMP算法的原理和实现,书上或者百度一下都可以找到,我在这里就不罗嗦那么多了,直接切入主题(next数组)。
我们设主串S=abcabcabca,模式串p=abcabx。
KMP第一趟匹配:
i=6
S : a b c a b c a b c a
位置 : 1 2 3 4 5 6 7 8 9 10
P : a b c a b x
位置 : 1 2 3 4 5 6
j=6
第一次匹配到第6个位置的时候失败了,按照朴素的算法,i要回溯到第2个位置,j要回溯到第1个位置重新匹配。KMP的话,主串中的i是不会回溯,模式串中的j回溯也不会回溯到第1个位置。注意这里是关键,i不用回溯就可以完成整个字符串的匹配。为什么i不需要回溯呢?我们先留下这个疑问。
我们把匹配成功的前5个字符研究一下。
1位置的前缀子串为:a , ab , abc , abca
5位置的后缀子串为:bcab , cab , ab , b
我们观察发现两组里面都有一个ab,你能看出点什么东西么,好的,先不管这个。
我们就按照朴素的算法来看,i回溯到第2第3位置都会在前5个字符中匹配失败。
朴素匹配:
i=4
S : a b c a b c a b c a
位置 : 1 2 3 4 5 6 7 8 9 10
P : a b c a b x
位置 : 1 2 3 4 5 6
j=1
当回溯到第4个位置的时候,成功匹配的字符为ab,然后再去判断S串的第6个字符和P串的第3个位置。这个然后我们先不管,观察S中和P匹配的ab,在第一趟匹配的时候S中的ab是和P中前5个字符的最后两个匹配的,而这一次匹配则是和P中前两个字符匹配的。能发现点什么东西么?
不需要让i回溯到之前的位置重新匹配,只需要找到在P串前5个字符中第一个位置的前缀子串和最后一个位置的后缀子串相等并且串长最大的那一对子串,让j指向前缀子串最后一个字符的下一个位置3,和i所指向的6进行比较。往后遇见不匹配的时候采取和这个一样的方法。
KMP第二趟匹配:
i=6
S : a b c a b c a b c a
位置 : 1 2 3 4 5 6 7 8 9 10
P : a b c a b x
位置 : 1 2 3 4 5 6
j=3
这个时候就需要next数组的建立了,
next[6]存储的就是前5个字符组成的字符串中的第一个位置的前缀子串和最后一个位置的后缀子串相等并且串长最大的那一对子串的最后一个字符的下一个位置,也就是3,也就是和P串中第3个位置匹配。
写到这里,next数组应该可以得出来了。
具体代码怎么得出来的,书上面都有。。那个应该不难。
分享到:
相关推荐
KMP算法中next数组求法 KMP算法是字符串匹配算法中的一种高效算法,next数组是KMP算法的核心结构。next数组的计算是KMP算法的关键步骤,本文将详细介绍next数组的计算方法。 next数组的定义: next数组的定义为:...
总之,KMP算法和next数组是数据结构中非常重要的部分,它们提供了高效字符串匹配的方法,对于理解和应用字符串处理有着重要意义。通过深入学习和实践,我们可以更好地掌握这一经典算法,提高程序的运行效率。
关于字符串匹配里,KMP算法中next实现实现原理。关于字符串匹配里,KMP算法中next实现实现原理。
在KMP算法中,NEXT数组(有时也称为π数组或跳转表)起着至关重要的作用。它记录了模式串中每个字符的“最大有效前缀长度”,即对于模式串`P = p0p1…pm-1`中的任意位置`i`(0 ≤ i ),`next[i]`表示以`pi`结尾的...
KMP算法中求NEXT的方法,希望对大家有所帮助啊,呵呵!!!
掌握KMP算法和其next数组的构造方法对于提升编程能力,特别是在处理字符串操作的问题上,具有重要意义。 总结起来,KMP算法是一种高效字符串匹配算法,其关键在于构建next数组。这个数组记录了模式串中的部分匹配...
在KMP算法中,关键的概念是fail数组,也被称为next数组,它存储了模式串的前缀和后缀的最长公共长度,用于指导匹配过程。 fail数组的计算是KMP算法的核心部分,其主要目的是为了构建一个动态跳转表,使得在主串和...
KMP算法算法的实现包括next数组的构建以及算法主体,并附上注释
KMP算法的核心在于构造一个next数组,也称为失配函数,它存储了模式串中的每个字符与前缀的最长公共后缀长度。这个数组在算法执行过程中起着关键作用,避免了不必要的字符比较,提高了搜索效率。 在KMP算法中,next...
也就是说,KMP算法是用来解决字符串匹配问题的,从一个主字符串text中寻找一个子字符串(模式字符串)pattern,看这个子串是否在主串中,比如对于text='abaacababcac'和pattern='ababc',子串是包含在主串中的,同时它...
在这个例子中,`compute_next`函数计算next数组,`kmp_search`函数执行KMP算法查找子串在主串中的位置。 六、KMP算法的应用 KMP算法广泛应用于文本处理、数据搜索、生物信息学等领域,如DNA序列比对、源代码自动...
也就是说,KMP算法是用来解决字符串匹配问题的,从一个主字符串text中寻找一个子字符串(模式字符串)pattern,看这个子串是否在主串中,比如对于text='abaacababcac'和pattern='ababc',子串是包含在主串中的,同时它...
KMP算法避免了在匹配过程中不必要的字符比较,通过构建一个“部分匹配表”(也称为“next数组”),能够快速跳过已知不匹配的部分,从而提高搜索效率。在本压缩包中,包含两个关键文件:`z_box2kmp_next`和`KMP`,...
内容概要:主要包括KMP中的next数组的实现,属简单了解类型,还包括了KMP算法,以及原码,模版,和手写笔记适用人群:适用于对KMP已经有初步了解,增添思考的一中方案
根据提供的标题、描述以及部分内容,可以确定这是一份关于KMP算法中求解next数组的课程资料。下面将详细介绍KMP算法的基本概念、next数组的作用及其计算方法。 ### KMP算法简介 KMP(Knuth-Morris-Pratt)算法是一...
计算 next 数组的代码使用了 KMP 算法的思想,计算 extend 数组的代码使用了 next 数组和字符串 S 的信息。 时间复杂度 扩展 KMP 算法的时间复杂度为 O(n+m),其中 n 和 m 分别是字符串 S 和 T 的长度。 空间...
对于每个位置i,找到其对应的最大相等前后缀长度,并填入next数组中。 3. **匹配过程**:从文本串的第一个字符开始,与模式串的第一个字符比较。如果匹配成功,则继续比较下一个字符;如果不成功,则利用next数组中...