代码之家  ›  专栏  ›  技术社区  ›  Dmitriy

Boyer-Moore算法的正确实现

  •  3
  • Dmitriy  · 技术社区  · 14 年前

    我尝试使用几个实现,但它们都有缺陷。
    搜索给了我 http://www-igm.univ-mlv.fr/~lecroq/string/node14.html -看起来不错,但这个实现给了我错误的结果-有时它找不到字符串。
    我花了几个小时才找到那个虫子。

    下面这行看起来不错:

    j += MAX(bmGs[i], bmBc[y[i + j]] - m + 1 + i);
    

    但是 Y 是char*且char是 签署 !这意味着y[i+j]可能是阴性的(在我的一个测试中发生的情况)。

    我的问题是:在哪里可以找到Boyer-Moore算法的正确实现?

    3 回复  |  直到 6 年前
        1
  •  4
  •   caf    14 年前

    char 没有明确的签名 未签名-未指定,由实现来定义。

    如果算法依赖于无符号字符,那么它应该显式地将输入指针强制转换为 unsigned char (这就是C标准库字符串处理函数如何定义为工作的方式-所有比较都将字符串中的字符视为 无符号字符 )

        2
  •  4
  •   In silico    14 年前
        3
  •  1
  •   TamaMcGlinn    6 年前

    至于C++ 17,这是内置到STL。只使用 std::boyer_moore_searcher . 例如:

    #include <algorithm>
    #include <string>
    #include <functional>
    
    int main()
    {
        std::string haystack = "The quick brown fox jumped over the lazy dog";
        std::string needle = "brown";
        const auto s = std::boyer_moore_searcher<std::string::iterator>(needle.begin(), needle.end());
        const auto it = std::search(haystack.begin(), haystack.end(), s);
        return 0;
    }