将N个项插入空std :: map的复杂性

时间:2013-03-20 03:43:32

标签: c++ stl complexity-theory


我想知道以下功能的复杂性。
我知道std :: map实现为红黑树,插入的复杂度为O(logN) 但是如何计算我是否继续在空地图中添加N个项目?

void add(int N, std::map<int, int>& map) {
  for (int i = 0; i < N; ++i) {
    map[i] = i;
  }
}

提前致谢,

3 个答案:

答案 0 :(得分:2)

你做O(log N)事N次,所以它是O(N log N)。

答案 1 :(得分:2)

R-B树是一种平衡的二叉树。插入操作基本上找到插入位置,为新插入的节点分配空间并调整指针然后重新平衡R-B树。插入的复杂性是O(logN)。

因为在您的情况下,您首先要确定某些操作的复杂性,即插入日志(N)复杂度,然后找出操作使用的次数。这就是为什么我们有N(logN)。 O(logN)表示相对于容器中元素数量使用的时间增长顺序最多为logN。这并不意味着实际使用的时间是logN。

如果您的申请是时间评论家,您可以考虑使用unordered_map,因为插入时间的复杂性是不变的。您正在从int映射到int,因此在这种情况下使用unordered_map应该完全没问题。

BTW:在你的公式中,没有定义log0,当没有要插入的元素时,你不进行插入操作。

答案 2 :(得分:2)

你问了一个合理的问题。

将N个项目插入到空白的树中时,您将从log(0)开始并进入log(N)。这意味着您的总体平均值实际为log(N/2)而不是log(N)

在对数的情况下,这并没有真正有所作为 - 整体复杂性仍然是对数的。你所做的实际上是改变了对数的 base