您的位置:首页 > 产品设计 > UI/UE

一种改进的字符串匹配算法--Quick Search算法

2011-05-19 16:54 1901 查看
作为BM算法改进中的一种,QS算法原理简单,易于编写及调试,且速度与BM不相上下,约是KMP的3倍。在Daniel M Sunday的论文"A very fast substring search algorithm"中有详细的论述,QS是其中最简单的一种,另外两种复杂但效率更高。

算法说明:

令模式串为p={p[0],p[1],...,p[m-1]},长度为m。文本串为T={T[0],T[1],...,T[n-1]},长度为n.要求n>=m.

令k为p在T上的对齐位置,即p[0]与T[k],p[1]与T[k+1],.....,p[m-1]与T[k+m-1]相对应,检测在位置k是否匹配时只要逐个检查以上相对应的字符即可。当在某个位置发生失配时,根据T[k+m]来决定模式串向右移动的位置,因为一旦发生失配,模式串至少向右移动一位,因此T[k+m]必然要和模式串中相同字符的最右端出现相对应,否则会发生另一次失配。如果模式串中无T[k+m]字符,则将模式串向右移动m+1个位置。而在检查P与T的字符是否匹配时可以使用任意的顺序,而不必从左至右或从右至左,这是与KMP或BM最大的区别。

以下代码计算模式串的出现过的字母所在的位置,即p[m-1]的字母位置记为1,p[m-2]记为2,如果一个字母在模式串中出现多次,则记录最右边的出现位置。

void precompute(string p,map<char,int>&pos)
{
for(int i=p.length()-1;i>=0;--i)
{
if(pos.find(p[i])==pos.end())
pos.insert(pair<char,int>(p[i],p.length()-i));
}
}


以下这部分为quick search 主体函数

void quicksearch(string p,string text,map<char,int>pos)
{
int k=0,m=p.length();
while(k+m<=text.length())
{
int j=0;
for(;j<m;++j)
{
if(p[j]!=text[k+j])
{
if(k+m>=text.length())
return;
if(pos.find(text[k+m])!=pos.end())
k+=pos[text[k+m]];
else
{
k=k+m+1;
}
break;
}
}
if(j==m)
{

cout<<text<<endl;
return;
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: