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

相关推荐
二哈赛车手3 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
WangN24 小时前
Unitree RL Lab 学习笔记【通识】
人工智能·机器学习
栗子~~4 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
YDS8294 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
未若君雅裁5 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
AI人工智能+电脑小能手6 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
人工智能培训6 小时前
大模型与传统小模型、传统NLP模型的核心差异解析
人工智能·深度学习·神经网络·机器学习·生成对抗网络
阿维的博客日记6 小时前
Nacos 为什么能让配置动态生效?(涉及 @RefreshScope 注解)
java·spring
雨辰AI6 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务