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

Posted

技术标签:

【中文标题】在循环中声明的变量是不是会使空间复杂度 O(N)?【英文标题】:Do variables declared in loop make space complexity O(N)?在循环中声明的变量是否会使空间复杂度 O(N)? 【发布时间】:2017-11-12 19:17:19 【问题描述】:

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

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

【问题讨论】:

不,这被认为是常量空间。所以总共 O(1)。 你为什么不把你的评论变成答案? 【参考方案1】:

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

,因为变量在每次迭代结束时都会超出范围,因此它们会被销毁。

因此空间复杂度保持不变,即 O(1)。

【讨论】:

【参考方案2】:

您更改 n 次(可能包括取消分配和重新分配)的 1 个(固定大小)变量仍然只是 1 个变量,因此 O(1) 空间。

但这可能在某种程度上取决于语言 - 如果某种语言(或编译器)决定将所有这些变量的早期声明保留在内存中,那将是 O(n),而不是 O(1)

例如,考虑在 C++ 中执行此操作的两种方法:

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 时,该内存不会被自动释放,因此在后一种情况下,每次迭代都会分配更多内存而不是重用旧内存(从技术上讲,指针将被重用,但它指向的内容将保留) ,因此它将使用O(n) 空间。这样做是一个糟糕的想法,并且会导致内存泄漏,但它肯定是有可能的。

(我不太清楚 C++ 标准对编译器在每种情况下需要或不需要做什么的规定,这主要是为了表明这种类型的循环赋值不一定总是 O( 1))。

【讨论】:

【参考方案3】:

不,它仍然是O(1),如下所述:

for(var i = 0; i < N; i++)
  var num = i + 5; //allocate space for var `num`
 // release space acquired by `num`

【讨论】:

以上是关于在循环中声明的变量是不是会使空间复杂度 O(N)?的主要内容,如果未能解决你的问题,请参考以下文章

这个函数(for循环)空间复杂度是O(1)还是O(n)?

为啥在嵌套函数之外声明一个计数器变量会使循环慢 5 倍?

是否会以O(n ^ 2)复杂度运行循环中的变量?

如何计算嵌套在 for 循环中的 while 循环的时间复杂度?

为啥计数排序的时间和空间复杂度是 O(n + k) 而不是 O(max(n, k))?

这个程序的空间复杂性是多少?