Eswlnk Blog Eswlnk Blog
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈
  • 注册
  • 登录
首页 › 代码发布 › 「代码发布」实现KMP字符串匹配算法

「代码发布」实现KMP字符串匹配算法

Eswlnk的头像
Eswlnk
2022-08-20 15:46:08
「代码发布」实现KMP字符串匹配算法-Eswlnk Blog
智能摘要 AI
本文介绍了字符串匹配中的KMP算法及其优化。通过分析字符串的前缀和后缀,定义了部分匹配值(PM)用于计算子串移动位数,公式为:子串移动位数 = 已匹配的字符串数 – 对应的部分匹配值。PM表右移一位得到next数组,简化匹配过程。然而,next数组在某些情况下仍存在重复比较的问题,因此引入nextval数组进行优化。nextval通过递归计算,避免不必要的重复比较,提高匹配效率。最终,优化后的KMP算法能够高效地解决字符串匹配问题。

字符串的前缀,后缀及部分匹配的值

a 前缀: {} 后缀: {} 最长相等前后最长度0
ab 前缀: {a} 后缀: {b} 最长相等前后最长度0
aba 前缀: {a}{ab} 后缀: {a}{ba} 最长相等前后最长度1
abab 前缀: {a}{ab}{aba} 后缀: {b}{ab}{bab} 最长相等前后最长度2
ababa 前缀: {a}{ab}{aba}{abab} 后缀: {a}{ba}{aba}{baba} 最长相等前后最长度3
ababa 的部分匹配值(PM)为 00123

「代码发布」实现KMP字符串匹配算法-Eswlnk Blog
实现KMP字符串匹配算法
Sababa
PM00123

而ababc 的部分匹配值(PM)为 00010

Sabcac
PM00010

通过公式计算移动位数

子串移动位数 = 已匹配的字符串数 – 对应的部分匹配值

第一趟

主串 a b a b c a b c a c b a b
         ^
子串 a b c

已匹配的字符串数: 2
对应的部分匹配值: 0
位移 2-0 个位数

主串 a b a b c a b c a c b a b
         ^
子串     a b c

第二趟

主串 a b a b c a b c a c b a b
                 ^
子串     a b c a c

已匹配的字符串数: 4
对应的部分匹配值: 1
位移 4-1 个位数

主串 a b a b c a b c a c b a b
                 ^
子串           a b c a c

第三趟

主串 a b a b c a b c a c b a b
                       ^
子串           a b c a c

字串全部匹配完成

公式从何而来?

子串移动位数 = 已匹配的字符串数 – 对应的部分匹配值

主串 a b a b c a b c a c b a b
         |     | ^
子串     a b c a c
子串           a b c a c

位移子串移动位数 = 已匹配的字符串数 - 对应的部分匹配值对应的是图中的位移距离, 位移后只需从匹配失败的位置开始匹配

改进算法(next数组)

在上面的匹配中,每次匹配失败都需要去找上一个元素的部分匹配值,十分不方便,故将PM表整体右移一位(空缺用-1来补齐),就得到了 next 数组:

Sabcac
PM00010
NEXT-10001

子串移动位数 = 已匹配的字符串数 – 对应的部分匹配值
Move = (j-1)-PM[j-1]
Move = (j-1)-next[j]

相当于将字串的比较指正回退Move位
j=j-Move=j-(j-1)+next[j]=1+next[j]

此时我们将next数组整体+1方便计算

Sabcac
NEXT01112

此时就十分方便了:
在字串第j个字符与主串发生失配的情况下,跳转到子串的next[j]位置重新与主串的当前位置进行匹配

如何进行计算next数组?
1按照上面的推导方法进行计算 (人工)
2使用下面的公式进行计算 (计算机)
$p_{1}p_{2}…p_{m}$ 为子串 $s_{1}s_{2}…s_{n}$ 为主串

$next[i]=\left\{\begin{array}{l}0 &j=1 \\ max\{k|1<k<j且’p_1…p_{k-1}’=’p_{j-k+1}…P_{j-1}’\} &当此集合不空时 \\1 &其他情况\end{array}\right.$

执行结果

C:\Users\enjoy\CLionProjects\untitled\cmake-build-debug\untitled.exe
11

KMP算法的进一步优化 (nextval)

next 数组在某些的情况下是存在缺陷的,例如下面的情况

'aaaab'与'aaabaaaaab'进行匹配时
主串(s)aaabaaaaab
模式(p)aaaab     
j12345     
next[j]01234     

当p[4]与s[4]失配的情况下按next数组我们还需要进行 s[4]与p[3], s[4]与p[2], s[4]与p[1]的3次匹配,实际上这些匹配是毫无意义,必然失配的,怎样导致这种情况发生的呢?首先第一次失配我们是使用 s[4]与p[3] 进行比较,然后我们使用 s[4]与p[next[3]]进行比较,若此时 p[next[3]]==p[3] 那我们岂不是用相同字符串重复比较了吗?毫无意义,下面我们尝试进行优化以处理此情况。

当我们遇见这种情况 p[j]==p[next[j]] 的情况,我们只需要执行递归 next[next[j]],直到不相等为止,下面让我们看看代码如何去实现。

代码的实现

使用方法与next数组的使用方法一致,这里不过多赘述了。

本站默认网盘访问密码:1166
本站默认网盘访问密码:1166
kmpkmp算法next匹配字符串
0
0
Eswlnk的头像
Eswlnk
一个有点倒霉的研究牲站长
赞赏
「代码发布」CentOS环境挂载SMB实现共享文件夹
上一篇
「代码发布」实现博客或第三方网站嵌入bilibili视频
下一篇

评论 (0)

请登录以参与评论
现在登录
    发表评论

猜你喜欢

  • 「日志记录」逆向必应翻译网页版API实现免费调用
  • 「代码分享」第三方平台VIP视频解析API接口
  • 「至臻原创」某系统网站登录功能监测
  • 「开发日志」在Vue3中如何为路由Query参数标注类型
  • 「其他分享」分享一个在Tun模式下可用的脚本
Eswlnk的头像

Eswlnk

一个有点倒霉的研究牲站长
1108
文章
319
评论
679
获赞

随便看看

刷新百度小程序云缓存
2022-04-28 23:38:30
torch.autograd.Function 用法及注意事项
2022-08-02 23:40:40
「代码发布」k8s 网络转发问题记录
2022-08-16 16:16:25

文章目录

专题展示

WordPress53

工程实践37

热门标签

360 AI API CDN java linux Nginx PDF PHP python SEO Windows WordPress 云服务器 云服务器知识 代码 免费 安全 安卓 工具 开发日志 微信 微软 手机 插件 攻防 攻防对抗 教程 日志 渗透分析 源码 漏洞 电脑 破解 系统 编程 网站优化 网络 网络安全 脚本 苹果 谷歌 软件 运维 逆向
  • 首页
  • 知识库
  • 地图
Copyright © 2023-2025 Eswlnk Blog. Designed by XiaoWu.
本站CDN由 壹盾安全 提供高防CDN安全防护服务
蜀ICP备20002650号-10
页面生成用时 0.830 秒   |  SQL查询 42 次
本站勉强运行:
友情链接: Eswlnk Blog 网站渗透 倦意博客 特资啦!个人资源分享站 祭夜博客 iBAAO壹宝头条
  • WordPress142
  • 网络安全64
  • 漏洞52
  • 软件52
  • 安全48
现在登录
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