浅谈数据结构之KMP(串中的模式匹配算法)
KMP算法是一种模式匹配算法的改进版,其通过减少匹配的次数以及使主串不回朔来减少字符串匹配的次数,从而较少算法的相应代价,但是,事件万物是普遍归中的,KMP算法的有效性也是有一定的局限的,我将在本文的最后也讨论这个算法的局限性。
一般的匹配算法:

KMP基本概念引入:
但是,其实我们会发现,上面的中间两个匹配步骤是没有必要的,因为他们的第一个匹配字母就不相同,完全没有可比性,而当我们在第四次匹配的时候,其实我们从模式串中就可得知,只有当模式串滑到这个地方的时候,它的匹配才是最有价值的,因为从模式串中我们可以得知,最后一个C的前一个字母是a,而在模式串中的第二个字母b的前一个字母也是a,再无其他,从第一步匹配的结果我们可以得知,模式串中的最后一个字母c与主串中的b匹配失败(读者们是否注意到,我们前面提到的,这个c的前一个字母是a哦), 而从模式串中我们可以得知,即我们完全可以跳过上面匹配步骤的中间的两步,那是否读者在担心中间会错过原本可以匹配的呢,完全不必担心,因为在我们的模式串中就记录了,前面就连一个能和a进行匹配的字母都没有。
那么,当某一轮匹配失败时,模式项的滑动位置如何确定,即模式项中的那一项来和主串的的b(黄色格子内)对齐,从而省略中间的比较项,我们可以将这一项的index设置为K,如上的模式项,K为2 注意在串中,数组的第一项是用来记录数据个数的。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
如上所述,KMP算法的关键,即根据模式串找到那个K(下面列出K所需要满足的条件)(当主串中第i个字符与子串中第j个字符失配时):
设主串为:s1s2……sn 子串为:p1p2……pn
则K的取值应满足:


----------------------》》》》》》》》》》》》》》》
归根结底,找模式串与串头重复的子串:
实例:

那么:如何找到模式串中的每一个元素的K,也即如图中的next数组:
代码敬上:
void get_next(SString T,int next[])
{ /* 求模式串T的next函数值并存入数组next 算法 4.7 */
int i=,j=;
next[]=;
while(i<T[])
if(j==||T[i]==T[j])
{
++i;
++j;
next[i]=j;
}
else
j=next[j]; /*精髓之处 当前面已经有了相似的比较的时候,直接借用前面的结果 两个大体的环境相似,则这两个大体的环境间就会存在相同的匹配环境,即已经记录的环境,如果错过了一些已经匹配了子串,则会导致K值比实际的要小,即后面的匹配必须依赖前面的匹配结果*/
}
上面代码解释:

1:j=0时,i和j都要相加并给next赋值
2:T[i] = T[j] ,i和j都要相加并给next赋值
如果上面两个都不满足,则需要将 j 往前指向,那么问题就来了,为什么不直接 j = 1,而需要将 next[j]的值赋给 j 呢,其实就如我在代码中所讲,不妨也举个栗子说明一下。

