首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Boyer-Moore算法中,为什么“if (bmGs[j] == m)”是必要的?

在Boyer-Moore算法中,为什么“if (bmGs[j] == m)”是必要的?
EN

Stack Overflow用户
提问于 2017-07-19 19:28:29
回答 1查看 96关注 0票数 0

代码如下所示:http://www-igm.univ-mlv.fr/~lecroq/string/node14.html

我的问题是在void preBmGs(char *x, int m, int bmGs[])函数中

为了更好地阅读,我粘贴了下面的函数:

代码语言:javascript
复制
void preBmGs(char *x, int m, int bmGs[]) {
   int i, j, suff[XSIZE];

   suffixes(x, m, suff);

   for (i = 0; i < m; ++i)
      bmGs[i] = m;
   j = 0;
   for (i = m - 1; i >= 0; --i)
      if (suff[i] == i + 1)
         for (; j < m - 1 - i; ++j)
            if (bmGs[j] == m)     //--here is my question, remove it, is ok ? --
               bmGs[j] = m - 1 - i;
   for (i = 0; i <= m - 2; ++i)
      bmGs[m - 1 - suff[i]] = m - 1 - i;
}

我的理由是:j是渐进式的,所以j肯定不会后退。

我读了很多关于BM的博客,但他们的代码都包含if (bmGs[j] == m)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-19 20:41:32

我想你是对的。它没有任何意义,因为对于m的范围,数组被初始化为m,直到语句if (bmGs[j] == m) bmGs bmGs[]没有被修改。而且也没有理由去检查bmGs[j] == m

因为它将总是等于m的范围(m),并且两个for循环都在有效范围内。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45189199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档