最快的C ++容器" Exists"求(矢量/数组/等)

时间:2014-03-20 14:50:19

标签: c++ arrays performance vector

我不确定在这里使用最好的C ++数据容器....我正在构建一个对延迟非常敏感的应用程序(所以我需要绝对最快的实现)。

我需要一次性存储大约300,000个字符串(只有一次写入),然后频繁检查该数据存储中是否存在元素(多次读取)。我永远不需要对此数据集做任何其他事情,除非检查其中是否存在值,并且我需要每秒检查数百次。如果重要,查找的大多数将导致找不到密钥。

我考虑过使用矢量或数组,但它们似乎都只是扫描整个列表并一对一地检查值...哪个会起作用......但是因为我们正在索引字符串,所以没有任何数据容器可以为值构建某种树索引,因此在搜索值“apple”时,它首先会查看以“a”开头的键,然后是下一个字符“p”,以及它没有找到任何“ap ...”它立即返回未找到。对我来说,这似乎比每次搜索整个大型集更快。我真的希望原生容器具有这种功能。

如果有帮助的话,这个项目确实编译了Boost。

非常感谢!

3 个答案:

答案 0 :(得分:2)

使用Boost,答案显然是boost::unordered_set

它也作为std::unordered_set<unordered_set>的C ++ 11标准的一部分提供。

它们都建立在哈希表上,因此一旦计算出哈希值,就会查找自己的O(1)。

答案 1 :(得分:2)

该树容器名为Trie

Here你可以找到Boost.Trie,我还没有用过它,所以我不知道它是否已经完成。

答案 2 :(得分:0)

这取决于您是否可以将数据保留在内存中,而不是用于此目的的最佳容器是unordered_set。如果您需要检查集合中是否存在某个密钥,则它具有O(1)访问时间。 Boost提供了非常好的实现,您可以在这里找到http://www.boost.org/doc/libs/1_55_0/doc/html/unordered.html

如果您无法将数据保存在内存中,因为它太大,您可以使用不同的技巧。你可以计算每个字符串的一些小散列(你可以找到不同的散列函数),所以它就像从字符串转换一样 - &gt;基本上是int。然后,每当您需要测试数据库中是否存在字符串时,您只需将其转换为int(使用相同的哈希函数)并检查哈希表(如果存在)。如果需要检索数据,可以将哈希值与文件中字符串的偏移量相关联,但在您的情况下,只有在需要节省空间时才能考虑保留哈希值。

PS。 unordered_set也使用哈希函数,它只是隐藏。