Horspool字符串匹配算法

Horspool是后缀搜索,也就是搜索已读入文本中是否含有模式串的后缀;如果有,是多长,显然,当后缀长度等于模式串的长度时,我们就找到了一个匹配。
Horspool算法认为:对于每个文本搜索窗口,将窗口内的最后一个字符(C)与模式串的最后一个字符进行比较。如果相等,则继续从后向前验证其他字符,直到完全相等或者某个字符不匹配。然后,无论匹配与否,都将根据在模式串的下一个出现位置将窗口向右移动。

匹配串:abcbcsdxzcxx

模式串:cbcac

这个时候我们从右向左进行对暗号,c-c,恩对上了,第二个b-a,不对啊,我们应该怎么办?难道就这么放弃么。于是,模式串从不匹配的那个字符开始从右向左寻找匹配串中不匹配的字符b的位置,结果发现居然有,赶快对上赶快对上,别耽误了。

匹配串:abcbcsdxzcxx

模式串:   cbcac

然后继续从最右边的字符从右向左进行比较。这时候,我们发现了,d-c不匹配啊,而且模式穿里面没有噢,没办法,只好移动一个模式串长度的单位了。

匹配串:abcbcsdxzcxx

模式串:           cbcac

判断模式串是否出现在源串的i位时,从i+m-1位开始比较,当比较到不同的时候。根据i+m-1位的内容对i作跳转。

如果i+m-1位的字符不在模式串中出现,则i+=m,

(这是因为i+m-1不在模式串里出现,则从i,i+1,i+m-1开始的串,都不可能完全匹配。) 

否则寻找该字符在模式串中最后一次出现的位置,

       如果最后一次是出现在最后一位,

                 则找再上一次的出现,如果找不到,则i+=m,

        i += m-最后一次出现的位置

       (原因是,完全匹配的时候,至少i+m-1是匹配的,所以这个移动是找最后的一个位置,使得i+m-1位匹配)

真正编程的时候,不用写这么多分支处理,直接在预处理的时候,用一个数组表示i每次要加上的数就行了。(对数组的理解,映射表)

int HorspoolMatch(byte* pSrc, int nSrcSize, byte* pSubSrc, int nSubSrcSize)
{
    if (nSubSrcSize > nSrcSize)
    {
        return -1;
    }

    short skip[256]; 
    for(int i = 0; i < 256; i++)
    {
        skip[i] = nSubSrcSize;
    }
    for(int i = 0; i < nSubSrcSize - 1; i++)
    {
        skip[pSubSrc[i]] = nSubSrcSize - i - 1;
    }

    int pos = 0;
    while(pos <= nSrcSize - nSubSrcSize)
    {
        int j = nSubSrcSize -1;
        while(j >= 0 && pSrc[pos + j] == pSubSrc[j])
        {
            j--;
        }
        if(j < 0 )
        {
            break;
        }
        pos = pos + skip[pSrc[pos + nSubSrcSize -1]];
    }
    return pos;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值