KMP算法

本文深入探讨了KMP算法的核心思想及实现方式,通过对比BF算法,详细解释了如何利用KMP算法减少模式匹配过程中的回溯,提高匹配效率。

最近在学习KMP算法,现在记录下来,一方面是作为学习的总结,一方面加深自己的理解。

首先从问题出发,因为算法都是为了解决问题嘛。

问题描述

有两个串 s 和 t , 子串 t 的定位就是要在主串 s 中找到一个与子串 t 相等的子串。

问题分析:

首先扯一些概念,我们把主串 s 成为目标串,把子串 t 称为模式串,而这个问题就是经典的模式匹配问题。

OK,切入正题,看到问题,第一个想法就是遍历嘛,从主串 s 的第一个字符开始,跟子串 t 中的字符一一比对,相等的话,就继续比对,

不相等的话,就从主串 s 的第二个字符开始,继续和子串 t 中的字符一一比对,如此循环,一直到在主串 s 中找到匹配串,或者到 主串 s 遍历

完。而这就是BF(Brute-Force)算法,这算法存在一个效率问题,就是主串的遍历存在大量的回溯,

例如:假设 s = "abcabdabcabcd" ,t = "abcabcd", 那么匹配过程如下:

第一次比对:

a  b  c  a  b  d  a  b  c  a  b  c  d

|    |   |   |    |   |  

a  b  c  a  b  c  d

第二次比对:

a  b  c  a  b  d  a  b  c  a  b  c  d

     |  

_ a  b  c  a  b  c  d

如上,一直匹配到主串 s 的第 6 个字符才失败,而第二次比对就又回溯到主串 s 的第 2 个字符重新开始匹配。

那么,有没有什么方法可以减少这种回溯呢?

还是分析上面那个例子,子串一直匹配到 ‘c’ ,即 “abcabc”,除了最后一个字符 ‘c’ 与主串 s 不匹配,前面的子串 “abcab” 都是和主串 s 匹配

的,那么下一次比对,我们就可以直接从主串中的下一个字符 ‘a’ 开始,也就是从 “abcabc” 中的从左向右数的第二个字符 'a' 开始,(因为在这

之前的比对肯定都是匹配失败的),如果从第二个字符 'a' 开始,往右的每个字符,一直到 最后一个字符 ‘c’ 的前一个字符为止,都能和子串从第

一个字符 ‘a’ 开始的字符一一匹配,那么下一次匹配就能直接从第二个字符 'a' 开始匹配了。

以上就是KMP算法的核心内容,整体思路就是从子串 t 下手,想方设法的减少对主串 s 的回溯,方法就是寻找子串 t 的某种规则,规则如下:

假设子串 t = "t0 t1 t2 t3 ... tn",,对于 t 中的任意字符tj, 找到这样一个整数k, 0<=k<j,使得 t0 t1 t2 ... tk = tk-1 tk tk+1... tj-1,而匹配子串 tk-1 tk tk+1... tj-1

必须是符合条件的最大匹配子串。这样,就可以利用这个最大匹配子串来尽量减少匹配过程中的回溯。

我们用一个数组next[] ,封装子串 t 中的每一个字符对应的最大匹配子串,并规定next[0] = -1, next[1] = 0,从next[2]开始,数组元素的值等于其

对应的最大匹配子串的字符数,还是分析上例, 子串 t = "abcabcd",那么next[] = {-1, 0, 0, 0, 1, 2, 3},这样就可以利用数组next[] 去减少回溯,

今天就写到这,下次再写吧。



源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值