我想澄清以下是否回答正确?

时间:2018-01-25 16:29:39

标签: c algorithm

 int sum(int A[], int n)
 {
    int sum = 0, i;
    for(i = 0; i < n; i++)
    sum = sum + A[i];
    return sum;
 }

      'n*2' bytes of memory to store array variable 'a[]'
      2 bytes of memory for integer parameter 'n'
      4 bytes of memory for local integer variables 'sum' and 'i' (2 bytes 
       each)
      2 bytes of memory for return value.

      Total space Needed = 2n + 8

假设c编译器需要2个字节用于存储整数值

我想知道上面计算的总空间答案是否正确? 我对return语句有疑问,因为我首先将内存分配给sum变量而sum是最后返回所以我需要不返回sum语句是否需要内存分配。

1 个答案:

答案 0 :(得分:1)

假设 - &gt;提出的问题是这个函数需要多少堆栈空间:

嗯,A[]参数不是数组;它是指向数组第一个元素的指针,因此sizeof(int*)而不是n * sizeof(int)

返回值是否需要空间取决于您的环境是否在CPU寄存器中返回整数,还是将它们推送到堆栈中。如果在堆栈上,那么是的,你需要允许该空间。

假设 - &gt;提出的问题是关于BigO空间复杂性

警告:如何计算算法的空间复杂度取决于编程语言和/或硬件环境。将其与时间复杂度进行对比,时间复杂度主要与语言/硬件无关。请注意,大多数关于网络空间复杂性的例子都做了一些非常平庸的假设。

例如,此示例中的A[]参数几乎总是假定占用数组中每个元素所需的空间。在C和传递对象引用的语言中,这根本不是真的。在一些网络示例中,脚注中提到了这一点;在其他人,根本不是。

因此,对于这篇文章,BigO空间复杂性的答案是 - &gt;这取决于。它可以是O(1)或O(n),具体取决于谁的询问以及它的预期运行位置。