正确的数据结构,快速插入和快速搜索?

时间:2015-08-18 00:05:14

标签: c++ algorithm data-structures collections

我有一个数组,我需要尽快插入项目。在添加项目之前,我需要查看它是否存在,因此我进行完整的阵列扫描。我无法使用二进制搜索,因为我无法在每次插入后对数组进行排序。

这项工作是否有更高效的数据结构?

编辑:在该数组中,我存储了字符串。在每个字符串旁边,我存储一个4字节的哈希值。我首先比较哈希,如果它们与字符串相同。

1 个答案:

答案 0 :(得分:3)

通常以(hashtable)实现的

std::unordered_map将为您提供最佳插入/搜索时间(O(1)),但不保留也不提供任何订单。

std::map给你O(log(n))进行搜索和插入,因为它需要特定的排序(不是你必须插入项目的那个),并且通常用平衡树实现。

如果您需要排序顺序并快速(O(log n))插入/搜索,

自定义balanced search trees是另一种选择。

如果O(n)是可接受的插入时间但是您需要最小的内存占用和O(log n)搜索时间,那么

排序std::vector(以支持添加项目的能力)是另一种选择。由于需要复制数组的其余部分,您需要按排序顺序插入项目,即O(n)。

如果你只需要一个数组(' std :: vector'),如果你需要保留原始顺序,那么你就可以使用O(n)进行插入/搜索。

除了&#st; :: vector'之外,您还可以使用单独的std::unordered_map / std::unordered_set添加"已经存在"检查以基本上2-3倍的内存空间的价格获得速度,并在添加项目时需要更新2个结构。此数组+哈希表组合将为您提供O(n)插入和O(1)搜索。