将N个项插入到空std::映射的复杂性

Complexity of inserting N items to an empty std::map

本文关键字:std 映射 复杂性 插入      更新时间:2023-10-16


我想知道以下函数的复杂性
我知道std::map是用红黑树实现的,插入的复杂度是O(logN(
但是,如果我一直在一个空地图上添加N个项目,我该怎么计算呢?

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

提前感谢,

你做了N次O(log N(的事情,所以它是O(N log N(。

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

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

如果您的应用程序是时间评论家,您可以考虑使用unordered_map,因为插入时间复杂性是恒定的。您正在从int映射到int,因此在这种情况下使用unordered_map应该非常好。

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

你在问一个合理的问题。

当将N个项目插入到一个开始为空的树中时,您从日志(0(开始,然后前进到日志(N(。这意味着你的总体平均值实际上是log(N/2),而不是log(N)

在对数的情况下,这并没有真正的区别——总体复杂性仍然是对数的。你所做的实际上改变了对数的基数