Boyer-Moore k失配算法失败
Boyer Moore k-mismatches algorithm fails
我在一个编程网站上做了一个字符串比较程序,其中一个不匹配。它给了我错误的答案。我已经做了大量的工作,但是,我找不到代码失败的测试用例。有人能为我提供代码失败的测试用例吗。我使用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]未被读取)。
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 视图中的参数推导失败:take_while
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 链接到自行创建的dll失败
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 标准中是否有类似折叠的算法(或失败:提升)可用?
- C++ std::向量插入两个元素替代算法失败
- 快速选择算法因元素重复而失败
- 不同的std::random_shuffle算法导致iOS模拟器单元测试失败
- Boyer-Moore k失配算法失败
- 弗洛伊德的寻周期算法什么时候会失败?