【问题标题】:What would be the space complexity of the following recursive function?以下递归函数的空间复杂度是多少?
【发布时间】:2021-11-17 23:54:16
【问题描述】:

一个递归函数,它初始化一个占用 n^2 空间以及 n 堆栈空间的空 2D 向量。

void s (int n)
{
    if(n == 0) return;
    // n^2 space
    vector<vector<int>> a(n, vector<int>(n));
    for(int i = 0; i < n; ++i)
      for(int j = 0; j < n; ++j)
         a[i][j] = i * j;
    s(n-1);
}

【问题讨论】:

  • a 未使用,int 的构造没有可见的副作用,因此任何体面的编译器都会完全丢弃 a
  • 由于调用s 没有可观察到的行为,算法的空间和时间复杂度可以说是O(0),因为理论上它可以被优化出来。它什么也没做。
  • 我们不考虑任何编译器优化,我添加了一个嵌套循环,因此S 现在有一些可观察到的行为。现在的空间复杂度是多少?

标签: c++ algorithm space-complexity


【解决方案1】:

它就像 n^2 + (n-1)^2 + ... + 1^2 。
结果将是 n * (n+1) * (2n+1) / 6 = O(n^3)。
但由于实际上它们都是 0 页,因此不会占用那么多空间。

【讨论】:

  • 我们不应该也考虑堆栈空间吗?在函数达到 n == 0 的基本条件之前,堆栈大小将上升到 n,所以它应该是这样的:n^2 + (n-1)^2 + ... + 1^2 + n (stack空间)?
  • 总的来说,空间复杂度的顺序是n^3。
  • 如果我能正确记住我的 uni 课程,您就不必担心低阶组件。 O(N^2+N) 就是 O(N^2)。对于“足够大”的 N,高阶项总是占主导地位,这就是这种分析的重点。
猜你喜欢
  • 2022-11-22
  • 2020-03-13
  • 2019-05-08
  • 2015-11-29
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
相关资源
最近更新 更多