我有一个数组,我需要尽快插入项目。在添加项目之前,我需要查看它是否存在,因此我进行完整的阵列扫描。我无法使用二进制搜索,因为我无法在每次插入后对数组进行排序。
这项工作是否有更高效的数据结构?
编辑:在该数组中,我存储了字符串。在每个字符串旁边,我存储一个4字节的哈希值。我首先比较哈希,如果它们与字符串相同。
答案 0 :(得分:3)
std::unordered_map
将为您提供最佳插入/搜索时间(O(1)),但不保留也不提供任何订单。
std::map
给你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)搜索。