当A在for循环中调用函数B时,我很好奇如何计算函数A的空间复杂度和辅助空间。让我们描述两个例子:
情况1:什么是函数A
的空间复杂度和辅助空间
void A(int k) {
int c = 25;
for (int i = 0; i < k; i++) {
B();
}
}
void B () {
int d = 5;
}
情况2:什么是函数A
的空间复杂度和辅助空间
void A(int k) {
int c = 25;
for (int i = 0; i < k; i++) {
int d = 25;
}
}
这两种情况有什么区别? (当然会有区别)
答案 0 :(得分:2)
循环(如图所示)不会增加空间复杂性。在循环的每次迭代中,B
的堆栈帧都会被分配,然后被丢弃。 B
不在内部分配内存,因此其空间消耗为O(1),A
也是如此。
如果代码如下:
std::vector<int> B(int i) {
std::vector<int> result(i);
// Do something with result;
return result;
}
void A(int k) {
std::vector<std::vector<int>> storage;
for (int i = 0; i < k; i++) {
storage.push_back(B(i));
}
}
然后我们可以看到,函数B
的每次调用都分配O(k)空间,它被称为O(k)次,因此A的空间复杂度为O(k²)。