KMP算法在c++中的实现

字符串匹配问题是数据结构与算法这门课中的一个经典问题。在由Cormen与Leiserson合著的《算法导论》一书中,按照由简到繁的顺序推导了字符串匹配问题的四种解法,并最终给出了最经典的解决方案:KMP算法。下面将分别对这四种算法进行总结。

1.朴素字符串匹配方法

朴素字符串匹配方法是大多数人第一眼能够想到的方法:将目标文本逐字符作为起始字符,判断是否存在与模式匹配的子字符串。如果设目标文本长度为n,待匹配字符串长度为m,那么算法的总体复杂度是O(nm)。在待匹配字符长度较长时,该算法的复杂度尤其高。下面给出其在visual studio 2010平台下的实现代码:

void naive_string_matcher(const string &text,const string &s)
{
	int n=text.size(),m=s.size();
	if(n<m) { cout<<"文本的长度小于模式的长度,请重新输入!"<<endl; return; }
	clock_t start_time=clock(),end_time;
	for(int i=0;i<n-m+1;i++)
	{
		string temp=text.substr(i,m);
		if(temp==s)
		{
			cout<<"偏移量为"<<i<<"时,发现匹配子字符串!"<<endl;
		}
	}
	end_time=clock();
	cout<<"总计耗时:"<<(double)(end_time-start_time)/CLOCKS_PER_SEC<<"秒"<<endl;
}

需要说明的是,为了比较四种方法的时间复杂度,代码中还对算法整体的运行时间进行了统计。

2.Rabin-Karp算法

假定字符串生成的有限字符集是{0,1,2,3,4,5,6,7,8,9},那么是不是可以考虑将子字符串的比较转化为数值比较,从而降低复杂度?答案当然是可以的。

以目标文本text="23894687495596",待匹配文本s="8946"为例:text初始四个字符构成的数字t=2389,与8946不等;随后,进行如下处理:t=(t-2*1000)*10+4,从而将t转化为下四个连续字符组成的数字3894,同样与8946不等;随后,再进行处理:t=(t-3*1000)*10+6,值为8946,完成匹配!这就是Rabin—Karp算法的基本原理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值