模式串匹配算法(朴素模式匹配与KMP)的机算与手算。

news/2024/10/30 23:22:28/

一.朴素模式匹配

1.机算

其实就是暴力匹配。
使用双指针 i (指向主串) j (指向模式串)
从主串 S 第一字符起,与模式串 T, 第一个字符比较,
  ①若相同,则 i 与 j 统一向后移
  ②若遇到 i 与 j 指向字符不同,回溯 i j 指针。继续如此,直至匹配成功j超出模式串,或者 匹配失败 i 超出主串。
在这里插入图片描述

2.手算

略。

二.KMP next[ ]

1.机算求next [ ] 数组

由于朴素模式匹配中,i j 指针的疯狂回溯,造成了时间复杂度的巨大。
我们可以很明显的观察到,i j 指针很多时候没必要回溯这么狠。
我们是否可以根据 “模式串” 研究出 i j 指针匹配失败时候,回溯的位置?-----next [ ]数组。

2.手算求next [ ] 数组

为了对应算法,废弃next[0],直接从next[1]开始存储。
1.第一个与第二个固定,永远都为0 1
  next [ 1 ] = 0
  next [ 2 ] = 1
2.其他
在不匹配位置前,划一个分界线。模式串一步步向右滑,直到分界线之前能对的上,或模式串完全跨过分界线为止,此时 j 指向的位置即为对应next值。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三.KMP优化 nextval[ ]

1.机算求nextval[ ]

有这样情况:
但是本次回溯后的匹配注定是失败的,我们不应该让其匹配,可以让其直接从“第一个失败后 j 指针的位置开始”。
在这里插入图片描述
机算求nextvam[ ]略。

2.手算求nextval[ ]

①先求出模式串T 对应的next [ ]数组。
②nextval[ 0 ]舍弃,nextval[ 1 ] = 0.
③如果当前字符与对应next [ j ] 所指字符相等,让 nextval[ j ] = nextval[ next[j] ];
 否则 nextval[ j ] = next[ j ]
在这里插入图片描述


http://www.ppmy.cn/news/65813.html

相关文章

JVM系列-第6章-方法区

方法区 栈、堆、方法区的交互关系 从线程共享与否的角度来看 ThreadLocal:如何保证多个线程在并发环境下的安全性?典型场景就是数据库连接管理,以及会话管理。 栈、堆、方法区的交互关系 下面涉及了对象的访问定位 Person 类的 .class …

如何压缩pdf文件大小?四种方法随意选择

如何压缩pdf文件大小?PDF文件格式由于其跨平台性,易于浏览、打印和传输等特点,在现代社会中广泛应用于各个领域。然而,随着PDF文件越来越大,传输及存储所需的时间也会变得越来越长,从而降低了工作效率。在这…

“技术开发最应该做什么?”,聊聊我在服务端开发5年的理解和收获

我们新推出大淘宝技术年度特刊《长期主义,往往从一些小事开始——工程师成长总结专题》,专题收录多位工程师真诚的心路历程与经验思考,覆盖终端、服务端、数据算法、技术质量等7大技术领域,欢迎一起沟通交流。 本文为此系列第二篇…

RK3588平台开发系列讲解(内存篇)Linux 伙伴系统数据结构

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、 页二、区三、内存节点沉淀、分享、成长,让自己和他人都能有所收获!😄 📢Linux 系统中,用来管理物理内存页面的伙伴系统,以及负责分配比页更小的内存对象的 SLAB 分配器了。 本篇将介绍伙伴系统相关数据结…

Swift的高级语法特性,如可选类型、闭包、枚举、泛型、协议、扩展等

Swift是一门现代化的编程语言,具有许多高级语法特性,下面我们来逐一介绍。 1. 可选类型(Optional) Swift中的可选类型是一种特殊的类型,它可以表示一个值是存在或不存在的。在声明一个可选类型时,需要在类…

Kyligence Zen产品体验-从人找数据到数据找人

目录 前言: 一、什么是Kyligence Zen? 1、个人总结 2、官方简介 二、1分钟打开新世界大门 个人总结: 1、注册 2、验证登录 三、上手初体验 1、快速上手(入门) 2、定制化应用 四、实战体验 综述: 1、卡…

性能测试入门实践路线图

我转行做软件测试工作已有六年多了, 从功能到自动化测试,然后负责性能测试团队和质量团队的技术专项治理,再到测试专家角色,负责整个技术项目的产品/运营和质量保障工作。 其中性能测试和线上稳定性保障,算是我最擅长…

Vue3(3)组件

目录 一、组件注册 1.全局注册 2.局部注册 二、Props 一、组件注册 一个 Vue 组件在使用前需要先被“注册”,这样 Vue 才能在渲染模板时找到其对应的实现。组件注册有两种方式:全局注册和局部注册。 1.全局注册 我们可以使用Vue应用实例的app.compon…