std::map的时间复杂度是什么?它会在最坏情况下退化吗?或者它由实现决定,我们不能知道它?
查找操作的时间复杂度与 log(N) 成正比。在典型情况下(用红黑树实现),比较次数最多可以达到两倍的 Log2N。
插入操作通常也与 Log2N 成正比,但是当你要插入一些已经有序的项目时,会有一个特殊的方法。在这种情况下,你可以指定一个“提示”,它表示插入的位置。当这个提示正确时,每个插入操作的平均时间复杂度为O(1),而不是O(Log N),因此以已排序顺序插入一系列项目的时间复杂度是线性的,而不是N log(N)。你指定的提示是一个迭代器,指向要插入的项的后一个位置。
例如,如果你有几个按顺序排列的文件,并想将它们插入到映射中,你可以将 your_map.end()
作为“提示”,构建映射的复杂度将从O(N log(N)) 变成 O(N)。
1. 技术上讲,这适用于任何时候插入项目,而不仅仅是当你按顺序插入时--但是当你插入项目时,大多数情况下可以提供一个合理的“提示”。
std::map
操作相关联,因为它们被写入规范中。特别是,“排序数组”实现std::map
由于这个原因(以及指针/迭代器失效要求)是不符合标准的。 - Pseudonymstd::map的查找时间复杂度为对数级别,与其中元素的数量成对数关系。