串的模式匹配算法---Horspool及其实现

Horspool算法是一种基于后缀的匹配方法,它的主要难点在于如何安全地移动窗口,以避免遗漏可能的成功匹配。

 

1,Horspool的基本思想

  horspool算法将主串中匹配窗口的最后一个字符跟模式串中的最后一个字符比较。如果相等,继续从后向前对主串和模式串进行比较,直到完全相等或者在某个字符处不匹配为止(如下图中的α与σ失配) 。如果不匹配,则根据主串匹配窗口中的最后一个字符β在模式串中的下一个出现位置将窗口向右移动。

image

 

2,Horspool的求解过程

此处选择参考文献[1]中的一个例子来详细介绍下Horspool的求解过程

在序列AGATACGATATATAC中搜索字符串ATATA。

首先,要构造失配时模式串中元素的移动距离数组d:

image

然后开始逐次匹配:

1)A G A T A C G A T A T A T A C

    A T A T A

   在主串的G处失配,此时模式串向右移动的距离是d[A]=2

2)A G A T A C G A T A T A T A C

          A T A T A

  又在主串G处失配,此时模式串向右移动的距离是d[G]=5

3)A G A T A C G A T A T A T A C

                        A T A T A

 此处发现了一个匹配,我们可以继续往下找,此时模式串向右移动的距离是d[A]=2

4)A G A T A C G A T A T A T A C

                              A T A T A

 呃。。。又发现了一个匹配,再继续往下找吧,此时模式串向右移动的距离依然是d[A]=2

5)A G A T A C G A T A T A T A C

                                   A T A T A

移动后,主串指针pos>n-m了,搜索过程结束。

 

3,Horspool算法实现

  这里我提供了一个第2小节中提到的DNA子串查找的horspool算法实现。

复制代码
 1 /*
 2  * implementation of Horspool
 3  * Author:Horspool
 4  * Coder: Cobbliu
 5  */
 6 #define WORD 26
 7 int horspool(char *T, int lenT, char *P, int lenP)
 8 {
 9     int d[WORD];
10     int i, pos, j;
11 
12     for(i = 0; i != WORD; i++)
13         d[i] = lenP;
14     for(i = 0; i != (lenP-1); i++)
15         d[P[i]-'A'] = lenP-i-1;
16 
17     pos = 0;
18     while(pos < (lenT-lenP)){
19         j = lenP-1;
20         while(j >= 0 && T[pos+j]==P[j])  //matching
21             j--;
22         if(j == -1)
23             return pos;
24         else //not matched
25             pos += d[T[pos+lenP-1]-'A'];
26     }
27 
28     return -1;
29 }
复制代码

 

4,Horspool算法复杂度

     假设主串的长度为n,模式串的长度为m,那么Horspool算法最坏情况下的时间复杂度是O(mn),但平均情况下它的时间复杂度是O(n)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值