数据结构 - KMP算法(C语言实现)

本文介绍了数据结构中的KMP算法,相较于简单的模式匹配算法,KMP算法能利用已匹配信息避免不必要的回溯,提高匹配效率。文章详细阐述了KMP算法的原理,并指出通过NEXT数组可以在匹配失败时直接调整模式串的位置,降低时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 简单模式匹配算法

 对某一个串中某子串定位的操作称为串的模式匹配。(注意:求出的是字串在主串中的起始位置)
 简单模式匹配算法的思想是:主串与模式串(待定位的串)从第一个位置开始进行比较,如果相等则比较下一字符,如果不相等则使模式串从第一个字符和主串的第二个字符进行比较,以此类推。
模式匹配算法

int Str_index(Str str, Str substr){
	//简单模式匹配算法
	int i=1,j=1,k=i;
	while(i<=str.length && j<=substr.length){
		if(str.ch[i] == substr.ch[j]){
			++i;	//当前字符匹配后移 
			++j;
		}
		else{		//当前不匹配k指针后移,模式串在k处从新比较 
			j=1;
			i = ++k;
		}
	}
	if(j>substr.length)
		return k;	//成功返回主串中相匹配的位置 
	else
		return 0;
}

 可以看出来,这种算法是很笨的一种算法,最坏的情况下时间复杂度为O(m*n)。

二. KMP算法
 上面的简单算法可以看出,当模式串前些元素已经比较完成的情况下匹配失败进行下一轮比较时,由于比较过的部分有可能是ABxxxAB型的,就是说我们可以利用已经部分匹配这个有效信息,保持i指针不回溯,通过修改j指针,让模式串尽量地移动到有效的位置,对于上面的例子,我们就是要跳过AB部分直接比较x的部分,原因就是AB部分已经在当前比较部分之前的尾部比较过了,因为我们可以直接看出需要跳到哪里,但是程序怎样知道应该跳到哪里呢?我们事先对模

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值