如果我将有序(增加)元素序列插入到地图中,最终的二叉树是否会以某种方式进行优化?或者每个元素都会有一个孩子“它是对的”?这会使这样的树效率非常低,因为然后查找将是线性的。
我找不到有关插入STL地图的过程的详细信息。
答案 0 :(得分:23)
C ++ 11标准(23.1)要求关联容器的insert
和find
的对数复杂度。从两个迭代器i
和j
构造它们,使得[i, j)
表示适当排序的值范围甚至需要具有线性时间复杂度。这是否意味着“最终的二进制树被优化”,或者地图是否是二进制树,是未指定的。
实际上,std::set
,std::map
和他们的多朋友几乎总是红黑树,因为这是STL的原始HP / SGI参考实施所具有的,而且都是现代的我所知道的C ++库来自该实现。
答案 1 :(得分:3)
通常,使用红黑树实现std::map
,这是自平衡的。所以是的,它已经过优化。
如果插入有序数据,自平衡可能会花费更少,因为节点之间的交换不会那么频繁。
答案 2 :(得分:1)
C ++标准要求std :: map(ISO / IEC 14882的23.4.4.3)中任何元素的对数访问时间,因此std :: map必须实现为自平衡树。
答案 3 :(得分:0)
set
和map
通常会进行树平衡,因此找到的是O(log n)。许多操作的复杂性如下所示:
http://www.cplusplus.com/reference/stl/
答案 4 :(得分:0)
优化了!
看看SGI's Standard Template Library Programmer's Guide。您将找到以下用于插入和查找元素的复杂性规范:
- 插入范围的平均复杂度最多为O(N * log(size()+ N)),
- 其中N是j - i。查找的平均复杂度至多是对数。