我需要在C ++ STL集中插入1000万个字符串。字符串已排序。如果按排序顺序插入字符串,是否会出现病态问题?我应该先随机分配吗?或者G ++ STL实现会自动为我重新平衡吗?
答案 0 :(得分:4)
set实现通常使用红黑树,它将为您重新平衡。但是,如果在插入之前随机化数据,插入可能会更快(或者可能不会) - 唯一可以确定的方法是使用set实现和特定数据进行测试。无论哪种方式,检索时间都是相同的。
答案 1 :(得分:3)
实施将自动重新平衡。但是,如果您知道输入已排序,则可以给它一些帮助:在插入时可以提供“提示”,在这种情况下,将迭代器提供给先前插入的项将是正确的提示为下一次插入提供。在这种情况下,每个插入都将具有分摊的常量复杂度,而不是您期望的对数复杂度。
答案 2 :(得分:2)
我唯一的问题是:你真的需要set
吗?
如果数据已经排序,并且您在创建后不需要插入/删除元素,那么deque
会更好:
在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'可以替代。