在循环中声明的变量是否会使空间复杂度为O(N)?

时间:2017-06-11 04:26:25

标签: algorithm loops memory big-o space-complexity

for循环内循环N次的变量是否会使空间复杂度为O(N),即使每次循环重复时这些变量都超出范围?

for(var i = 0; i < N; i++){
  var num = i + 5;
}

3 个答案:

答案 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`