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 数组就行
相关推荐
code小毛孩1 小时前
leetcode hot100数组:缺失的第一个正数
数据结构·算法·leetcode
ZZHow10244 小时前
JavaWeb开发_Day05
java·笔记·web
饕餮争锋6 小时前
设计模式笔记_行为型_观察者模式
笔记·观察者模式·设计模式
legendary_bruce7 小时前
【22-决策树】
算法·决策树·机器学习
I'm a winner7 小时前
新手入门Makefile:FPGA项目实战教程(二)
笔记·fpga开发
艾伦~耶格尔8 小时前
【数据结构进阶】
java·开发语言·数据结构·学习·面试
max5006008 小时前
基于桥梁三维模型的无人机检测路径规划系统设计与实现
前端·javascript·python·算法·无人机·easyui
闪电麦坤959 小时前
数据结构:N个节点的二叉树有多少种(Number of Binary Trees Using N Nodes)
数据结构·二叉树·
汤姆大聪明10 小时前
【软件设计模式】前置知识类图、七大原则(精简笔记版)
笔记·设计模式
快去睡觉~10 小时前
力扣400:第N位数字
数据结构·算法·leetcode