[基于后缀搜索的方法] Horspool 算法
Horspool算法是首个对BM算法进行简化的算法。Horspool算法对d3进行了一些修改,使其易于计算并能产生更大的跳跃距离。
对于每个搜索窗口,该算法将窗口内文本的最后一个字符和模式串的最后一个字符进行比较。如果相等,则需要一个验证过程。该验证过程在搜索窗口中从后向前对文本和模式串进行比较,直到完全相等或者在某个字符处不匹配。然后,无论匹配与否,都将根据窗口内文本的最后一个字符的下一个出现位置将窗口向右移动。
我的Horspool算法c++版实现代码:
1 void Horspool(char *p, char *t) 2 { 3 int Pstr_len,Tstr_len,i,pos; 4 int d[128]; 5 Pstr_len = strlen(p); 6 Tstr_len = strlen(t); 7 //Preprocessing 8 for(i=0;i<128;i++) 9 { 10 d[i] = Pstr_len; 11 } 12 for(i=0;i<Pstr_len-1;i++) 13 { 14 d[p[i]] = Pstr_len - i; 15 } 16 17 //Searching 18 pos = 0; 19 while(pos<=Tstr_len-Pstr_len) 20 { 21 i = Pstr_len-1; 22 while(i>0&&t[pos+i]==p[i]) 23 { 24 i = i-1; 25 } 26 if(i==0) 27 { 28 cout<<"match at"<<pos+1<<endl; 29 } 30 pos = pos + d[t[pos+Pstr_len]]; 31 } 32 }
根据实验结果,随着字母表大小的增加,Horspool算法越来越占据绝对优势。