04-4.2.2 KMP 算法

  • 👋 Hi, I'm @Beast Cheng
  • 👀 I'm interested in photography, hiking, landscape...
  • 🌱 I'm currently learning python, javascript, kotlin...
  • 📫 How to reach me --> 458290771@qq.com

喜欢《数据结构》部分笔记的小伙伴可以订阅专栏,今后还会不断更新。🧑‍💻

此外,《程序员必备技能》专栏日后会逐步更新,感兴趣的小伙伴可以点一下订阅、收藏、关注!🚀

谢谢大家!🙏

对于模式串 T = "abaabc"

  • 第六个 元素匹配失败时,可令主串指针i不变 ,模式串指针 j=3
  • 第五个 元素匹配失败时,可令主串指针i不变 ,模式串指针 j=2
  • 第四个 元素匹配失败时,可令主串指针i不变 ,模式串指针 j=2
  • 第三个 元素匹配失败时,可令主串指针i不变 ,模式串指针 j=1
  • 第二个 元素匹配失败时,可令主串指针i不变 ,模式串指针 j=1
  • 第一个 元素匹配失败时,可令主串指针i不变 ,模式串指针 j=0, i++, j++
    通过一个 next 数组来存储模式串 T 的序号,next 数组只和模式串有关,和主串无关
    用代码表示刚才的逻辑:
c 复制代码
if(s[i] != T[j])
	j = next[j];
if(j == 0){
	i++; j++;
}

KMP 算法的逻辑

根据模式串 T ,求出 next 数组 --> 利用 next 数组进行匹配(主串指针不回溯


先来看第二步:利用 next 数组进行匹配(主串指针不回溯

代码实现:

c 复制代码
int Index_KMP(SString S, SString T, int next[]){
	int i = 1, j = 1;
	while(i <= S.length && j <= T.length){
		if(j == 0 || S.ch[i] == T.ch[j]){
			++i; ++j;  // 继续比较后续字符
		}else
			j = next[j];  // 模式串向右移动
	}
	if(j > T.length)
		return i-T.length;  // 匹配成功
	else
		return 0;
}

朴素模式匹配算法,最坏时间复杂度: O ( n m ) O(nm) O(nm)

KMP算法,最坏时间复杂度: O ( n + m ) O(n+m) O(n+m)

  • 其中,求 next 数组时间复杂度 O ( m ) O(m) O(m)
  • 在考研中,只需要大家能够手动求出 next 数组就行
相关推荐
想吃火锅10052 分钟前
【leetcode】1.两数之和js版
javascript·算法·leetcode
qeen872 分钟前
【C++】类与对象之类的默认成员函数(二)
android·c语言·开发语言·c++·笔记·学习
m0_7360348510 分钟前
存储基础和虚拟化
笔记
net3m331 小时前
一阶软件低通滤波器算法
人工智能·算法
水木流年追梦1 小时前
大模型入门-大模型优化方法12-YaRN 长文本外推技术
人工智能·分布式·算法·正则表达式·prompt
J-Tony112 小时前
【JVM】三色标记法
java·jvm·算法
wengad2 小时前
机器学习实践理论基础|算法、模型和数据集
人工智能·算法·机器学习
AOwhisky2 小时前
MySQL 学习笔记(第六期):MySQL 备份与恢复
运维·数据库·笔记·学习·mysql·云计算
华山沦贱3 小时前
open62541 V1.5.4版对C++ Builder支持的bug
笔记
梦梦代码精3 小时前
为什么这个开源的AI平台会火?有点东西。。。
人工智能·算法·机器学习·docker·开源