【问题标题】:Time Complexity of std::vector::erasestd::vector::erase 的时间复杂度
【发布时间】:2014-11-03 16:44:36
【问题描述】:

我找到了一种从 STL 向量中删除元素的方法,我的值 here

vec.erase(remove(vec.begin(), vec.end(), value), vec.end());

现在我想知道这种方法的效率如何,这意味着它在大 O 表示法中的时间复杂度。

【问题讨论】:

  • O(N)​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​
  • 如果向量已排序,您可以尝试std::lower_boundstd::upper_bound 来查找要擦除的范围。

标签: c++ vector time-complexity


【解决方案1】:

vec.erase(remove(vec.begin(), vec.end(), value), vec.end());

在这种情况下,remove 会压缩向量开头与要删除的值(值)不同的元素,并将迭代器返回到该范围之后的第一个元素。然后擦除删除元素。

所以这使得这个操作 O(n)。

【讨论】:

    【解决方案2】:

    C++11 标准在 [vector.modifiers]/4 中指定:

    复杂度T的析构函数被调用的次数等于被擦除元素的次数,但是move赋值 T 的操作符被调用的次数等于被调用的次数 删除元素之后的向量中的元素。

    特别是,最后擦除元素非常便宜,因为所做的只是破坏要擦除的元素,因此erase-调用的时间复杂度应该与@的出现次数成线性关系vec 内的 987654324@ - 对应于 Big-Oh-Notation 中的 Θ(n)。整个表达式的复杂度仍然是线性的,因为remove 在其应用范围的长度方面具有线性复杂度。如果vec 的大小由变量 m 描述,我们有 Θ(n + m) 表示完整的表达式,它等于 O(m) em> (因为 n 和 m + n , O(2m) = O(m))

    【讨论】:

      【解决方案3】:

      它可以是任何东西,因为解构的复杂性是未知的

      但假设它是恒定的,那么它将是 O(n)

      【讨论】:

        【解决方案4】:

        O(N),因为您正在遍历向量的每个元素。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-06
          • 2014-11-29
          • 2015-04-01
          • 1970-01-01
          • 2013-05-07
          • 1970-01-01
          • 1970-01-01
          • 2015-03-24
          相关资源
          最近更新 更多