热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

c++kmp算法字符匹配_数据结构基础串模式匹配算法KMP

改进的模式匹配算法(KMP):改进之处在于,当匹配过程中出现相比较的字符不相等时,不需要回退主串的字符位置指针,而是利用已经

改进的模式匹配算法(KMP):

改进之处在于,当匹配过程中出现相比较的字符不相等时,不需要回退主串的字符位置指针,而是利用已经得到的“部分匹配”的字符,将模式串向右滑动尽可能远的距离,再进行比较。具体向右滑动多少距离,就得依据next函数值进行计算。依据模式串next函数值整理的表,就叫《部分匹配表》。

滑动距离=已“部分匹配”的字符数-next函数值。

部分匹配表如何产生:

  • 1.第一种方式:

“前缀”:除了最后一个字符外,一个字符串的全部头部组合。

“后缀”:除了第一个字符外,一个字符串的全部尾部组合。

“部分匹配值“:指前缀和后缀的最长共有元素的长度。也就是next函数值。

部分匹配表,就是根据部分匹配值(next函数值)整理得出。

如果模式串为abababb,则部分匹配表如下所示:

6dbec1bedb55b77d217605c7c9175f80.png

部分匹配表

我们定义下标0为字符串的开始,规定next[0]=-1;

j=1时,前面字符串a,前缀和后缀都为空集,共有元素最长长度为0;

j=2时,前面字符串ab,前缀为【a】,后缀为【b】,没有共有元素,共有元素最长长度为0;

j=3时,前面字符串aba,前缀为【a】【ab】,后缀为【a】【ba】,共有元素最长长度为1;

j=4时,前面字符串abab,前缀为【a】【ab】【aba】,后缀为【b】【ab】【bab】,共有元素最长长度为2;

j=5时,前面字符串ababa,前缀为【a】【ab】【aba】【abab】,后缀为【a】【ba】【aba】【baba】,共有元素最长长度为3;

j=6时,前面字符串ababab,前缀为【a】【ab】【aba】【abab】【ababa】,后缀为【b】【ab】【bab】【abab】【babab】,共有元素最长长度为4;

  • 2.第二种方式

next函数定义如下:

63b62de371bf4313b00d18978c325649.png

next函数

如果模式串为abababb,根据next函数:

当j=0时,next[0]=-1。

当j=1时,因0

当j=2时,0

当j=3时,0

当j=4时,0

当j=5时,0

依次计算,就可以得到如图部分匹配表中的结果。

next函数推导过程如下:

我们定义串中的位置指针分别为i(主串指针)和j(模式串指针),第一个位置以下标0开始,如下图所示:

e04f7b94d340e2f8d549bd56cdbe790f.png

根据KMP基本思想,当匹配到C和B不相等时,指针需要移动一定的距离,通过看上图我们发现,j需要移动到第二个位置,即C处,如下图所示的位置:

cccbf6cd8c06f0ca4d2fd4e6f94ce83b.png

我们设匹配失败时,j要移动的下一个位置为k,此时k移动的位置只能在0到k之间,即0

1b93b01b0a0f8bd5b11d376bd02185ae.png

定义主串字符组为T,模式串字符组为P。

如上图所示,此时我们发现0

整体总结如下:

当T[i] != P[j]时

由T[i-j ~ i-1] = P[0~j-1]

由P[0 ~ k-1] == P[j-k ~ j-1]

必然:T[i-k ~ i-1] == P[0 ~ k-1]

next函数值算法脚本
db20e5db853149885922951c7b58f67f.png

next函数




推荐阅读
  • 本文探讨了基于协同过滤算法的个性化新闻推荐系统中,新闻与新闻之间的相似度是如何计算和存储的,并进一步分析了类似系统的实际应用。 ... [详细]
  • 深入理解二分查找及其应用
    二分查找是一种高效的搜索算法,适用于有序数据集合。其核心思想是通过不断将查找区间缩小一半,直至找到目标元素或区间为空。本文将详细介绍二分查找的基本原理、实现方法以及应用场景的局限性。 ... [详细]
  • 短暂的人生中,IT和技术只是其中的一部分。无论换工作还是换行业,最终的目标是成功、荣誉和收获。本文探讨了技术人员如何跳出纯技术的局限,实现更大的职业发展。 ... [详细]
  • 机器学习算法:SVM(支持向量机)
    SVM算法(SupportVectorMachine,支持向量机)的核心思想有2点:1、如果数据线性可分,那么基于最大间隔的方式来确定超平面,以确保全局最优, ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 专业人士如何做自媒体 ... [详细]
  • 本文总结了《编程珠玑》第12章关于采样问题的算法描述与改进,并提供了详细的编程实践记录。参考了其他博主的总结,链接为:http://blog.csdn.net/neicole/article/details/8518602。 ... [详细]
  • 三角测量计算三维坐标的代码_双目三维重建——层次化重建思考
    双目三维重建——层次化重建思考FesianXu2020.7.22atANTFINANCIALintern前言本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐 ... [详细]
  • 非计算机专业的朋友如何拿下多个Offer
    大家好,我是归辰。秋招结束后,我已顺利入职,并应公子龙的邀请,分享一些秋招面试的心得体会,希望能帮助到学弟学妹们,让他们在未来的面试中更加顺利。 ... [详细]
  • PHP实现汉诺塔算法
    昨天研究了一天汉诺塔算法都没搞懂,感觉自己智商被碾压了,还不如《猩球崛起》中的那一只猩猩!!!起源传说最早发明这个问题的人是法国数学家『爱德华·卢卡斯』。在世界中心贝拿勒斯(在印度 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • 本文介绍了如何通过路由汇总和无类域间路由(CIDR)技术来优化路由表,减少路由条目数量,提高网络效率。具体案例展示了路由汇总的实现方法及其对网络性能的影响。 ... [详细]
  • 双指针法在链表问题中应用广泛,能够高效解决多种经典问题,如合并两个有序链表、合并多个有序链表、查找倒数第k个节点等。本文将详细介绍这些应用场景及其解决方案。 ... [详细]
  • 本文介绍了如何使用Visual Studio Code、Sublime Text等编辑器批量删除MATLAB代码中的注释和空行,同时提供了一些高级技巧以确保代码的整洁。 ... [详细]
  • 本文介绍了几种常用的图像相似度对比方法,包括直方图方法、图像模板匹配、PSNR峰值信噪比、SSIM结构相似性和感知哈希算法。每种方法都有其优缺点,适用于不同的应用场景。 ... [详细]
author-avatar
来自星星的小小鱼
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有