KMP超高效匹配算法

这篇具有很好参考价值的文章主要介绍了KMP超高效匹配算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        江河入海,知识涌动,这是我参与江海计划的第1篇。

简介:

        KMP算法是一种改进的字符串匹配算法,其中,KMP算法的运用核心是利用匹配失败后的信息,最大进度的减少模式串与目标串的匹配次数以达到快速匹配的效果。算法与暴力求解的改进在于每当一趟匹配过程中出现的字符比较不相等时,指向目标串的指针不在回到"原点",而是利用已经得到的”部分匹配“的结果将模式串向右移动最大且和目标串已匹配的距离后进行比较,总的来说就是目标串不回退,模式串回退,直到结束为止。

KMP实现如图:

KMP超高效匹配算法,算法,c语言

        在图中,第一次比较不成功时,i= 3,j = 3,此时,i指针不变,需要将模式串向右移动两个字符的位置,继续进行i = 3,j = 1的下一趟比较;第二趟匹配中,前四个字符比较成功,但i = 7, j = 5时比较失败,此时将模式串向右移动3个字符的位置,继续进行i = 7,j = 2的下一趟比较,直至比较成功。

        注意,在整套算法体系中,指向目标串的指针i不会退,因此,一旦模式串在某个位置匹配失败后就要回退到某个位置与目标串继续进行匹配。


模式匹配:

        然而,在此,我们可发现,KMP算法中难点就在于模式串在匹配失败后要回退的位置。

        目标串的每个元素都要进行模式匹配,因此,当模式串的每个元素都有一个回退某个具体位置的指标,我们用next整型数组进行存储,即next[j] = k(j模式串的具体位置,k 为回退到模式串的具体位置)。

其中,k的值是这样规定的:

        1,规则:找到匹配成功部分的两个相等的真子串(注意:不包含本身,因为本身还要进行匹配),一个以下标0开始,另一个以j - 1下标结尾,即模式串的头部和尾部(原因可思考一下)。

        2,不管什么数据next[0] = -1;next[1] = 0;在这里,我们以下标来开始,而说到的第几个是从1开始。

下面我们运用以上原理来求模式串的next数组:

        KMP超高效匹配算法,算法,c语言


       以上的定位数组next的定位一定要根据模式串与目标串前后匹配成功的最大次数来定,而具体的匹配是根据模式串的前面和目标串的某个可以与之匹配的最大次数。

        到这里,我们手动求解定位数组next问题不大,那么,接下来要怎么用代码来求解呢?首先,我们先来观察已知条件,在求解next[i + 1]中,我们已知next[i]  = k;如果我们能够通过next[i]的值,再根据数学转换得到next[i + 1]的值,那么就能够实现整个数组的内容。

        首先,已知数组next[i] = k成立,具体的实现next数组我用图形的形式跟大家来演示:

KMP超高效匹配算法,算法,c语言

接下来我用C代码的形式来演示一遍定位数组的求解:

//next代表定位数组,a代表模式串,lena代表模式串的长度
void Next(int* next, char* a, int lena)
{
	next[0] = -1;
	next[1] = 0;
	int j = 2, k = 0;
	while (j < lena) {
		if (k == -1 || a[k] == a[j - 1]) {
			next[j] = k + 1;
			j++;
			k++;
		}
		else
		{
			k = next[k];
		}
	}
}

        其中,定位数组算法的时间复杂度效率为O(lena)

具体运用代码如下:

int KMP(char* str, int strlen, char* a, int alen, int* next)
{
	assert(strlen || alen);
	int i = 0, j = 0;
	while (i < strlen && j < alen) {
		//匹配成功,进行下一步
		if (j == -1 || str[i] == a[j]) {
			i++;
			j++;
		}
		//当不满足匹配时,进行回退,直到匹配成功为止
		else {
			j = next[j];
		}
	}
	//模式匹配成功
	if (j == alen) {
		return i - j + 1;
	}
	//模式匹配失败
	else {
		return -1;
	}
}

补:部分书籍KMP高效匹配可能有些不同,但基本思路都相同,此算法的效率很高,时间复杂度为O(alen + strlen).文章来源地址https://www.toymoban.com/news/detail-695505.html

