【问题标题】:C++ Trie search performanceC++ Trie 搜索性能
【发布时间】:2012-03-19 13:25:16
【问题描述】:

所以我尝试了一个包含大量数据的尝试,我的搜索算法非常快,但我想看看是否有人对我如何使其更快。

    bool search (string word)
{
    int wordLength = word.length();
    node *current = head;
    for (unsigned int i=0; i<wordLength; ++i)
    {
            if (current->child[((int)word[i]+(int)'a')] == NULL)
                    return false;
            else
                    current = current->child[((int)word[i]+(int)'a')];
    }
    return current->is_end;
}

【问题讨论】:

    标签: c++ performance search trie


    【解决方案1】:

    在性能方面看起来不错,除了这些花絮:

    • 将函数参数声明为const string&amp;(而不仅仅是string),以避免不必要的复制。
    • 您可以在if 前面提取公共子表达式current-&gt;child[((int)word[i]+(int)'a')],以避免重复并使代码略小,但任何值得其盐的编译器无论如何都会为您进行优化。

    “风格”建议:

    • 如果word 包含“a”下面的字符(如大写字母、数字、标点符号、换行符等)怎么办?您需要验证输入以避免访问错误的内存位置和崩溃。这也不应该是-(int)'a' 而不是+(我假设您只想支持一组有限的字符:'a' 及以上)?
    • wordLength 声明为size_t(或者更好的是auto),但这对于任何实际长度的字符串都不重要(如果size_t 大于int,甚至可能会稍微影响性能)。 i 同上。

    【讨论】:

    • 我使用 + (int) a 因为有些字符的值低于 a
    • @that_guy:在这种情况下,您不应该向word[i] 添加任何内容。确定有效范围,并(可选)通过从word[i] 中减去范围中的最小值来将范围从 0 开始。
    【解决方案2】:
    bool search (string word)
    

    调用这个函数,字符串word会被复制, 下面的函数类型会更快。

    bool search (const string &word)
    

    bool search (const char *word)
    

    【讨论】:

      猜你喜欢
      • 2011-08-30
      • 1970-01-01
      • 2014-06-30
      • 2018-12-07
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      相关资源
      最近更新 更多