在插入STL集之前我应该​​随机随机播放吗?

时间:2010-08-03 18:36:28

标签: c++ stl set

我需要在C ++ STL集中插入1000万个字符串。字符串已排序。如果按排序顺序插入字符串,是否会出现病态问题?我应该先随机分配吗?或者G ++ STL实现会自动为我重新平衡吗?

7 个答案:

答案 0 :(得分:4)

set实现通常使用红黑树,它将为您重新平衡。但是,如果在插入之前随机化数据,插入可能会更快(或者可能不会) - 唯一可以确定的方法是使用set实现和特定数据进行测试。无论哪种方式,检索时间都是相同的。

答案 1 :(得分:3)

实施将自动重新平衡。但是,如果您知道输入已排序,则可以给它一些帮助:在插入时可以提供“提示”,在这种情况下,将迭代器提供给先前插入的项将是正确的提示为下一次插入提供。在这种情况下,每个插入都将具有分摊的常量复杂度,而不是您期望的对数复杂度。

答案 2 :(得分:2)

我唯一的问题是:你真的需要set吗?

如果数据已经排序,并且您在创建后不需要插入/删除元素,那么deque会更好:

  • 使用binary search进行检索
  • ,您将拥有相同的大O复杂度
  • 您将获得更少的内存开销......以及更好的缓存位置

binary_search:我怀疑你需要超过ForwardIterator进行二元搜索,猜猜这个网站再次关闭:(

答案 3 :(得分:1)

http://en.wikipedia.org/wiki/Standard_Template_Library

set:“使用自平衡二进制搜索树实现。”

答案 4 :(得分:1)

g ++的libstdc ++使用红黑树来设置和映射。

http://en.wikipedia.org/wiki/Red-black_tree

这是一个自平衡树,插入总是O(log n)。 C ++标准还要求所有实现都具有这种特性,因此在实践中,它们几乎总是红黑树或类似的东西。

所以不要担心你放入元素的顺序。

答案 5 :(得分:1)

一种非常便宜且简单的解决方案是从字符串集合的两端插入。也就是说,首先添加“A”,然后是“ZZZZZ”,然后是“AA”,然后是“ZZZZY”,等等,直到你在中间相遇。它不需要大幅度的洗牌费用,但它可能会避开病态病例。

答案 6 :(得分:0)

也许'unordered_set'可以替代。