KMP算法中的前缀函数问题

问题描述

KMP算法中的前缀函数问题

复习算法与数据结构这课的KMP算法,到现在对前缀函数很困惑。各位大牛们就举个例子来说说吧。
字符串"abcaababc" 求其KMP前缀函数。
我求出来next[i]:{-1,0,0,-1,1,0,2,0,0},这是不是KMP前缀函数啊?

解决方案

假设给定的模式串是:abcdabd, 从左到右遍历整个模式串,那么各个子串的前缀后缀为:
子串 前缀 后缀 最大公共长度
a null null 0
ab a b 0
abc a, ab c, bc 0
abcd a, ab, abc d, cd, bcd 0
abcda a, ab, abc, abcd a, da, cda, bcda 1 (存在相同前后缀子串a)
abcdab a, ab,abc,abcd,abcda b,ab,dab,cdab,bcdab 2(相同子串ab)
abcdabd a,ab,abc,abcd,abcda,abcdab d,bd,abd,dabd,cdabd,bcdabd 0

那么子串对应各个前缀后缀公共元素最大长度为:
0, 0, 0, 0, 1, 2, 0
因为模式串首尾会重复:
所以next数组 = 公共元素最大长度整体向右移一位,然后将初值赋为-1
所以模式串 "abcdabd" 的next数组为:-1,0,0,0,0,1,2

解决方案二:

或者是{0,0,0,1,1,2,1,2,3}

解决方案三:

KMP算法中的前缀函数
【算法讲解】前缀函数(KMP的next函数)

时间: 2024-10-27 06:52:59

KMP算法中的前缀函数问题的相关文章

JavaScript中数据结构与算法(五):经典KMP算法

  这篇文章主要介绍了JavaScript中数据结构与算法(五):经典KMP算法,本文详解了KMP算法的方方面在,需要的朋友可以参考下 KMP算法和BM算法 KMP是前缀匹配和BM后缀匹配的经典算法,看得出来前缀匹配和后缀匹配的区别就仅仅在于比较的顺序不同 前缀匹配是指:模式串和母串的比较从左到右,模式串的移动也是从 左到右 后缀匹配是指:模式串和母串的的比较从右到左,模式串的移动从左到右. 通过上一章显而易见BF算法也是属于前缀的算法,不过就非常霸蛮的逐个匹配的效率自然不用提了O(mn),网上

JavaScript中数据结构与算法(五):经典KMP算法_javascript技巧

KMP算法和BM算法 KMP是前缀匹配和BM后缀匹配的经典算法,看得出来前缀匹配和后缀匹配的区别就仅仅在于比较的顺序不同 前缀匹配是指:模式串和母串的比较从左到右,模式串的移动也是从 左到右 后缀匹配是指:模式串和母串的的比较从右到左,模式串的移动从左到右. 通过上一章显而易见BF算法也是属于前缀的算法,不过就非常霸蛮的逐个匹配的效率自然不用提了O(mn),网上蛋疼的KMP是讲解很多,基本都是走的高大上路线看的你也是一头雾水,我试图用自己的理解用最接地气的方式描述 KMP KMP也是一种优化版的

KMP算法(转)

 KMP算法         在介绍KMP算法之前,先介绍一下BF算法. 一.BF算法     BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符:若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果.     举例说明:     S:  ababcababa     P:  ababa  BF算法匹配的步骤如下            i=0           

字符串的模式匹配详解--BF算法与KMP算法_C 语言

一.BF算法    BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符:若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果.    举例说明: S: ababcababa P: ababa BF算法匹配的步骤如下 i=0 i=1 i=2 i=3 i=4 第一趟:ababcababa 第二趟:ababcababa 第三趟:ababcababa 第四趟:ababcab

php中字符串匹配KMP算法实现例子

kmp算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特--莫里斯--普拉特操作(简称KMP算法).KMP算法的关键是根据给定的模式串W1,m,定义一个next函数.next函数包含了模式串本身局部匹配的信息 例子  代码如下 复制代码 <?php /* 字符串匹配KMP算法的PHP语言实现 */ function KMP($str) {     $K = array(0);     $M = 0;     $strLen

retinex-单尺度RETINEX的算法中不同代码的高斯函数的形式问什么不同,MATLAB代码

问题描述 单尺度RETINEX的算法中不同代码的高斯函数的形式问什么不同,MATLAB代码 有没有相关的代码.为什么高斯核的形式不一样 [x y]=meshgrid((-(size(Ir,2)-1)/2):(size(Ir,2)/2),(-(size(Ir,1)-1)/2):(size(Ir,1)/2)); gauss_1=exp(-(x.^2+y.^2)/(2*sigma_1*sigma_1)); %计算高斯函数 Gauss_1=gauss_1/sum(gauss_1(:)); %归一化处理

C语言中实现KMP算法的实例讲解_C 语言

一般的算法为什么这么低效呢?那是因为主串指针回溯情况过多: 主串指针如果不回溯的话,速度就会加快,那我们就会想: 如何让主串指针不回溯? KMP算法就是解决了这个问题,所以速度变得更快速了. 它是这样子的: 用一个数组:next[] 求得失配时的位置,然后保存下来. 要说清楚KMP算法,可以从朴素的模式匹配算法说起.  朴素的模式匹配算法比较容易理解,其实现如下    int Index(char s[], char p[], int pos) { int i, j, slen, plen; i

字符串模式匹配之KMP算法图解与 next 数组原理和实现方案

之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下.   KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 i指针,而是利用已经得到的"部分匹配"的结果将模式子串向右"滑动"尽可能远的一段距离后,继续进行比较.如果 ok,那么主串的指示指针不回溯!算法的时间复杂度只和子串有关!很好. KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目

C语言kmp算法简单示例和实现原理探究_C 语言

以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下"奥,它是做模式匹配的"这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(下不说程序实现,思想很简单). 模式匹配的经典应用:从一个字符串中找到模式字串的位置.如"abcdef"中"cde"出现在原串第三个位置.从基础看起 朴素的模式匹配算法 A:abcdefg  B:cde 首先B从A的第一位开始比较,B++==A++,如果全