首页 > 编程语言 >数据结构中的算法-KMP算法

数据结构中的算法-KMP算法

时间:2024-05-26 18:30:44浏览次数:26  
标签:子串 字符 指向 主串 next 算法 KMP 数据结构

一、KMP算法

串的模式匹配操作是指在当前串(主串)中寻找子串(模式串)的过程。当在主串中找到了和模式串相同的子串时,模式匹配成功;否则,模式匹配失败。当模式匹配成功时,返回模式串的首字符在主串中的位置;否则,返回-1。

1.1 暴力模式匹配算法(Brute-Force)

假设有主串S和模式串T,T的长度为T_len,S的长度大于T_len,则从主串的一个字符开始,向后寻找T_len个字符作为一个子串,如果此子串与T完全相同,则返回主串的第一个字符的位置;否则,从主串的第二个字符开始向后寻找T_len个字符作为一个子串与T比较,如果匹配,则返回主串的第二个字符的位置;否则,重复上述过程。直到找到与T匹配的子串或者循环到极限(再向后不满足有T_len个字符作为一个子串)。

1.2 KMP算法(next函数)

指针i指向主串中的字符,指针j指向模式串中的字符,每当出现字符不匹配时,只改变j的值,继续进行字符对比操作,而i的值不变。假设改变后j变为k,则j,k的关系表示为一个函数next,k=next(j),且此函数只与模式串有关,与主串无关。

通俗来讲,当前j值下,出现字符不匹配,也就是j指向字符之前的字符形成的T的子串是S的子串,记为M,且与i指向字符之前的若干个字符匹配。那么,寻找最大的0<k<j,使得以k为分界线,之前的所有字符为前缀,包括k所指字符之后的所有字符为后缀,满足后缀==前缀;若找不到这样的k,则k = 0。若j = 0,则k  = 0,i向后移一位,即i++。

1.3 KMP改进算法(nextval函数)

KMP算法使用next数组有j值得到k值有一个缺陷:如果k指向的字符与j指向的字符相同,那么令k指向的字符与i指向的字符相比较是多余的,因为肯定会匹配失败。所以,应在求出k值之后判定k指向的字符是否等于j指向的字符,如果是,那么令j = k,再进行一次next函数求k的过程,直到两字符不相等或达到next函数的终止条件为止。

1.4 C++实现

待完善。

标签:子串,字符,指向,主串,next,算法,KMP,数据结构
From: https://blog.csdn.net/weixin_47041940/article/details/139200413

相关文章

  • 算法设计与分析 头哥educoder 批处理作业调度
     给定n个作业的集合{J1,J2,…,Jn}。每个作业必须先由机器1处理,然后由机器2处理。所有任务必须先由机器1处理完成后,才能由机器2处理,并且在机器2的处理顺序必须与机器1的处理顺序一致,处理顺序一旦确定不能改变。设作业Ji需要机器1的处理时间为Ai,需要机器2的处理时间为Bi,怎样安......
  • 算法设计与分析 头哥educoder 旅行商问题
    设有n个城市组成的交通图,一个售货员从住地城市q出发,到其它城市各一次去推销货物,最后回到住地城市。要求:假定两个城市a,b从a到b的路程花费w_ab是已知的,问应该怎样选择一条花费最少的路线?输入格式:第一行nmq,n和m两个整数分别表示城市数n以及城市之间的单向路数量m,q表示住地城......
  • 风控图算法Graph Embedding(DeepWalk&Node2Vec)代码实现
    风控图算法GraphEmbedding(DeepWalk&Node2Vec)代码实现在上一篇中我们简单介绍了常用的GraphEmbedding算法,今天来对其中较为常用的两种算法——DeepWalk和Node2Vec进行python代码实现。文章目录风控图算法GraphEmbedding(DeepWalk&Node2Vec)代码实现一、KarateClub算......
  • 银行家算法—安全状态
    银行家算法中设置4个数据结构:Max:进程对资源的最大需求数Allocation:已分配给该进程的资源数Need:目前该进程还需要的资源数(在已分配部分资源情况下)******    且   Need=Max-Allocation  ******Available:系统中可用资源的数目......
  • 代码随想录算法训练营第第18天 | 513.找树左下角的值 、112. 路径总和 、106.从中
    找树左下角的值本地递归偏难,反而迭代简单属于模板题,两种方法掌握一下题目链接/文章讲解/视频讲解:https://programmercarl.com/0513.找树左下角的值.html/***Definitionforabinarytreenode.*functionTreeNode(val,left,right){*this.val=(val===undef......
  • 超简单白话文机器学习 - 回归树&树剪枝(含算法介绍,公式,源代码实现以及调包实现)
    1.回归树1.1算法介绍大家看到这篇文章时想必已经对树这个概念已经有基础了,如果不是很了解的朋友可以看看笔者的这篇文章:超简单白话文机器学习-决策树算法全解(含算法介绍,公式,源代码实现以及调包实现)_白话决策树-CSDN博客对于回归树的建立,我们一般使用CART回归树,CART(Clas......
  • 自用:常见算法竞赛/刷题问题 & 模板
    以下是我平常刷题遇到的部分常见问题,随手记录一下。(不定时更新)基本算法二维前缀和for(inti=1;i<=m;++i){ for(intj=1;j<=n;++j) { pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+nums[i][j]; }}//异或版本for(inti=1;i......
  • 数据结构:二叉树与树
    一树的基本概念:1.树的形状:2.树的定义:树是一种非线性的数据结构,它是n(n>=0)个结点的有限集。当n=0时,称为空树。在任意一棵非空树中应满足:2.1有且仅有一个特定的称为根的结点。2.2当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1……Tm,其中每个集合本身又是......
  • 数据结构第一篇【探究List和ArrayList之间的奥秘 】
    数据结构第一篇【探究List和ArrayList之间的奥秘】前言List什么是List?ListArrayListArrayList使用ArrayList常见操作ArrayList的遍历ArrayList的扩容机制ArrayList的具体使用前言......
  • 数据结构(python版)
    数据结构与算法python队列queue详见python3自定义比较器python比较器Pythonheapq自定义比较器#自定义比较器#1.对list等有key参数的##二维数组等的比较排序list1.sort(key=lambdax:x[1])##list中放置其他数据类型importfunctools#cmp的返回值为负数,第一个数......