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

时间:2017-07-19 11:28:29

标签: c++ algorithm

代码显示在此处:http://www-igm.univ-mlv.fr/~lecroq/string/node14.html

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

为了更好的阅读,我粘贴下面的功能:

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)

1 个答案:

答案 0 :(得分:0)

我认为你是对的。它没有意义,因为bmGs []被初始化为m,范围为m,直到语句为止 if (bmGs[j] == m) bmGs数组未被修改。并且没有理由使用bmGs[j] == m

进行核对

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