std :: map的时间复杂度是多少? 它会在最糟糕的情况下堕落吗? 或者由实施决定,我们无法知道吗?
答案 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属性的所有信息。
值得注意的是,热门编译器(如msvc
或gcc
)附带的标准库不太流行,可以使用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更多的内存。