【问题标题】:Correct data structure for fast insert and fast search?快速插入和快速搜索的正确数据结构?
【发布时间】:2015-11-10 18:02:07
【问题描述】:

我有一个数组,我需要尽快在其中插入项目。在添加一个项目之前,我需要查看它是否存在,所以我做了一个完整的数组扫描。我不能使用二分搜索,因为我无法在每次插入后对数组进行排序。

对于这项工作有更高效的数据结构吗?

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

【问题讨论】:

标签: c++ algorithm data-structures collections


【解决方案1】:

std::unordered_map 通常实现为 (hashtable) 将为您提供最佳插入/搜索时间 (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)。

您可以使用单独的std::unordered_map/std::unordered_set 除了 'std::vector' 来添加“已存在”检查以提高速度,代价是基本上 2-3 倍的内存空间,并且需要更新 2 个结构时添加项目。这个数组+哈希表组合将为您提供 O(n) 插入和 O(1) 搜索。

【讨论】:

  • 非常感谢!由于性能和内存使用是一个问题,您能否提供更多关于我如何自己实现它的信息?
  • @SilverWarrior 搜索“读取黑树”或“平衡搜索树”以查找树样本。
  • 我想你的意思是std::unordered_map
  • std::map 不是哈希表,它通常实现为红黑树。 std::unordered_map 是一个哈希表。
  • 感谢 @mattnewport 和 chris 提供有用的反馈。不幸的是,答案被接受了,所以我不得不编辑它而不是简单地删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 2014-03-09
相关资源
最近更新 更多