KMP算法中next数组、nextval数组的手工计算
来源:互联网 发布:淘宝客服每日知识总结 编辑:程序博客网 时间:2024/05/21 06:28
刚接触数据结构,对于其中的一些算法都不是很了解,这几天刚在学习串的内容,里面介绍了两种串的模式匹配算法,一种是BF算法(也叫做BoyFriend算法);另一种是KMP算法(也叫做“看毛片”算法)。BF算法的实现很简单,很暴力,但是在时间复杂度的限制下,这不是一个很好的算法。为了提高程序运行的效率,出现了KMP算法,讲真的,算法真的很难理解(对于大佬来说,这种都是基础的题目,但对于像我样的菜鸡,就是登天啦~~)。这几天通过看视频教程,还有看大佬的博客,也懂的了一些简单的方法。
下面跟大家分享下成果吧~
例子:abaabcac
具体步骤:第一位和第二位肯定为0和1
第三位开始比较前面串的最大真子串,没有为1
第四位找:两位的时候 ab和ba 不一样
一位的时候 a 和 a 一样,长度为1,所以next[4]=1+1=2
以此类推。
总结一下:第一位和第二位固定;
其余的位数就看它前面的串,找其中长度最大的真子串(注意:找的时候,找两端,头在一端,尾在一端,
找到的串,从左到右读起来是相同的。比如:ab,ba这两个就不一样。相信聪明的你会一听就明白的),找到next的值为长度加1,未找到值为1。
nextval数组的计算方法呢,有两种:一种是靠直接观察法来算,另一种是依靠next数组来算。第一种没怎么懂,下面讲下用next数组来计算nextval数组的例子吧。
还是上面的例子:
例子:abaabcac
具体步骤:若前两位相同,则nextval为0,若不同则为1,第二位的b与第一位的a不同,所以为1
第三位的时候next值为1,第三位的a与当前next值所对应的值(即是第一位的a)相同,
所以为0。
第四位的next值为2,2对应的值为b,与当前的值不相同,nextval值为当前的next值,第四位为2
第五位的next值为2,2对应的值为b,相同,继续比,第二位b对应的next值为1,1对应的next值
为a,不同,结束,所以nextval值为1。
以此类推,聪明的你肯定明白这其中的规律的。
总结下规律:第一位的nextval值肯定为0,第二位,观察第一位,相同为0,不同为1。剩下的求nextval:
若当前值与当前next所对应的值不同,则直接为当前next值;若相同,则继续查找对应的next值,有不同的就把对应的next值给nextval(正如上面的第五位查找),否则为0。
呼呼~说了这么多,你明白了吗?
下面贴上代码,供大家检验,对比。
#include<bits/stdc++.h>using namespace std;#define maxn 255typedef struct{ char ch[maxn+1];} SString;void Init(SString &S){ char str[maxn]; cin>>str; S.ch[0] = strlen(str);//用第一个位置,存数组的长度 for(int i=0;str[i];i++) S.ch[i+1] = str[i];}void get_nextval(SString &S1,int nextval[]){ int i=1,j=0; nextval[1] = 0; while(i<S1.ch[0]) { if(j==0||S1.ch[i]==S1.ch[j]) { i++; j++; if(S1.ch[i]!=S1.ch[j])nextval[i] = j; else nextval[i] = nextval[j]; } else j = nextval[j]; } for(int k=1; k<=S1.ch[0]; k++) cout<<nextval[k]<<' ';}void get_next(SString &T,int next[]){ int i=1,j=0; next[1] =0; while(i<T.ch[0]) { if(j==0||(T.ch[i]==T.ch[j])) { ++i;++j; next[i]=j; } else j = next[j]; } for(int k=1;k<=T.ch[0];k++) cout<<next[k]<<' ';}int main(){ SString S1; Init(S1); int next[maxn]; ///Get_next(S1,next); get_next(S1,next); cout<<endl; get_nextval(S1,next);}欢迎大佬指教~
阅读全文
0 0
- KMP算法中next数组、nextval数组的手工计算
- 手动计算KMP算法的Next数组与NextVal数组
- 应付考试用的KMP算法中next数组及nextval数组的计算(笑)
- 计算KMP模式匹配算法中next数组的代码分析及改进型KMP算法中nextval数组代码分析
- KMP算法中next和nextval数组的计算方法
- KMP算法中next和nextval数组的求解
- KMP算法的next、next value数组的手工计算
- KMP算法中Next数组及改进后的nextval数组的求法
- KMP算法中next数组和nextval数组值的推导
- KMP算法中nextval数组的计算方法
- KMP算法中改进的nextval数组
- KMP算法中next数组的手工计算方法
- KMP模式匹配算法中next和nextval数组的快速求解
- KMP算法求next数组和nextval数组
- KMP算法next数组与nextval数组建立
- 计算精确串匹配算法KMP中的next和nextVal数组值
- KMP算法中特征值数组next的计算与使用
- KMP算法求next数组和nextval数组的简单方法
- list乱序
- redis 中的hashtable
- ThreeJS学习笔记(6)- 让场景动起来
- UNIVERSA——区块链商业协议
- java设计模式(精通系列)-Decorator
- KMP算法中next数组、nextval数组的手工计算
- Android UI卡顿监测框架BlockCanary原理分析
- .NetCore Enyim.Caching Memcached源码分析
- Hbase与Elasticsearch的jar包冲突解决办法
- Git 代码管理中 .gitignore 文件无效的解决方法
- java实现Multipart/form-data
- 关闭Pycharm拼写检查
- 【Java相关】二进制角度计算~0x99^0x66
- 【Java基础知识】 Annotation03_注解(Annotation)--注解处理器