在for
循环内循环N次的变量是否会使空间复杂度为O(N),即使每次循环重复时这些变量都超出范围?
for(var i = 0; i < N; i++){
var num = i + 5;
}
答案 0 :(得分:6)
在O(N)for循环内声明的变量会使空间复杂度为O(N)
否,因为变量在每次迭代结束时都超出范围,因此它们会被销毁。
结果,空间复杂性保持不变,即O(1)。
答案 1 :(得分:2)
1(固定大小)变量,您更改n
次(可能包括取消分配和重新分配)仍然只是1个变量,因此O(1)
空格。
但这可能在某种程度上依赖于语言 - 如果某些语言(或编译器)决定将变量的所有早期声明保留在内存中,那将会是O(n)
,而不是{ {1}}。
例如,考虑在C ++中执行此操作的两种方法:
O(1)
在前一种情况下,变量可以重复使用,它将是for (int i = 0; i < N; i++)
int num = i + 5;
for (int i = 0; i < N; i++)
int* num = new int(i + 5);
。
使用O(1)
时,该内存不会自动释放,因此后一种情况下的每次迭代都将分配更多内存而不是重用旧内存(技术上指针将被重用,但它指向的内容将是保持),因此它将使用new
空间。这样做是一个可怕的想法,将是一个内存泄漏,但它肯定是可能的。
(我不太清楚C ++标准在每种情况下对于编译器是什么或不需要做什么说的,这主要是为了表明这种类型的环路内分配不一定总是如此O(1))。
答案 2 :(得分:1)
不,它仍为O(1)
,如下所述:
for(var i = 0; i < N; i++){
var num = i + 5; //allocate space for var `num`
} // release space acquired by `num`