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

相关推荐
小当家.1051 分钟前
AIGrader:一个 AI 作业批改平台的 Java EE 课设实战
java·人工智能·java-ee
m沐沐4 分钟前
【深度学习】PyTorch CNN 手写数字识别(卷积神经网络)
人工智能·pytorch·python·深度学习·机器学习·pycharm·cnn
devilnumber4 分钟前
Lambda|行为参数化 完整精讲
java·lambda·行为参数化
garmin Chen5 分钟前
Prompt工程入门:让AI按你的要求工作(3)--Prompt工程与提示词安全评测概述
java·人工智能·python·安全·prompt
阿正的梦工坊6 分钟前
【Rust】05-结构体、枚举与模式匹配
java·数据库·rust
阿正的梦工坊8 分钟前
【Rust】10-Cargo、测试与实用开发工作流
java·rust·log4j
用户298698530149 分钟前
Java 实战:Word 文档中超链接的添加与自定义技巧
java·后端
swordbob17 分钟前
Spring事务失效的场景
java·开发语言·spring
王莎莎-MinerU17 分钟前
从 OCR 到 Context Engineering:用 MinerU 搭一个可复现文档解析评测
人工智能·深度学习·机器学习·pdf·ocr·个人开发
ZHW_AI课题组17 分钟前
基于KNN的帕尔默企鹅种类预测分类
人工智能·机器学习·分类·数据挖掘