数据结构之字符串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)的值,这样就减少了重复字母匹配的次数

相关推荐
heartbeat..3 小时前
Redis 中的锁:核心实现、类型与最佳实践
java·数据库·redis·缓存·并发
Prince-Peng3 小时前
技术架构系列 - 详解Redis
数据结构·数据库·redis·分布式·缓存·中间件·架构
4 小时前
java关于内部类
java·开发语言
好好沉淀4 小时前
Java 项目中的 .idea 与 target 文件夹
java·开发语言·intellij-idea
gusijin4 小时前
解决idea启动报错java: OutOfMemoryError: insufficient memory
java·ide·intellij-idea
To Be Clean Coder4 小时前
【Spring源码】createBean如何寻找构造器(二)——单参数构造器的场景
java·后端·spring
技术与健康4 小时前
什么是ADSE?逻辑驱动的软件工程新范式
软件工程
吨~吨~吨~4 小时前
解决 IntelliJ IDEA 运行时“命令行过长”问题:使用 JAR
java·ide·intellij-idea
你才是臭弟弟4 小时前
SpringBoot 集成MinIo(根据上传文件.后缀自动归类)
java·spring boot·后端
短剑重铸之日4 小时前
《设计模式》第二篇:单例模式
java·单例模式·设计模式·懒汉式·恶汉式