std :: map的时间复杂度是多少?

时间:2014-02-12 22:10:58

标签: c++ g++

std :: map的时间复杂度是多少? 它会在最糟糕的情况下堕落吗? 或者由实施决定,我们无法知道吗?

4 个答案:

答案 0 :(得分:8)

查找与log(N)成比例。在典型情况下(作为红黑树实现),比较次数最多可达Log 2 N的两倍。

插入通常与Log 2 N成比例 - 但是当你插入一些已按顺序排列的项目时,会有一个特殊的规定 1 。在这种情况下,您可以指定插入位置的“提示”。当该提示正确时,每个插入都是(摊销)O(1)而不是O(Log N),因此按排序顺序插入一系列项目是线性的而不是N log(N)。您指定的提示是刚插入项目后位置的迭代器。

例如,如果文件中有多个项目按排序顺序排列,并且您希望将它们插入到地图中,则可以将your_map.end()指定为“提示”,并且构建地图将具有O(N)复杂度而不是O(N Log N)复杂度。


<子> 1.从技术上讲,这适用于您插入物品的任何时候,而不仅仅是当您按顺序插入物品时 - 但到目前为止,您有合理的“提示”可用的最常见情况是您按顺序插入物品时。

答案 1 :(得分:3)

通常为操作指定时间复杂度。在您的情况下,查找插入似乎相关。

有关STL容器的保证完整性,请参阅http://www.sgi.com/tech/stl/complexity.html。关于容器容器的这个http://www.sgi.com/tech/stl/AssociativeContainer.html

另一个来源是:

std :: map的查找是log(地图中元素的数量)。

答案 2 :(得分:1)

这取决于实现,只是通过查看语言规范,您无法将任何类型的复杂性与std::map相关联。

通常std::map实现为Red-Black Tree,您可以找到有关此类容器{0}的Big-O属性的所有信息。

值得注意的是,热门编译器(如msvcgcc)附带的标准库不太流行,可以使用B-tree来实现这种容器,这会导致内存不足由于B树通常占用RB树的内存较少这一事实。

例如here

答案 3 :(得分:0)

如果您询问std :: map的查找时间compexity那么那将是O(log(n)),因为stl将std :: map库实现为树(二叉树)数据结构。

更多信息: http://www.cplusplus.com/reference/map/map/

这里也是常用的std :: unordered_map,它将是你的hashmap(因此没有排序),具有O(1)查找速度,但是,根据数据结构的设计使用比Tree更多的内存。