一种改进的字符串匹配算法--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,如果一个字母在模式串中出现多次,则记录最右边的出现位置。
以下这部分为quick search 主体函数
算法说明:
令模式串为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; } } }
相关文章推荐
- 【算法】一种字符串匹配算法:z-algorithm
- 字符串匹配--BM算法的改进的算法 Sunday Algorithm
- 字符串匹配及kmp改进算法
- BM(Boyer-Moore)字符串匹配算法的实现(一种有效常用的字符串匹配算法)
- 首尾匹配--字符串匹配的一种改进
- 字符串匹配算法之KMP
- 字符串匹配算法 – Sunday算法
- 常见的字符串匹配算法对比实现C语言版本
- 字符串匹配算法-KMP
- 模式匹配的一种改进算法----KMP算法
- 字符串匹配的三种算法
- 算法——字符串匹配之KMP算法
- 4种字符串匹配算法:有限自动机(中)
- 字符串匹配之boyer moore算法
- 字符串匹配(KMP 算法 含代码)
- 【算法分析】字符串匹配:BF、KMP算法
- 字符串匹配自动机的算法原理
- 算法实现-->字符串匹配
- 字符串匹配---暴力匹配算法
- 字符串匹配算法之KMP