【问题标题】:Why is the time complexity of the below snippet O(n) while the space complexity is O(1)为什么下面代码片段的时间复杂度是 O(n) 而空间复杂度是 O(1)
【发布时间】:2020-02-03 11:44:18
【问题描述】:

下面给出的代码的空间复杂度为 O(1)。我知道它与调用堆栈有关,但我无法正确地可视化它。如果有人能让我更清楚地理解这一点,那就太好了。

int pairSumSequence(int n) {
    int sum = 0;
    for (int i = 0;i < n; i++) {
        sum += pairSum(i, i + l);
    }
    return sum;
}

int pairSum(int a, int b) {

 return a + b;

} 

【问题讨论】:

    标签: time-complexity space-complexity


    【解决方案1】:

    相对于n 的值,它需要多少空间?

    唯一使用的变量是sumsum 相对于 n 没有变化,因此它是恒定的。

    如果它是常数,那么它就是 O(1)

    相对于n的值,它将执行多少条指令?

    让我们先简化代码,然后逐行分析。

    int pairSumSequence(int n) {
        int sum = 0;
        for (int i = 0; i < n; i++) {
            sum += 2 * i + l;
        }
        return sum;
    }
    

    变量的声明和初始化需要恒定的时间,并且不会随着n 的值而改变。因此这条线是 O(1)。

    int sum = 0;
    

    类似地返回一个值需要恒定的时间,所以它也是 O(1)

    return sum;
    

    最后我们来分析一下for的内部:

    sum += 2 * i + l;
    

    这也是常数时间,因为它基本上是一次乘法和两次求和。再次O(1)。 但是这个 O(1) 它在 for 中被调用:

    for (int i = 0; i < n; i++) {
       sum += 2 * i + l;
    }
    

    这个 for 循环将准确执行 n 次。 因此这个函数的总复杂度是:

    C = O(1) + n * O(1) + O(1) = O(n)

    意味着这个函数将花费时间n的值成比例

    【讨论】:

    • 太棒了!谢谢我明白了:)
    【解决方案2】:

    时间/空间复杂度O(1)表示一个常数复杂度,常数不一定是1,可以是任意数,但必须是常数,不依赖于n。例如,如果你总是有 1000 个变量(独立于 n),它仍然会给你 O(1)。有时甚至可能会发生常数与您的n 相比如此之大,以至于 O(n) 会比具有该常数的 O(1) 好得多。


    现在,在您的情况下,您的时间复杂度为 O(n),因为您进入循环 n 次,并且每个循环具有恒定的时间复杂度,因此它线性取决于您的 n .但是,您的空间复杂度独立于n(您始终保留相同数量的变量)并且是恒定的,因此它将是 O(1)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 2020-05-26
      • 2018-12-12
      • 1970-01-01
      相关资源
      最近更新 更多