【问题标题】:Complexity of inserting N items to an empty std::map将 N 个项目插入空 std::map 的复杂性
【发布时间】:2013-03-20 03:43:32
【问题描述】:


我想知道以下函数的复杂性。
我知道 std::map 被实现为红黑树,插入的复杂度为 O(logN)。
但是如果我继续向空地图添加 N 个项目,我该如何计算呢?

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

提前致谢,

【问题讨论】:

    标签: c++ stl complexity-theory


    【解决方案1】:

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

    【讨论】:

    • 谢谢!我认为 O(log0 + log1 + log2 + ... + logN)。是否等价于 O(NlogN)?
    • 是的。忽略 Log(const value) 以估计复杂度。
    • @IanMedeiros 这不是 Log(const),它是 Log(const)s 的总和 - 这是两个非常不同的东西
    • @zorio O(log1+log2+..+logN)=O(log(N!))~O(NlogN)(见en.wikipedia.org/wiki/Stirling%27s_approximation)。对于第一个元素,复杂性不是O(log0),而是O(1)
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      你在问一个合理的问题。

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

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

      【讨论】:

      • 这种微妙的洞察力是无价的!​​span>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      • 2022-10-22
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多