Boyer-Moore k失配算法失败

Boyer Moore k-mismatches algorithm fails

本文关键字:失败 算法 失配 Boyer-Moore      更新时间:2023-10-16

我在一个编程网站上做了一个字符串比较程序,其中一个不匹配。它给了我错误的答案。我已经做了大量的工作,但是,我找不到代码失败的测试用例。有人能为我提供代码失败的测试用例吗。我使用Boyer-Moore Horspool k失配算法进行了比较,因为这是最快的搜索算法

代码就是这样的

int BMSearch_k(string text, string pattern, int tlen, int mlen,int pos)
{    
int i, j=0,ready[256],skip2[256][mlen-1],neq;
for(i=0; i<256; ++i) ready[i] = mlen;
for(int a=0; a<256;a++) {
    for(i = mlen;i>mlen-k;i--)
    skip2[i][a] = mlen;
}    
for(i = mlen-2;i>=1;i--)    {
    for(j=ready[pattern[i]]-1;j>=max(i,mlen-k);j--)
        skip2[j][pattern[i]] = j-i;
    ready[pattern[i]] = max(i,mlen-k);
}
j = mlen-1+pos;
//cout<<"n--jafffa--n"<<pos<<"+"<<mlen<<"="<<j<<endl;
while(j<tlen+k) {
    //cout<<"t--"<<j<<endl;
    int h = j;
    i=mlen-1;
    int neq=0,shift = mlen-k;
    while(i>=0&&neq<=k)    {
        //cout<<"t--"<<i<<endl;
        if(i>=mlen-k)
            shift = min(shift,skip2[i][text[h]]);
        if(text[h]!= pattern[i])
            neq++;
        i--;
        h--;
    }
    if(neq<=k)
        return j-1;
    j += shift;
}
return -1;
}

您没有正确初始化数组,

int i, j=0,ready[256],skip2[256][mlen-1],neq;
for(i=0; i<256; ++i) ready[i] = mlen;
for(int a=0; a<256;a++) {
    for(i = mlen;i>mlen-k;i--)
    skip2[i][a] = mlen;
}

一方面,您将skip2声明为256×(mlen-1)数组,另一方面,将其填充为(mlen+1)×256数组。

在下一个循环中,

for(i = mlen-2;i>=1;i--)    {
    for(j=ready[pattern[i]]-1;j>=max(i,mlen-k);j--)
        skip2[j][pattern[i]] = j-i;
    ready[pattern[i]] = max(i,mlen-k);
}

在设置CCD_ 4之前使用它。我不知道这些错误是否是导致测试用例失败的原因,但很容易想象它们确实如此

如果Daniel的建议不能解决问题,这里还有几件看起来很奇怪的事情:

    return j-1;  // I would expect "return j;" here

这看起来很奇怪,因为如果你有k=0,mlen=1,那么j可以取的最高值是tlen+k-1,所以最高返回值是tlen-2。换句话说,将模式"a"与字符串"a"匹配不会在位置0处返回匹配项。

另一个奇怪的地方是循环:

    for(i = mlen-2;i>=1;i--) // I would expect "for(i = mlen-2;i>=0;i--)" here

奇怪的是,在预处理中,您永远不会访问模式中的第一个字符(即,模式[0]未被读取)。