KMP模式匹配算法

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

模式失配函数(failure function)

定义:令p=p[0]p[1]...p[n-1]是一个模式,则其失配函数f定义为:

f(j) =   i为满足i<j且使得p[0]p[1]...p[i] = p[j-i]p[j-i+1]...p[j]的最大整数  如果 i≥0

            -1           否则

f(·)的取值i可以等于0,但必须小于j.

例如对于模式pat  = ABCABCACAB ,有

j    0  1  2  3  4  5  6  7  8  9
pat  A  B  C  A  B  C  A  C  A  B
f   -1 -1 -1  0  1  2  3 -1  0  1
根据失配函数的定义,得到如下模式匹配规则:如果出现了形如s[i-j]...s[i-1] = p[0]p[1]...p[j-1]且s[i] ≠ p[j]的部分匹配,那么,若j ≠0,则下一趟模式匹配时,从失配字符s[i]和模式串字符p[f(j-1)+1]处重新开始比较;而若j = 0时,则继续比较s[i+1]和p[0]。

失配函数可以如下计算:

void fail(char *pat, int failure[])
{
	int n = strlen(pat);
	/* init failure[0] to -1 */
	failure[0] = -1;
	int i;
	for(int j=1;j<n;j++)
	{
		i = failure[j-1];
		/* searching till that pat[f...f(j-1)+1] == pat[j] */
		while(pat[j]!=pat[i+1] && i>=0)
		{
			i = failure[i];
		}
		if(pat[j]==pat[i+1])
			failure[j] = i + 1;
		else
			failure[j] = -1;
	}
}

利用失配函数得到的KMP模式匹配算法:

int kmp(char *str,char *pat)
{
	int i = 0, j = 0;
	int lenp = strlen(pat);
	int lens = strlen(str);
	int *failure = (int*)malloc(sizeof(int)*lenp);
	fail(pat,failure);
	while(i<lens && j<lenp)
	{
		if (str[i] == pat[j]) {
			i++;
			j++;
		}
		else
			if (j==0)
				i++;
			else j = failure[j-1] + 1;
	}
	free(failure);
	return ( (j==lenp) ? (i-lenp) : -1);

}
测试数据:

BBC ABCDAB ABCDABCDABDE
ABCDABD
Position: 15



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

相关推荐

KMP匹配的模式算法——保姆级解读(图文版)

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

耀的博客 4354

KMP 模式匹配算法

next 数组的推导KMP 模式匹配算法是为了解决在一个主串中去寻找子串的问题,在没有 KMP 算法之前,人们采用那种人们最容易想到的以字串按照主串从首位开始一位一位后移的方法,但是这种方法很费时间,例如下面例子:当比较到最后一位的时候,发现该段不匹配,接下来指针又要回溯到开头,开始第二个遍历,但是很明显第二个也不会存在匹配的情况,但是这种算法是无法判别的,所以就需要一种非常高效的匹配算法,于是,就衍生出了 KMP 算法,要熟悉 KMP 算法,就必须要知道模式串的 next 数组怎么推导。

jiu_yue_ya的博客 2183

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

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

m0_73609199的博客 3732

KMP 算法详解

KMP算法是一种高效的字符串匹配算法,算法名称取自于三位共同发明人名字的首字母组合。该算法的主要使用场景就是在字符串(也叫主串)中的模式串(也叫子串)定位问题,常见的有“求子串出现的起始位置”、“求子串的出现次数”等。

这里是阿安的博客 5万+

字符串的模式匹配 (朴素模式匹配算法 ,KMP算法)

字符串的模式匹配 寻找字符串p在字符串t中首次出现的起始位置 字符串的顺序存储 typedef struct { char str[MAXSIZE]; int length; }seqstring; 朴素的模式匹配算法 基本思想:用p中的每一个字符去与t中的字符一一比较。 模式p 正文 t 如果匹配成功,则返回p在t中首次出现的起始位置 如果匹配不成功则返回-1 最坏情况比...

( :3 ) 2579

快速模式匹配算法(KMP)的深入理解

恐怕现在用过电脑的人,一定都知道大部分带文本编辑功能的软件都有一个快捷键ctrl+f 吧(比如word)。这个功能主要来完成“查找”,“替换”和“全部替换”功能的,其实这就是典型的模式匹配的应用,即在文本文件中查找串。1.模式匹配模式匹配的模型大概是这样的:给定两个字符串变量S和P,其中S成为目标串,其中包含n个字符,P称为模式串,包含m个字符,其中m<=n。从S的给定位置(通常是S的第一个位置)开始搜索模式P。如果找到,则返回模式P在目标串中的位置(即:P的第一个字符在S中的下标)。如果在目标串S中没有找到模式串P,则返回-1.这就是模式匹配的定义啦,下面来看看怎么实现模式匹配算法吧。2.朴

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

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

kusunoki的博客 3360

Unity通过Vosk实现离线语音识别方法

以下是一个使用 Unity 和 Vosk(一个开源的离线语音识别库)的简单示例。将Vosk的DLL文件(如libvosk.dll、vosk.dll等)放入Assets/Plugins文件夹中。通过以上步骤,你可以在Unity中实现一个简单的离线语音识别功能。音频格式:确保录音的音频格式与Vosk模型要求的格式一致(通常是16kHz、16bit单声道)。首先,你需要下载Vosk的语音识别模型。在Assets文件夹中创建一个Plugins文件夹,用于存放Vosk的DLL文件。打开Unity并创建一个新的项目。

qq_39515892的博客 2070

模式匹配和KMP算法详解

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

Delores_Lin的博客 2199

一窥Memory测试算法及自我修复机制

摘要 为了满足新一代设备的需求,Memory的大小每三年就会增加4倍。深亚微米设备包含大量面积更小、访问速度更快的Memory。针对此类设计制定自动测试策略可以减少ATE(自动测试设备)的时间和成本。 内存故障的行为与经典的“Stuck-At”故障不同。因此,Memory的故障模型(由于其阵列结构)与标准逻辑的设计也是不同的。Memory测试除了进行故障检测和定位,还可以实现用冗余单元对...

路科验证 2万+

OCSP环境搭建--Windows Server 2016

OCSP环境搭建--Windows Server 2016 一. OCSP环境中相关信息 1. 服务器1 操作系统:Win Server 2016 Standard版 IP地址:172.16.0.19/23,网关:172.16.0.1,首选DNS:127.0.0.1 服务器角色:域控制器、证书颁发机构、radius服务器、DNS服务器 ...

CsdnCHong_566的博客 3351

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

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

Ethan's blog 2381

MavLink协议入门

MAVLink是一个非常轻量化的开源的消息协议,用于无人机之间的通信以及无人机机载设备之间的通信。

ffffffeiyu的博客 2474
上一篇: 桶排序
下一篇: 幂运算的O(lgn)算法
Scandinavians
博客等级 码龄19年 36粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值