【问题标题】:How to quickly search a large vector many times?如何多次快速搜索大向量?
【发布时间】:2022-01-01 04:48:08
【问题描述】:

我有一个std::vector<std::string>,它有 43,000 个字典单词。我有大约 315,000 个可能的单词,对于每个单词,我都需要确定它是否是一个有效的单词。这需要几秒钟,我需要尽快完成任务。

关于完成此任务的最佳方法有什么想法吗?目前我在每次尝试中都进行迭代:

for (std::string word : words) {
    if (!(std::find(dictionary.begin(), dictionary.end(), word) != dictionary.end())) {
        // The word is not the dictionary
        return false;
    }
}
return true;

有没有更好的方法进行多次迭代?我有几个假设,比如

  • 创建一个无效词的缓存,因为 315,000 个列表可能有 25% 的重复项
  • 只比较相同长度的单词

有没有更好的方法来做到这一点?我对算法或想法感兴趣。

【问题讨论】:

  • 也许您想使用std::set<std::string>std::unordered_set<std::string> 而不是向量。
  • 将值放在std::unordered_set<std::string> 中,然后它们将是唯一的,并且平均有 O(1) 查找。
  • 可能应该使用setunordered_set 而不是vector
  • 你能对你的vector(用于二分搜索)进行排序吗?或者使用另一个容器(std::unordered_settrie、...)
  • 你可以使用排序 std::vector吗?在已排序的 std::vector 中进行二分搜索可能会有很好的性能。更好的是对它们中的 both 进行排序,然后遍历这两个向量,并在通过两个排序列表的某种智能单次迭代中将可能的词标记为好或坏。

标签: c++ loops dictionary


【解决方案1】:

有没有更好的方法进行多次迭代?

是的。将向量转换为另一个支持更快查找的数据结构。标准库带有std::setstd::unordered_set,它们都可能比重复线性搜索更快。其他数据结构可能更有效。

如果您的目标是在可能的集合中创建一系列单词或非单词,那么另一种有效的方法是对两个向量进行排序,并使用 std::(ranges::)set_intersectionstd::(ranges::)set_difference

【讨论】:

  • 好答案。顺便说一句,如果你想对第二段中的每个匹配或不匹配的字符串应用一些东西,你可以创建一个自定义 insert_operator..
猜你喜欢
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 2018-10-01
  • 2011-08-21
  • 1970-01-01
  • 2020-02-11
相关资源
最近更新 更多