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语句是否需要内存分配。
答案 0 :(得分:1)
假设 - &gt;提出的问题是这个函数需要多少堆栈空间:
嗯,A[]
参数不是数组;它是指向数组第一个元素的指针,因此sizeof(int*)
而不是n * sizeof(int)
。
返回值是否需要空间取决于您的环境是否在CPU寄存器中返回整数,还是将它们推送到堆栈中。如果在堆栈上,那么是的,你需要允许该空间。
假设 - &gt;提出的问题是关于BigO空间复杂性
警告:如何计算算法的空间复杂度取决于编程语言和/或硬件环境。将其与时间复杂度进行对比,时间复杂度主要与语言/硬件无关。请注意,大多数关于网络空间复杂性的例子都做了一些非常平庸的假设。
例如,此示例中的A[]
参数几乎总是假定占用数组中每个元素所需的空间。在C和传递对象引用的语言中,这根本不是真的。在一些网络示例中,脚注中提到了这一点;在其他人,根本不是。
因此,对于这篇文章,BigO空间复杂性的答案是 - &gt;这取决于。它可以是O(1)或O(n),具体取决于谁的询问以及它的预期运行位置。