Algorithm 算法的空间复杂度

Algorithm 算法的空间复杂度,algorithm,space-complexity,Algorithm,Space Complexity,示例1:给定一个包含n个元素的数组A的输入 请参见下面的算法: Algo(A, I, n) { int i, j = 100; for (i = 1 to j) A[i] = 0; } 空间复杂度=变量i+变量'j' 在这种情况下,我的空间复杂度是:O(1)=>常量 示例2:大小为n的数组作为输入 A(A,I,n) { int i; create B[n]; //create a new array B with same number of e

示例1:给定一个包含n个元素的数组A的输入

请参见下面的算法:

Algo(A, I, n)
{
    int i, j = 100;
    for (i = 1 to j)
        A[i] = 0;
}
空间复杂度=变量
i
+变量
'j'

在这种情况下,我的空间复杂度是:O(1)=>常量

示例2:大小为n的数组作为输入

A(A,I,n)
{
    int i;
    create B[n]; //create a new array B with same number of elements
    for(i = 1 to n)
      B[i] = A[i]
}
这种情况下的空间复杂度:
i
+
新数组B
=>1+n=>O(n)

即使我在这里使用了5个变量,空间复杂度仍然是O(n)


如果根据计算机科学,我的空间复杂度对于第一个和第二个总是恒定的,即使我在上面的算法中使用了10个变量,为什么总是建议程序使用更少的变量

我确实理解,在实际场景中,它使代码更具可读性,更易于调试等

但这里仅从空间复杂性方面寻找答案。

此代码片段

Algo(A, I, n)
{
    int i, j = 100;
    for (i = 1 to j)
        A[i] = 0;
}
空间复杂度为:数组为O(1),两个变量i和j为常数空间

<> p>总是建议使用较少的变量,因为每个变量占据常数空间,如果你有k个变量。k变量将使用k*常量空间,如果让每个变量都是int类型,那么int占用2个字节,所以k*2字节,让k为10,所以这里的20个字节

这与使用int A[10]=>20字节的空间复杂度类似


我希望您理解

在性能分析中,大O复杂性并不是全部考虑因素。当你看渐近(大O)复杂度时,这都是关于你正在下降的常数。两种算法可能具有相同的big-O复杂性,但其中一种算法的成本可能是另一种算法的数千倍

例如,如果一种解决某个问题的方法总是以10秒为单位,而另一种方法则以3000秒为单位,无论输入大小如何,它们都具有O(1)时间复杂度。当然,这并不意味着两者都一样好;如果没有真正的好处,那么使用后一种方法只是浪费大量时间


这并不是说,当有人建议您节约使用局部变量时,性能是唯一的,甚至是主要的考虑因素。其他考虑因素,如可读性或避免细微错误也是一个因素。

“为什么总是建议程序使用较少的变量?”这是从哪里得到的?计算机科学与发展中的“最佳实践”关系不大;正如你所说,变量的数量总是恒定的,因此它与渐近空间复杂性无关。但是,请尝试维护一段使用1000个变量的代码。。。这是一场噩梦!另一方面,如果代码只使用2个变量,要么非常简单,要么意味着没有赋值就有非常复杂的表达式,这使得代码很难调试(这一次)。好的,我同意你的观点@Bakuriu。只是想澄清一下,即使使用较少的变量使代码可维护等等,这也不是空间复杂性的负担,对吗?(至少在上述案例中)不,这似乎不正确。“算法”总是分配相同数量的空间(100个元素),因此它在空间中是恒定的,即O(1)。是的,你需要在这里忽略作为输入的n。oops会纠正它。但是使用较少变量的推理正确吗?这一部分也是误导性的,因为你正在重新定义变量“n”在问题中的含义。您应该使用不同的字母。@RahulArora我添加了一个简单的示例。一个不需要N个工作单元的算法比一个需要5000N+7000个工作单元的算法要好,即使两者具有相同的大O复杂度。