c语言数据结构kmp中next计算,数据结构——关于KMP算法中next函数的详细解析

以前看到数据结构中字符串的模式匹配时,花了半天的时间,才把KMP算法中的next函数整明白了,结果过了几天在看到这时,只记得next[j+1]=next[j]+1,但是有时候能套公式正确算出,有时候就算不对,因此今天再从新理一遍思路,顺便记录下来,防止哪天脑子再短路了,又不知道怎么求解的了。算法

先看看next数据值的求解方法

位序       1   2   3   4   5   6   7   8   9

模式串     a   b   a   a   b   c   a   b   c

next值     0   1   1   2   2   3   1   2   3

next数组的求解方法是:

1.第一位的next值为0

2.第二位的next值为1

后面求解每一位的next值时,根据前一位进行比较

3.第三位的next值:第二位的模式串为b ,对应的next值为1;将第二位的模式串b与第一位的模式串a进行比较,不相等;则第三位的next值为1(其余状况均为1)

4.第四位的next值:第三位的模式串为a ,对应的next值为1;将第三位的模式串a与第一位的模式串a进行比较,相同,则第四位的next值得为1+1=2

5.第五位的next值:第四位的模式串为a,对应的next值为2;将第四位的模式串a与第二位的模式串b进行比较,不相等;第二位的b对应的next值为1,则将第四位的模式串a与第一位的模式串a进行比较,相同,则第五位的next的值为1+1=2

6.第六位的next值:第五位的模式串为b,对应的next值为2;将第五位的模式串b与第二位的模式中b进行比较,相同,则第六位的next值为2+1=3

7.第七位的next值:第六位的模式串为c,对应的next值为3;将第六位的模式串c与第三位的模式串a进行比较,不相等;第三位的a对应的next值为1,

则将第六位的模式串c与第一位的模式串a进行比较,不相同,则第七位的next值为1(其余状况)

8.第八位的next值:第七位的模式串为a,对应的next值为1;将第七位的模式串a与第一位的模式串a进行比较,相同,则第八位的next值为1+1=2

9.第八位的next值:第八位的模式串为b,对应的next值为2;将第八位的模式串b与第二位的模式串b进行比较,相同,则第九位的next值为2+1=3

若是位数更多,依次类推

KMP算法的关键在于求算next[]数组的值,即求算模式串每一个位置处的最长后缀与前缀相同的长度,下面按照递推的思想总结一下求解next[]数组:

根据定义next[1]=0,假设next[j]=k, 即P[1...k-1]==P[j-k,j-1]数组

1)若P[j]==P[k],则有P[1..k]==P[j-k,j],很显然,若是next[j]=k; 则next[j+1]=next[j]+1=k+1;不然next[j+1]=k+1!=next[j]+1;(当初就想着记公式简单能够直接套用呢,结果只记住next[j+1]=next[j]+1以致于后来迷糊了)

2)若P[j]!=P[k],则能够把其看作模式匹配的问题,即匹配失败的时候,k值如何移动,显然k=next[k]。

所以能够这样去实现:数据结构

void getNext(char *p,int *next)

