【问题标题】:faster search protocol with large list (c++)具有大列表的更快搜索协议(c ++)
【发布时间】:2021-12-30 15:26:36
【问题描述】:

具有大列表的更快搜索协议? 您好,感谢您阅读我的帖子。我正在制作一些简单的自动完成软件,它将输入的单词与与英语词典中该单词的字母序列匹配的每个单词进行比较。该字典包含 400,000 个元素,因此您可以预期它会导致简单搜索的等待时间很长。

                for (int j = 0; j < list.size(); j++)
                {
                    if (list[j].length() >= input[input.size()-1].length() && input[input.size() - 1] == list[j].substr(0, input[input.size() - 1].length()))
                    {
                        suggestions.push_back(list[j]);
                    }
                }

上面的代码可能是运行时优化效率最低的,但我尝试了其他一些方法,比如为所有 27 个字母创建一个位移变量,然后将其添加到 i.并将最大值减少到下一个字母开始(如果第一个字母的索引,比如 r,是 400,并且以 s 开头的第一个字母的索引是 800,那么我会将范围设置在 400 和 800 之间而不是 0 - 1,500,但仍然很慢)。任何帮助将不胜感激

【问题讨论】:

  • 查看 trie 数据结构。
  • 你可以有一个容器数组。该数组将有一个用于每个字母的插槽。该插槽将包含以该字母开头的所有单词的容器。示例 dictionary['A'] 将拥有一个包含所有以“A”开头的单词的容器。

标签: c++ arrays string search vector


【解决方案1】:

对您的字典进行排序。然后你可以对这个词进行二分搜索,因为你只匹配前缀(即你不是试图通过输入“ell”来查找“hello”)。

这也是非常低效的:

input[input.size() - 1] == list[j].substr(0, input[input.size() - 1].length())

那个看起来很无辜的std::string::substr()每次都分配内存!您可以使用std::string::compare() 进行相同的比较,而无需分配内存,这将使这部分速度提高约 10 倍。

【讨论】:

  • 旁注:当input 为空时,input[input.size() - 1] 不幸地倾向于爆炸。如果这是不可能的,那就太棒了。如果没有,ka-boom。 input[input.size() - 1] -> input[0 - 1] -> input[-1] -> (假设安全赌注是 64 位 2 的恭维)input[FFFFFFFFFFFFFFFF] 这是 Zounds... 超出空容器的范围。
  • 好的,感谢您提供比较提示。参数的语法看起来像这样input[input.size()-1].compare(0, input[input.size() - 1].length(),list[j],0, input[input.size() - 1].length()) == 0 ,它似乎更快。但是你将如何用排序的字典进行二分搜索呢?我是否应该将 input[input.size()-1] 中单词的第一个字母的 ascii 值与字典中单词的 ascii 值进行比较,如果它不匹配索引的一半?
  • @Abdumuminkhan:要进行二分搜索,请使用en.cppreference.com/w/cpp/algorithm/lower_bound
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 2011-05-02
  • 2010-11-28
  • 1970-01-01
  • 2014-02-17
相关资源
最近更新 更多