在循环中声明的变量是不是会使空间复杂度 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 循环中的 while 循环的时间复杂度?