gpt4 book ai didi

c++ - Boyer Moore k-mismatches 算法失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:48:22 25 4
gpt4 key购买 nike

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

代码是这样的

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);
}

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

关于c++ - Boyer Moore k-mismatches 算法失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9621977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com