KMP模式匹配算法总结

KMP算法详解-彻底清楚了(转载+部分原创) KMP算法详解-彻底清楚了(转载+部分原创) 引言 KMP算法指的是字符串模式匹配算法,问题是:在主串T中找到第一次出现完整子串P时的起始位置。该算法是三位大牛:D.E.Knuth、J.H.Morris和V.R.Pratt同时发现的,以其名字首字母命名。在网上看了不少对KMP算法的解析,大多写的不甚明了。直到我看到一篇博客的介绍,看完基本了解... 阅读详情

KMP算法主要是对朴素的模式匹配算法的改进,假设有String A和String B,i为A的首个字母的下标,j为B的首个字母的下标,即i=0,j=0,现要在A中匹配B,若用朴素的模式匹配算法,则i需要不断的回溯,如A=acbxacbd,B=abcd,当i=3,j=3时,发现字符不相等,如果使用的是朴素的模式匹配算法,则需要将i回溯为1,即i=i-j+1,而j=0。

若用的是KMP模式匹配算法,i不需要回溯,只有j根据字符串B的具体情况回溯到相应位置。

KMP解决了朴素匹配模式算法中的i和j的回溯问题,提高了字符串匹配的效率


KMP算法主要分为两部份

第一部分为方法getNext(),其数组的元素为在对应字符不相等时j需要回溯到字符串B的相应位置

public void getNext(String str,int[] next){
		int i=0,j=-1;
		next[0] = -1;
		while(i<str.length()-1){
			if(j==-1||str.charAt(i)==str.charAt(j)){				
				i++;
				j++;
				next[i]=j;
			}else{
				j=next[j];
			}			
		}		
	}


第二部分为方法indexKMP(),相对应与朴素匹配算法,在判断条件中加了j==-1和i、j回溯方法的不同

public void indexKMP(String A,String B,int[] next){
		int i=0,j=0;
		while(i<A.length()&&j<B.length()){
			if(j==-1||A.charAt(i)==B.charAt(j)){
				i++;
				j++;
				
			}else{
				j=next[j];
			}
			
			
			
		}
		if(j>=B.length())
			System.out.println("查找成功");
		else
			System.out.println("该字符串不存在");
		
	}



总结

相对于朴素的模式匹配算法,KMP主要解决了就算上一轮的匹配不成功,也能为下一轮的匹配提供信息,使得i不用回溯,而j回溯到最合适的位置。

朴素的模式匹配算法的时间复杂度为((n-m+1)*m),而KMP提高为n+m

注:m为A的长度,n为B的长度








KMP匹配的模式算法——保姆级解读(图文版) 一,写在前面 了解一种优化和高效算法,是基于一定普通算法改良和提升的,讲KMP算法前,我们应该首先了解朴素的模式算法。 二,朴素的模式匹配算法 找一个单词在一篇文章(相当于一个大字符串)中的定位问题。这种子串的定位操作通常称做串的模式匹配,应该算是串中最重要的操作之一。 假设我们要从下面的主串 S="goodgoogle”中,找到T=“google"这个子串的位置。我们通常需要下面的步骤。 1.主串S第一位开始,S与T前三个字母都匹配成功,但S第四个字母是d而T的是g。第一位匹配失败。如图所示,其中 阅读详情

相关推荐

[数据结构]模式匹配算法--KMP算法详解

KMP

weixin_43717520的博客 1万+

KMP算法的优化与详解