到了这里,关于KMP超高效匹配算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 字符串匹配-KMP算法

    KMP算法,字符串匹配算法,给定一个主串S,和一个字串T,返回字串T与之S匹配的数组下标。 在学KMP算法之前,对于两个字符串,主串S,和字串T,我们根据暴力匹配,定义两个指针,i指向主串S的起始,j指向字串T的起始,依次比较,如果 主串i位置的值等于子串j位置的值,

    2024年02月14日
    浏览(54)
  • 【kmp算法】字符串匹配

    kmp算法解决的是字符串匹配的问题,具体来说假定我们要在主串s[ ] 中匹配模式串p[ ],找到匹配到的位置loc; 最自然的想法是暴力写法 (BF)枚举主串字符s[ i ] ,和模式串p[ j ]。一个一个匹配,如果匹配失败,i指针回退回起点,往前进一位,再次进行比较,知道匹配成功。

    2024年02月04日
    浏览(73)
  • 【考研】串的模式匹配算法——KMP算法(含真题)

    本文内容源于对《数据结构(C语言版)》(第2版)、王道讲解学习所得心得、笔记整理和总结,以便复习。 可搭配以下链接一起学习: 【考研】《数据结构》知识点总结.pdf_考研数据结构知识点总结-其它文档类资源-CSDN文库 【2023考研】数据结构常考应用典型例题(含真题

    2023年04月24日
    浏览(28)
  • 算法基础(一):串匹配问题(BF,KMP算法)

    好家伙,学算法, 这篇看完,如果没有学会KMP算法,麻烦给我点踩 希望你能拿起纸和笔,一边阅读一边思考,看完这篇文章大概需要(20分钟的时间)   我们学这个算法是为了解决 串匹配 的问题 那什么是串匹配? 举个例子: 我要在\\\"彭于晏 吴彦祖 \\\"这段字符串中找到\\\" 吴彦祖 \\\"字符串 这

    2024年02月08日
    浏览(78)
  • 字符串匹配算法(BF&&KMP)

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【数据结构初阶(C实现)】 在学习这个算法之前,我们先来看看什么时字符串匹配算法,简单来说 有一个主串和一个子串,查找子串在主串的位置,然后返回这个位置

    2023年04月17日
    浏览(39)
  • 【数据结构】朴素模式匹配 & KMP算法

    🌈 自在飞花轻似梦,无边丝雨细如愁 🌈   🌟 正式开始学习数据结构啦~此专栏作为学习过程中的记录 🌟 子串的定位操作通常称为串的模式匹配,它求的是模式串在主串中的位置,而朴素模式匹配就是一种不断移动主串指针,每一次都和模式串依次进行比较的暴力求解方法

    2024年02月16日
    浏览(44)
  • 《数据结构》实验报告四:串的模式匹配(BF算法、KMP算法)

    1、了解 串 的基本概念。 2、掌握 串的模式匹配算法 的实现 。 说明以下概念 1、模式匹配:          串的模式匹配就是 子串的定位运算 。          设有两个字符串 S 和 T ,S为 主串(正文串) ,T为 子串(模式串) 。在主串S中查找与模式串T相匹配的子串,若匹配成功,确定

    2024年02月01日
    浏览(55)
  • 【数据结构】字符串匹配|BF算法|KMP算法|next数组的优化

    字符串匹配算法是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目,本文主要介绍BF算法(最好想到的算法,也最好实现)和KMP算法(最经典的) BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标S的第一个字符与模式串T的第一

    2024年02月04日
    浏览(53)
  • 【数据结构】模式匹配之KMP算法与Bug日志—C/C++实现

    ​ 🌈 个人主页: Sarapines Programmer 🔥  系列专栏: 《数据结构奇遇记》 🔖墨香寄清辞: 墨痕寄壮志,星辰梦未满。 通幽径心凝意,剑指苍穹势如山。 目录 🌞1. 模式匹配的基本概念 🌞2. 模式匹配的解决办法 🎈2.1 暴力匹配(BF)算法 🎈2.2 KMP算法 🤖2.3 BUG记录_KMP算法 1

    2024年02月04日
    浏览(51)
  • C#,字符串匹配(模式搜索)KMP算法的源代码与数据可视化

      D.E.Knuth   J.H.Morris KMP 算法(Knuth-Morris-Pratt 算法)是其中一个著名的、传统的字符串匹配算法,效率比较高。 KMP算法由 D.E.Knuth , J.H.Morris 和 V.R.Pratt 在 Brute-Force 算法的基础上提出的模式匹配的改进算法。因此人们称它为“克努特—莫里斯—普拉特算法”,简称KMP算法。K

    2024年01月25日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包