快速字符串搜索

Fast string search?

本文关键字:搜索 字符串      更新时间:2023-10-16

我有一个字符串向量,必须检查向量中的每个元素是否存在于5000个单词的给定列表中。除了两个嵌套循环的普通方法之外,在C++中还有什么更快的方法可以做到这一点吗?

您应该将字符串列表放入std::集中。这是一个为搜索而优化的数据结构。查找给定元素是否在集合中是一项比迭代所有条目快得多的操作。

当您已经在使用C++11时,您还可以使用std::unordered_set,它的查找速度更快,因为它是作为哈希表实现的。

这是否适用于学校/大学:准备好解释这些数据结构是如何更快地管理的。当你的教练要求你解释你为什么使用它们时,"网上的一些人告诉我"不太可能在课堂上为你赢得贴纸。

您可以将单词列表放在std::unordered_set中。然后,对于向量中的每个元素,您只需要测试它是否在O(1)中的无序集合中。您将具有预期的复杂性O(n)(查看注释以了解为什么只期望它)。

你可以对向量进行排序,然后你可以用一个"循环"(假设你的字典也被排序)来解决这个问题,这意味着O(n)不计入排序成本。

因此,您有一个字符串向量,每个字符串都有一个或多个单词,您有了一个字典向量,您应该确定字符串向量中的哪些单词也在字典中?字符串的矢量是一个烦恼,因为你需要查看每个单词。我会从创建一个新的向量开始,将每个字符串拆分为单词,并将每个单词推入新的向量中。然后对新矢量进行排序,并通过std::unique算法运行它以消除重复。然后把字典分类。然后通过std::set_intersection运行两个范围以写入结果。