数据结构之字符串KMP

什么是串?我之前也会觉得这不是很简单,abcd,里面ab就算串,突然明白了那一句,永远不要觉得自己已经知道了

1-串的本质是线性表,那串就是特殊的线性表,之前线性表元素没有限制元素范围,串的元素限制一定得是字母,还有一个比较特殊的是什么,串的操作都是针对不只一个元素进行的,就是针对子串

2-既然是线性表,那么存储方式就那么几种,要么静态固定长度,优点好取好查,缺点不好增删,自动回收,要么动态,就是设置一个指针,一个个往后加,就是得手动free,第三种是为了解决不好增删的缺点,链式存储,块链存储,就是可以存储多个字符在一个元素,缺点明显就是密度低

3-因为串主要不是针对单个,所以无法用之前和普通线性表一样的增删改查函数以及逻辑,就需要针对串的特殊性做很多对多个字符,即子串进行操作的特殊函数,StrAssign赋值,这种,复制,清空,判空,比较(先出现更小),串长,子串,定位,联接,销毁这种,都是针对子串

4-接下来是我们的主要算法-模式匹配,先想,为什么要针对这个kmp算法想那么多优化呢?和增删改查什么关系?因为串本质是针对子串操作,最常用就是一段找一小段操作,不管进行哪一种操作,找到它,匹配它,都是必经之路

4.1-朴素的kmp是,自然而然想到的就是暴力,主串列出所有可能子串,一一对比模式串(mn复杂度)

太复杂了怎么办,优化,一切优化的本性是去重,是分析每一次怎么运动的,怎么计算的,发现重复,降低重复,不走回头路的同时,走的还是康庄大道

4.2-浅优化的kmp是next,匹配不变的是什么,不是主串,主串是会变的,是模式串,模式串的重复会导致和主串匹配的重复,这里是发现了模式串的子串有重复,故不匹配的时候,找下一个地方,优化的就是这个下一个地方,不重复匹配重复的模式串的子串,next(j)=j前重复长度s再+1,这样就减少了重复子串匹配的次数

4.3-进一步优化的kmp是nextval,前面是模式串里面重复子串的重复,还有什么重复呢?之前的大的,现在是少的重复,这样才是细化的方向,落实在串里就是有没有重复的字母/字符,比如很多个a一起出现,如果前面a不匹配,后面a也是不匹配,这就是重复,怎么降低,那就后面的a的next(j)就用之前a的next(j)的值,这样就减少了重复字母匹配的次数

相关推荐
李可以量化19 分钟前
Tornado 从了解到精通(一)下:异步与非阻塞 IO 核心原理
java·数据库·tornado
yurenpai(27届找实习中)21 分钟前
从销售订单推送 MES 看懂微服务调用(二):DTO 转换与 OpenFeign 调用
java·微服务·架构·服务调用
phoenix@Capricornus22 分钟前
从统计决策到贝叶斯估计
人工智能·算法·机器学习
Patrick在香港27 分钟前
Python爬虫框架实战:优雅抓取香港政府公开API数据的通用方案
java·开发语言·爬虫·python·ai编程·数据可视化·可用性测试
hey_sml37 分钟前
MySQL常用操作速记:从字符集到游标全解析
java·开发语言·mysql
掉鱼的猫40 分钟前
Solon AOT & Native:三段式编译,从 Java 到原生可执行文件
java·云原生
Java内核笔记43 分钟前
容错能力进入 spring-core:Spring Boot 4 原生重试机制全解析
java·后端
未秃头的程序猿1 小时前
虚拟线程上线一周后翻车了——pinning问题排查实录
java·后端·架构
wuminyu1 小时前
JDK21解决虚拟线程IO阻塞原理剖析
java·linux·c语言·jvm·c++
带刺的坐椅1 小时前
Solon AOT & Native:三段式编译,从 Java 到原生可执行文件
java·aot·solon·native