我有一个字符串向量,必须检查向量中的每个元素是否存在于5000个单词的给定列表中。 除了两个嵌套循环的普通方法之外,有没有更快的方法在C ++中执行此操作?
答案 0 :(得分:9)
您应该将字符串列表放入std::set。它是为搜索而优化的数据结构。查找给定元素是否在集合中是一项比迭代所有条目快得多的操作。
当你已经在使用C ++ 11时,你也可以使用std::unordered_set,它更快地进行查找,因为它是作为哈希表实现的。
这应该适用于学校/大学:准备解释这些数据结构如何变得更快。当你的导师要求你解释你使用它们的原因时,“互联网上的一些人告诉我”不太可能在课本上为你赢得贴纸。
答案 1 :(得分:3)
您可以将单词列表放在std::unordered_set中。然后,对于向量中的每个元素,您只需要测试它是否在O(1)中的unordered_set中。你会有一个预期的复杂性O(n)(看看评论,看看为什么它只是预期)。
答案 2 :(得分:2)
您可以对矢量进行排序,然后您可以使用一个“循环”解决此问题(您的字典也被排序),这意味着O(n)不计入排序成本。
答案 3 :(得分:2)
所以你有一个字符串向量,每个字符串都有一个或多个单词,你有一个字典的向量,你应该确定字符串向量中的哪些单词也在字典中?字符串向量是一个烦恼,因为你需要查看每个单词。我首先创建一个新的向量,将每个字符串分成单词,然后将每个单词推入新的向量。然后对新向量进行排序并通过std::unique
算法运行它以消除重复。然后对字典进行排序。然后通过std::set_intersection
运行两个范围以写入结果。