2016.8.6 学习总结
来源:互联网 发布:甜甜圈烤机软件 编辑:程序博客网 时间:2024/05/21 22:32
扩展KMP
扩展KMP嘛。
不就是KMP+manachar而已啧。
要想了解扩展KMP那就必须先知道KMP。【KMP网址我会放在博客的最下面~
现在了解了KMP后,解释扩展KMP就简单了。
因为KMP是扩展KMP的基础。简单来说,扩展KMP是KMP+manachar。
扩展KMP是用来匹配两个字符串的前缀和后缀的,具体来讲就是求字符串A的所有后缀中和字符串B的最长公共前缀是什么或者说是多长
那么KMP的核心思想就是:next依旧是那个next但是得出next的方法就变成了manachar的方法。具体什么意思呢?就是记录一个next的最远端。如果当前询问的这个数字的next+它本身的位置在最远端范围内,那么就直接得出答案,如果不在范围内,就暴力得出next。接下来就用KMP的模式,求next的方法继续匹配另一个字符串。
就是KMP的模式,KMP的next,manachar的求法,KMP的原理。
嗯。没错,就是这么简单。
诶。我知道你们不信。放出我的一段(pi)程(ka)序(qiu)你们就知道了。
求next:
next[0]=m;for (i=0;T[i]==T[i+1];i++);next[1]=i; p=1;for (i=2;i<m;i++) { u=p+next[p]; //u为最右端位置 if (i+next[i-p]<u) next[i]=next[i-p];//如果答案可以直接取 else { //如果答案需要探索 for (j=max(u-i,0);T[i+j]==T[j];j++); next[i]=j; p=i; }}求ex(extand【扩展):
for (i=0;i<m&&S[i]==T[i];i++);ex[0]=i; p=0;for (i=1;i<n;i++) { u=p+ex[p]; //u为最右端位置 if (i+next[i-p]<u) ex[i]=next[i-p]; //如果答案可以直接取得 else { //如果答案需要探索 for (j=max(u-i,0);j<=m&&S[i+j]==T[j];j++); ex[i]=j; p=i; }}你看,是不是一毛一样。
还是那个熟悉的模式,还是那个熟悉的next,还是那个manachar的方式。
哦!
对了,忘记讲时间复杂度了。这可是证明完全明白扩展KMP的证明啊!
。。。
其实跟manachar是一毛一样的,因为是一样的求法。因为它不管是暴力求还是根据之前已有的答案求,都会往前进。这就说明了它的时间复杂度是线性的,也就是N再加上前面求next的M次。所以就是O(N+M)。
so easy!
KMP详情见:http://blog.csdn.net/riven__/article/details/52142017
manachar详情见:http://blog.csdn.net/riven__/article/details/52148535
- 2016.8.6 学习总结
- 2016.8.6 学习总结
- 2016.8.6 学习总结
- 2016.8.5 学习总结
- FCKeditor2.6学习总结
- Dataquest学习总结[6]
- 学习总结6
- 学习总结6
- 11-6DOM学习总结
- 显著检测学习总结6
- [2015.8.6]C++学习总结
- 6月份英语学习总结
- 6月英语学习总结
- Python学习总结(6)-IO
- 学习总结
- 学习总结
- 学习总结
- 学习总结
- luogu P2184 贪婪大陆
- java.se.execise.1
- spring定时任务轮询(spring Task)
- window、location、location.href、self、top简单介绍
- Fragment懒加载
- 2016.8.6 学习总结
- 越亲密,越伤害读书_笔记
- 盒切在医学影像处理中的应用
- 多校4 Another Meaning 5763
- 高并发数据结构Disruptor解析(6)
- Google Gson的使用方法
- 队列,单调栈
- POJ-2002-Squares
- 杭电4349Xiao Ming's Hope