如何计算函数的空间复杂度?

Posted

技术标签:

【中文标题】如何计算函数的空间复杂度?【英文标题】:How to calculate the space complexity of function? 【发布时间】:2015-07-25 01:32:43 【问题描述】:

如果我有这样的功能,我基本了解:

int sum(int x, int y, int z) 
  int r = x + y + z;
  return r;

参数需要 3 个单位的空间,局部变量需要 1 个空间,这永远不会改变,所以这是O(1)

但是如果我有这样的功能呢:

void add(int a[], int b[], int c[], int n) 
    for (int i = 0; i < n; ++i) 
        c[i] = a[i] + b[0]
    

a 需要 N 个单位,b 需要 M 个单位,c 需要 L 个单位,in 需要 1 个单位。所以它需要N+M+L+1+1 的存储量。

那么这里的空间复杂度大 O 会是什么?需要更高内存的那个? IE。如果 N 比 M 和 L 花费更多的时间(从更高的意思来看,假设大于 10**6) - 那么可以肯定地说空间复杂度是 O(N) 还是不像我们对时间复杂度所做的那样?

但是如果所有三个,即a,b,c都没有太大的不同

喜欢这个功能

void multiply(int a[], int b[], int c[][], int n)  
    for (int i = 0; i < n; ++i) 
        for (int j = 0; j < n; ++j) 
            c[i] = a[i] + b[j];
        
    

那么空间复杂度是多少? O(N+M+L)?还是最大的?

【问题讨论】:

当我们谈到空间复杂度时,通常我们指的是需要辅助空间——而不是输入本身的空间。 空间复杂度包括辅助空间和输入使用的空间。对吗? @AnkurAnand 从技术上讲,是的。但许多人使用该术语仅表示辅助空间复杂度。具体来说,您想知道诸如“如果我通过 100 个函数传递这个大型数据集,我会占用多少内存,我会创建多少垃圾?” 【参考方案1】:

算法或数据结构的空间复杂度是在任何时候使用的最大空间量,忽略算法输入使用的空间。 因此,您问题中所有三个示例的空间复杂度均为 O(1)

【讨论】:

【参考方案2】:

当我们谈论空间复杂度时,我们不考虑输入使用的空间。

这让我们可以讨论常量空间、O(log n) 空间等算法。如果我们开始计算输入,那么所有算法都至少是线性空间!

空间复杂度的标准多带图灵机定义也不计算输出。

输入是只读的,输出是只写的,不计入空间复杂度。

所以回答你的问题:寻找你的方法是什么记忆 分配,包括递归/局部变量等的堆栈空间,这将 确定空间复杂度。

【讨论】:

以上是关于如何计算函数的空间复杂度?的主要内容,如果未能解决你的问题,请参考以下文章

01时间复杂度和空间复杂度

如何计算该解决方案的时间和空间复杂度?

什么是时间复杂度、空间复杂度?

时间复杂度空间复杂度

算法几分钟时间让你彻底学会—空间复杂度

时间复杂度和空间复杂度计算方式