{

int j,k;

next[1]=0;

j=1;

k=0;

while(j

{

if(k==0||p[j]==p[k]) //匹配的状况下,p[j]==p[k],next[j+1]=k+1;

{

j++;

k++;

next[j]=k;

}

else //p[j]!=p[k],k=next[k]

k=next[k];

}

}

KMP模式匹配算法改进:函数

后来有人发现其实KMP算法仍是有缺陷的,好比主串S=“aaaabcde”,子串T=“aaaaag”,其next数组为012345;当i=5 ,j=5是“b”与“a”不匹配,此时j=next[5]=4,又发现j=4时,“b”与“a”不匹配,依次类推,直到j=next[1]=0;此时i++,j++,i=6,j=1从而咱们发现中间有多余的判断,因为子串T中第二、三、四、5位置的字符都与首位的“a”相同,便可以用首位next[1]的值去取代与它字符相等的后续next[j]的值,即next数组改成000005,此时由i=5,j=5时“b”与“a”不匹配,此时j=next[5]=0;此时i++,j++获得i=6,j=1,便可省去中间的多余判断。所以咱们须要改进next函数的求解方法。spa

/* 求模式串T的next函数修正值并存入数组nextval */

void get_nextval(String T, int *nextval)

{

int i,j;

i=1;

j=0;

nextval[1]=0;

while (i

{

if(j==0 || T[i]== T[j]) /* T[i]表示后缀的单个字符,T[j]表示前缀的单个字符 */

{

++i;

++j;

if (T[i]!=T[j]) /* 若当前字符与前缀字符不一样 */

nextval[i] = j;/* 则当前的j为nextval在i位置的值 */

else

nextval[i] = nextval[j];/* 若是与前缀字符相同,则将前缀字符的 */

/* nextval值赋值给nextval在i位置的值 */

}

else

j= nextval[j];/* 若字符不相同,则j值回溯 */

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈“微服务”

微服务概述 1.1 易于扩展 1.2 部署简单 1.3 技术异构性 数据库的服务化切分 2.1 什么是“分库分表”? 2.2 数据库扩展的几种方式 2.3 分库分表的几种方式 2.4 引入分库分表中间件后面临的问题 2.5 现有分库分表中间件的横向对比 微服务架构中的分布式事务 3.1 什么…

liigo:爱可视70平板电脑使用感受,遗憾与满足并存

我想大部分人来这里,不是想听美言的。许多资料、宣传性文章、评测、视频等等,网络上已经有很多了(其中外文占很大比例)。 我想大部分人来这里,是想听真正的使用感受的。我想,我这里提到的许多内容&#xff…

c语言 拓补排序源代码,拓扑排序C语言代码

#include#include#include#include//----------------公共的-----------------#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2//---------------------------------------//*************栈的初始大小和增量*************…

visual studio 正则表达式 查找与替换文本

好多时候想要重构一些代码,但是修改起来发现很麻烦,因为简单的文本替换不能满足需求,这时候就要借助ide的力量了。还好visual studio 2010支持正则表达式查找和替换。如下图所示: document.all.domElementA.style.visibility hid…

51 Python - 装饰器 参数化装饰器——装饰器更通用

05参数化装饰器——装饰器更通用 参数化装饰器如何理解&#xff0c;简单理解就是让装饰器可以通用。场景举例&#xff0c;现在有个需求要改某一段文字&#xff0c;既要加<P>标签&#xff0c;又要加<B>&#xff0c;还有加<Div>。是不是意味着需要定义多个装饰…

手机android怎么开机画面,Android使用BroadcastReceiver实现手机开机之后显示画面的功能...

本文实例讲述了Android使用BroadcastReceiver实现手机开机之后显示画面的功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;在此例中介绍了怎样使用BroadcastRececiver。使用BroadcastReceiver需要继承这个类&#xff0c;并且重写public void onReceiver(Context co…

[html] HTML采用的是RGB颜色还是CMYK颜色?为什么?

[html] HTML采用的是RGB颜色还是CMYK颜色&#xff1f;为什么&#xff1f; 用在电脑或者手机上显示的大部分都是RGB&#xff0c;用于需要印刷的都用CMYK 并且不同的显示器色域不同会导致色差&#xff0c;不同浏览器也有自己的调色板&#xff0c;后面总结出来过一套web安全色&am…

Registered Nurse in the US

注册护士移民美国的条件美国护士RN考试介绍美国注册护士考试复习美国各州注册护士考试要求CGFNSRegistered nurseTop Paid Registered Nurses 转载于:https://www.cnblogs.com/sbxlm/p/3655784.html

安卓突然自动关机 android正在启动,华为手机开机重启后老是显示安卓正在启动优化应用是为什么?...

建议进入Recovery模式执行双清wipe操作。Recovery模式指的是一种可以对安卓机内部的数据或系统进行修改的模式(类似于windowsPE或DOS)。在这个模式下可以刷入新的安卓系统&#xff0c;或者对已有的系统进行备份或升级&#xff0c;也可以在此恢复出厂设置。进入recovery的方法&a…

[html] 写一个密码默认星号,但可以查看密码的输入框

[html] 写一个密码默认星号&#xff0c;但可以查看密码的输入框 <i class"icon-password"></i> <input type"text" v-if"pwdType" v-model"eyeTxt" /> <input type"password" placeholder"输入新…

算法天书

在cstheory.stackexchange看到一个很有营养的帖子,发起人从《来自天书的证明》(Proofs from the Book)得到灵感&#xff0c;意思是&#xff0c;假如有上帝的话&#xff0c;上帝又有一本“算法天书”的话&#xff0c;那么这本算法书里面应该有哪些算法呢&#xff1f;NB而踊跃的跟…

linux+右键快捷,LINUX 添加右键打开终端快捷方式

第一种方法&#xff1a;安装一个包&#xff0c;即可在右键里面添加一个“打开终端”的菜单。sudoapt-getinstallnautilus-open-terminal&#xff0c;安装完成&#xff0c;注销以后再回来&#xff0c;就可以右键打开terminal了)第二种方法&#xff1a;进入主目录的.gnome2/nauti…

python中numpy矩阵运算操作大全(非常全)!

python中numpy矩阵运算操作大全&#xff08;非常全&#xff09; //2019.07.10晚python矩阵运算大全1、矩阵的输出形式&#xff1a;对于任何一个矩阵&#xff0c;python输出的模板是&#xff1a;import numpy as np #引入numpy模块np1np.array([[1,2,3],[1,3,4],[1,6,2]...]) #数…

[html] 制作一个不规则形状有哪些方法可以实现?

[html] 制作一个不规则形状有哪些方法可以实现&#xff1f; canvas个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

android dialog 点击确定不消失,AlertDialog点击按钮不消失的实现方法

我有一个文本输入对话框&#xff0c;当我点击对话框上的“是”按钮&#xff0c;它会验证输入&#xff0c;然后关闭对话框。但是&#xff0c;如果输入错误&#xff0c;我想停留在同一个对话框中.。每一次&#xff0c;无论输入是什么&#xff0c;对话框应该自动关闭&#xff0c;当…

计算平面坐标某点(x,y)与原点(0,0)的角度

以前某个项目有一个功能需要手指滑动一个饼图。当时搬高中数学公式&#xff0c;并大量查询网络&#xff0c;花了两个小时把那个功能的数学算法搞定。 今天在看android下一段源码时&#xff0c;突然发现一个数学函数&#xff1a;Math.atan2 &#xff0c;一下子羞愧难当&#xff…

[html] 跨域通信有哪些方式?

[html] 跨域通信有哪些方式&#xff1f; JSONPWebSocketCORSHashpostMessage个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

《CLR via C#》 第三版的主要内容

Jeffrey Richter 在他的博客中叙述了 CLR via C#第三版的主要内容&#xff0c;和改动。原本如下&#xff1a;&#xff08;必要的地方加了翻译&#xff09; Last week I submitted the reaming chapters for my new book. It is now being edited and should be available right…

【摘录】MTK按键扫描原理及相关代码

一&#xff0e;MTK按键扫描原理&#xff1a; 不同的MTK平台内部提供的按键数目各有不同&#xff0c;但是扫描原理大致一样&#xff0c;这里以MTK6253为例来讲解记录。 MTK提供6*7共42个矩阵键盘&#xff0c;加上Power键总共43个按键&#xff0c;其中BB芯片引出6根行线ROW&#…

导致Android手机崩溃的壁纸,使用错误的壁纸会使你的Android手机崩溃

原标题&#xff1a;使用错误的壁纸会使你的Android手机崩溃现代智能手机是非常复杂的&#xff0c;能够显示大量的内容&#xff0c;并能浏览一系列复杂的色域、文件格式和媒体类型。然而&#xff0c;其中一些功能会以意想不到的方式影响到正常使用。Twitter用户Ice Universe发现…