其实可以总结为一下几点,K的目的是定位偏移量的index,失配项的前面有几个与模式项的头部相等的,K就为这些数加1,而其实这几个数,正是我们所要跳过的。
KMP算法的劣势,其实,从寻找K的过程中我们就可以看出,KMP算法重度依赖模式串与主串存在许多部分匹配,不然~~~~~~
浅谈数据结构之KMP(串中的模式匹配算法)的更多相关文章
- 转:浅谈CSS在前端优化中一些值得注意的关键点
前端优化工作中要考虑的元素多种多样,而合理地使用CSS脚本可以在很大程度上优化页面的加载性能,以下我们就来浅谈CSS在前端优化中一些值得注意的关键点: 当谈到Web的“高性能”时,很多人想到的是页面加 ...
- 浅谈Python在信息学竞赛中的运用及Python的基本用法
浅谈Python在信息学竞赛中的运用及Python的基本用法 前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在& ...
- 【WebApi系列】浅谈HTTP在WebApi开发中的运用
WebApi系列文章 [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi参数的传递 [04]详解WebApi测试和PostMan [05]浅谈W ...
- 问题 1690: 算法4-7:KMP算法中的模式串移动数组
题目链接:https://www.dotcpp.com/oj/problem1690.html 题目描述 字符串的子串定位称为模式匹配,模式匹配可以有多种方法.简单的算法可以使用两重嵌套循环,时间复杂 ...
- 浅谈箭头函数和setTimeout中的this
箭头函数会改变this的指向,这个大家看文档都看到过,可是有没有具体理解呢?我发现自己应该可能大概是......emmmm,然后我整理了一遍,加强一下概念吧顺带再讲一下setTimeout这个函数改写 ...
- 【EF 2】浅谈ADO数据模型生成串(二):数据库连接串分析
导读:上篇博客中介绍了ADO生成串的前一部分,本篇博客结合报错,接着介绍剩下的部分. 一.代码展示 <span style="font-family:KaiTi_GB2312;font ...
- 浅谈《守望先锋》中的 ECS 构架
https://blog.codingnow.com/2017/06/overwatch_ecs.html 今天读了一篇 <守望先锋>架构设计与网络同步 .这是根据 GDC 2017 上的 ...
- 浅谈 MVVM 设计模式在 Unity3D 中的设计与实施
初识 MVVM 谈起 MVVM 设计模式,可能第一映像你会想到 WPF/Sliverlight,他们提供了的数据绑定(Data Binding),命令(Command)等功能,这让 MVVM 模式得到 ...
- 浅谈TCP/IP网络编程中socket的行为
我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: 1. TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) 2. Socket I/O系统 ...
随机推荐
- FusionCharts简明教程(一)---建立FusionCharts图形
由于该项目需要的报告需要做的事情,选择FusionCharts作为一种工具. 由于该报告没有任何接触,网上有没有更具体fusionCharts课程,所以我们决定做一个彻底的研究FusionCharts ...
- t持久化与集群部署开发详解
Quartz.net持久化与集群部署开发详解 序言 我前边有几篇文章有介绍过quartz的基本使用语法与类库.但是他的执行计划都是被写在本地的xml文件中.无法做集群部署,我让它看起来脆弱不堪,那是我 ...
- Directx11学习笔记【二十二】 用高度图实现地形
本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5827714.html 在前面我们曾经实现过简单的地形(Direct ...
- java计算器 图形用户界面 精简版
package com.rgy.entity; import java.awt.*; import java.awt.event.*; @SuppressWarnings("serial&q ...
- 【C语言探索之旅】 第一部分第四课第一章:变量的世界之内存那档事
内容简介 1.课程大纲 2.第一部分第四课第一章:变量的世界之内存那档事 3.第一部分第四课第二章预告:变量的世界之声明变量 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答 ...
- Memcahce(MC)系列(三)Memcached它PHP转让
由PHP转让Memcahce,首先,需要在server安装Memcache,如何安装Memcache这不是本文的重点, 大约memcache安装,谁的朋友有兴趣,请参阅这里:http://blog.c ...
- ubuntu突然卡住
ctrl+alt+f1.进username和password.然后进入: killall gnome-sesseion sudo pkill X 版权声明:本文博主原创文章,博客,未经同意不得转载.
- dojo在错误隐藏表行
1.错误叙述性说明 TypeError:role._by_idx[e.rowIndex].hide is not a function (54 out of range 3) 2. ...
- 每天的学习经验:SharePoint 2013 定义自己添加的产品清单。Callout菜单项、文档关注、SharePoint服务机端对象模型查询
前言: 前一段时间一直都比較忙.没有什么时间进行总结,刚好节前项目上线.同一时候趁着放假能够好好的对之前遇到的一些问题进行总结. 主要内容有使用SharePoint服务端对象模型进行查询.为Share ...
- RH253读书笔记(3)-Lab 3 Securing Networking
Lab 3 Securing Networking Goal: To build skills with the Netfilter packet filter Sequence 1: Applyin ...