这对我来说有点混乱。当约束如下时,我应该如何解决给定问题:
1)不使用额外空间: 例如:如果我想对给定的数组进行排序,我几乎没有办法。 冒泡排序,继续交换(只是循环,没有递归)。我相信据说没有使用额外的空间。 如果我使用递归来对元素进行排序是什么情况。它是否与“不使用额外空间”相同,或者使用的堆栈是否算在算法的空间复杂度中?
2)在O(1)空间: O(1)空间是什么意思?这是否意味着恒定的空间。现在,如果它是恒定空间,那么请评论以下情况:
a)如果我在第三个变量的帮助下交换冒泡排序。它不是一个额外的空间,它不会取决于输入的大小,所以它是在恒定的空间。
b)此外,如果我使用计数排序应用于自然数,它不需要与总数成比例的空间量,我们是否认为它在恒定空间O(1)。< / p>
请解释其中的差异。 感谢
答案 0 :(得分:4)
计算的空间复杂性被视为工作磁带上使用的空间量。
排序算法至少都是O(n)空间,因为它需要空间来存储所有输入(无论是在内存还是在磁盘上)。因此,即使对于冒泡排序,空间复杂度仍为O(n)。
然而,有时候,我们对整体空间复杂性(特别是上面的情况)不感兴趣,但我们想知道算法使用的额外空间。对于冒泡排序,我们可以说它使用了一定量的附加空间。
递归是一个非常特殊的情况,我们必须考虑堆栈。我们在递归时存储状态,并根据输入多次调用递归函数。由于递归级别的数量取决于输入大小,因此空间复杂度必须考虑堆栈空间的使用。
我不确定O(1)空间算法是否常见,但循环查找算法就是这样的例子之一。该算法本身仅使用空间来准确指出&#34;指针&#34;。要查找的循环的函数使用的额外空格应单独计算。
在排序计数的情况下,空间复杂度取决于输入n(计数)和最大输入值k的大小。因此,2个参数彼此独立 空间复杂度为O(n + k)。使用的附加空间可以定义为O(k)。
答案 1 :(得分:2)
“没有多余的空间”意味着通过输入可以获得一定量的空间,通常正好是n,并且不应该使用更多空间,尽管在一次采访中我从不关心候选人是否使用额外的O(1)。老实说,你会很难用任何现代语言来避免O(1)额外的空间,几乎可以采取任何琐碎的行动。
在给出算法空间复杂度的界限时,堆栈会计算。
O(1)表示常数。
计数排序使用最小O(k)空间,其中k是最大可能的关键量值。因此,理论上如果我们在固定位数上讨论整数,那就是常数。这也是为什么基数排序有时被称为线性时间排序的原因。
答案 2 :(得分:1)
O(1):定义为,其中输入由固定的常数限制。我们可以将其与输入整数范围在-10之间的值进行比较。 ^ 5到10 ^ 5。 因此在breif中,我们可以说它表示要输入的值的界限。
O(n):当我们对输入没有任何条件时,它与上面的相反。 例如,当我们必须输入一个字符串时,输入的字符串长度就没有条件