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 数组就行
相关推荐
Andrew_Ryan4 分钟前
llama.cpp Build Instructions
算法
玖剹10 分钟前
递归练习题(四)
c语言·数据结构·c++·算法·leetcode·深度优先·深度优先遍历
做人不要太理性11 分钟前
【Linux系统】线程的同步与互斥:核心原理、锁机制与实战代码
linux·服务器·算法
向阳逐梦20 分钟前
DC-DC Buck 电路(降压转换器)全面解析
人工智能·算法
Mz122124 分钟前
day04 小美的区间删除
数据结构·算法
_OP_CHEN32 分钟前
算法基础篇:(十九)吃透 BFS!从原理到实战,解锁宽度优先搜索的核心玩法
算法·蓝桥杯·bfs·宽度优先·算法竞赛·acm/icpc
小猪咪piggy41 分钟前
【算法】day 20 leetcode 贪心
算法·leetcode·职场和发展
forestsea1 小时前
现代 JavaScript 加密技术详解:Web Crypto API 与常见算法实践
前端·javascript·算法
张洪权1 小时前
bcrypt 加密
算法
快手技术1 小时前
视频理解霸榜!快手 Keye-VL 旗舰模型重磅开源,多模态视频感知领头羊
算法