1. KMP算法 1.1 定义 Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP算法”,常用于在一个文本串S内查找一个模式串P 的出现位置,这个算法由Donald Knuth、Vaughan Pratt、James H. Morris三人于1977年联合发表,故取这3人的姓氏命名此算法。 下面先直接给出KMP的算法流程(如果感到一点点不适,没关系,坚持下...

weixin_30716141的博客 908

字符串模式匹配算法——KMP算法

字符串是一种常见的数据结构,它由一个字符序列组成,可以被视为字符的数组或列表。每个字符都有一个对应的索引位置,允许对字符串进行访问、修改和操作。对于字符串而言,寻找字符串中子串的位置是最重要的操作之一,查找子串位置的操作通常称为。

m0_73609199的博客 3732

字符串匹配代码C语言,KMP算法(快速模式匹配算法)详解以及C语言实现

通过上一节的介绍,学习了普通模式匹配算法,大体思路是:模式串从主串的第一个字符开始匹配,每匹配失败,主串中记录匹配进度的指针 i 都要进行 i-j+1 的回退操作(这个过程称为“指针回溯”),同时模式串向后移动一个字符的位置。一次次的循环,直到匹配成功或者程序结束。"KMP"算法相比于"BF"算法,优势在于:在保证指针 i 不回溯的前提下,当匹配失败时,让模式串向右移动最大的距离;并且可以在O(n...

weixin_42546508的博客 1564

重庆大学数据结构实验报告,串的操作与KMP模式匹配算法源码及结果截屏

这是重庆大学数据结构实验报告,题目是串的操作与KMP模式匹配算法。里面有完整的实验流程,包括源码及结果截屏

数据结果 kmp算法实验报告

kmp算法,数据结构的实验报告,大学实验报告,希望能帮到大家

KMP算法的next求解

题目: 在字符串的KMP模式匹配算法中,需要求解模式串p的next函数值,其定义如下所示。若模式串p为"aaabaaa",则其next函数值为0123123。 解析: 当j=1时 next[1]=0; 当j=2时 找不到k next[2]=1; 当j=3时 k=2 p1=p2 a=a next[3]=2; 当j=4时 k=2,3 ...

weixin_39851786的博客 1474

解决ADS1.2报错Cannot obtain license

报错如下 将licenses文件下的license内容进行修改: 修改为如下内容即可。 # # Generated on 2021-dec-1 by licwizard # PACKAGE ads armlmd 1.200 E32F0DE5161D COMPONENTS="armasm compiler bats armulate axd adwu fromelf armlink codewarrior armsd" INCREMENT ads armlmd 1.200 permanent uncounte

qq_46110320的博客 3462

KMP模式匹配算法

KMP模式匹配算法的分析介绍

daye_的博客 3348

SD--根据订单创建出库单(相关的函数列表的介绍系列篇(2))

创建订单样例代码参见:http://blog.youkuaiyun.com/CompassButton/archive/2007/05/09/1601712.aspx 可以根据一个订单或者部分订单项来创建出库单,代码如下:* Populating the item data lx_sales_item-ref_doc = l_vbeln. lx_sales_item-ref_item = c_000010

SAP BLOG--Jack Wu 6226

vivado2020.2安装教程:Windows平台完整指南

手把手带你完成vivado2020.2安装教程,覆盖下载、配置到验证全过程,解决常见安装问题,确保在Windows平台顺利部署开发环境,适合初学者快速上手。

weixin_42607969的博客 1344

串的模式匹配算法——KMP 算法

重点掌握KMP匹配算法的原理及next数组的推理过程,并了解nextval数组的求解方法。

kusunoki的博客 3360

【Python机器学习实战】 | 基于PCA主成分分析技术读入空气质量监测数据进行数据预处理并计算空气质量综合评测结果

主成分分析(Principal Component Analysis, PCA)是一种常用的机器学习和数据分析技术,用于降低数据维度、识别数据中的模式、发现变量之间的关系等。

一伦明悦的博客 1263

模式匹配和KMP算法详解

字串的定位操作通常称作串的。最基本的模式匹配算法就是从主串(S)的第一个字符开始,逐字符与模式串(T)进行匹配。这种匹配方式简单但费时,下面给出这种匹配算法的简单实现根据模式匹配算法的两重循环可知,模式匹配算法的时间复杂度为On∗m其中,n和m为主串和模式串的长度。上面的时间复杂度是模式匹配算法的最坏情况,在这种情况下,主串除了首尾的几个字符,几乎每个字符都有可能与模式串的匹配m次,这在很多情况下效率是极低的。那么,我们有没有可能让主串的每个字符基本只和模式串匹配一次呢?

Delores_Lin的博客 2199

C++实战指南:使用CodeBlocks构建跨平台wxWidgets窗口应用

本文是一份面向C++初学者的实战指南,详细介绍了如何使用CodeBlocks IDE和wxWidgets框架快速构建跨平台的桌面窗口应用。内容涵盖从环境搭建、项目配置到界面设计、事件处理的全流程,重点讲解了如何利用CodeBlocks的开箱即用支持和wxSmith可视化设计器,高效开发具有按钮、菜单、列表等控件的交互式窗口界面程序,帮助读者轻松入门GUI开发。

weixin_29012677的博客 154

嵌入式软件面试常见问题及答案

干了多年的嵌入式,被面试过,也面过不少新人,下面这些是面试中很常见的一些问题及答案,答案可以根据自己的经验自己思考下。--持续补充并更新

weixin_37553721的博客 6022

【算法】串的模式匹配——BF算法与KMP算法详解

本文属于【算法】系列文章,主要介绍针对“串”数据结构的两种常用模式匹配算法,即BF算法与KMP算法。 本文从原始的BF算法开始讨论其实现以及缺陷并设想解决方案,以此引出KMP算法的设计思路,并抛出KMP算法的重要部件——next表的得出方法及代码实现,最后总结了nextval表的计算步骤。

Ethan's blog 2381

论文阅读-Whisper语音识别(OpenAI)

Whisper 是一个自动语音识别(ASR,Automatic Speech Recognition)系统,OpenAI 通过从网络上收集了 68 万小时的多语言,其中11万小时覆盖96 种语言,12万小时的语言标号为英语,用多任务(multitask)监督数据对 Whisper 进行了训练。

一位不是很硕的鉴伪方向硕士 6366
上一篇: 字符编码介绍
下一篇: https详解
ZengBlog
博客等级 码龄10年 29粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值