【问题标题】:What will be the complexity of this code? Should we sum complexities? [duplicate]这段代码的复杂性是多少?我们应该总结复杂性吗? [复制]
【发布时间】:2016-11-05 10:34:12
【问题描述】:

我有一个算法,它首先对向量进行排序,然后遍历其元素并XOR 它们。我应该将排序和 for 循环的复杂度相加来计算整体算法复杂度吗? 所以,我有下一个代码:

std::sort(array.begin(), array.end());
for (int i =1; i < array.size(); ++i) {
  result = array[i-1]^array[i];
}

我们有一个 for 循环,其具有 O(N) 复杂性和 std::sort 其具有 O(N log N) 的平均比较。 那么接下来的代码复杂度会是O(N + N log N)? 或者在这种情况下,我们只需要选择最高时间复杂度的类,即线性时间O(N log N),而不是将它们相加?

【问题讨论】:

  • 仍然是 O(n lgn)
  • for (int i =1; i 访问@时你有UB 987654328@ 在 i = array.size() 时的下一行。
  • 你如何将N+N logN 等同于2NlogN
  • @drescherjm 你能解释一下原因吗?预增量?
  • O(大象 + 蚊子) = O(大象)

标签: c++ algorithm sorting time-complexity asymptotic-complexity


【解决方案1】:

运行时间受排序步骤O(nlgn) 的限制。 for 循环可能具有O(n) 的复杂性,但总体运行时间始终由最高功率支配。有关数学证明,请参见此处:

https://math.stackexchange.com/questions/324200/big-o-notation-sum-rule

【讨论】:

    【解决方案2】:

    是的,您可以将它们相加:O(n)O(n log n) 变为 O(n + n log n)。但请注意,这 不是 O(2n log n) 正如你所建议的那样,因为在基本算术中,加法是在乘法之后发生的。

    现在,正如 O(1 + n) 总是减少到 O(n),您的 O(n + n log n) 将减少到 O(n log n),因为单独的 n 项小于 n log n 项和大 O 表示法总是关于极限,而不是精确的方程式。

    有些人可能会发现从一开始就认出O(n)O(n log n) 支配更直观,而从一开始就永远不要将它们相加。这是一个有用的思维捷径,但两种观点都能得到相同的结果。

    【讨论】:

      【解决方案3】:

      复杂性类O(N)O(N log N) 类的子集,因为log N &gt; 1 足够高N。因此,代码O(N + N log N) 的复杂性类是O(2 N log N) 的子集,并且由于复杂性类是不变的w.r.t。常量,最后是O(N log N)

      【讨论】:

      • 为什么投反对票?解释一下。
      【解决方案4】:

      我们计算复杂度的方法是在所有复杂度中选择最高的。

      所以,假设您有以下代码

      for i in range 0 to n
      {
          for  in range 0 to n
          {
              \\ code
          }
      }
      
      for i in range 0 to n
      {
          \\ code
      }
      

      所以,这里的复杂性是O(n^2) + O(n)。最终将是O(n^2)。所以,上面整个代码的复杂度是O(n^2)


      同样,在您的情况下,复杂度为O(N log N) + O(N),这使得最终复杂度为O(N log N)

      【讨论】:

        【解决方案5】:

        首先,O(N+N log N) 不会给你O(2N log N),它会给你O( (log N+1) * N)。此算法将以O(N log N) 为界,因为随着 N 接近无穷大,它的增长速度比O(N) 快。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-26
          • 2022-11-10
          • 1970-01-01
          相关资源
          最近更新 更多