9

这让我有点困惑。当约束如下时,我解决给定问题的方法应该是什么:

1)不使用额外空间:例如:如果我想对给定的数组进行排序,我几乎没有办法做到这一点。冒泡排序,不断交换(只是循环,没有递归)。我相信据说这是不使用额外空间的。如果我使用递归对元素进行排序,会发生什么情况。是和“不使用额外空间”一样,还是使用的堆栈计入算法的空间复杂度?

2)在O(1)空间中:O(1)空间是什么意思?这是否意味着恒定的空间。现在如果它是常数空间,那么请评论以下情况:

a)如果我在第三个变量的帮助下交换冒泡排序。它不是一个额外的空间,它不会依赖于输入的大小,所以它是恒定的空间。

b)此外,如果我对自然数应用计数排序,它实际上并不需要与总数成比例的空间量,我们是否认为它在恒定空间 O(1) 中。

如果有区别,请解释一下。谢谢

4

3 回答 3

4

根据Fortnow & Homer (2003)的说法,

计算的空间复杂度 [...] 被视为工作磁带上使用的空间量。

排序算法至少都是 O(n) 空间,因为它需要空间来存储所有输入(无论是在内存上还是在磁盘上)。因此,即使对于冒泡排序,空间复杂度仍然是 O(n)。

然而,有时,我们对整体空间复杂度不感兴趣(尤其是在上面的例子中),但我们想知道算法使用的额外空间。对于冒泡排序,我们可以说它使用了恒定数量的额外空间。

递归是一个非常特殊的情况,我们必须考虑堆栈。我们在递归时存储状态,我们根据输入多次调用递归函数。由于递归级别的数量取决于输入大小,因此空间复杂度必须考虑堆栈空间使用情况。

我不确定 O(1) 空间算法是否常见,但循环查找算法就是这样的例子之一。该算法本身仅使用恰好 2 个“指针”的空间。需要单独计算其循环的函数使用的额外空格。

在计数排序的情况下,空间复杂度取决于输入 n(计数)的大小和最大输入值 k。这两个参数相互独立,因此空间复杂度为 O(n + k)。使用的额外空间可以定义为 O(k)。

于 2012-06-01T04:28:13.590 回答
2

“没有额外空间”意味着可以通过输入获得一定数量的空间,通常正好是 n,并且不应使用更​​多空间,尽管在面试中我从不在乎候选人是否使用 O(1) 额外空间。老实说,在任何现代语言中,您都很难避免 O(1) 额外空间用于您可以采取的几乎任何微不足道的操作。

当给出算法空间复杂度的界限时,堆栈计数。

O(1) 表示常数。

计数排序使用最小 O(k) 空间,其中 k 是可能的最大键大小。因此,理论上,如果我们谈论的是固定位数上的整数,那是一个常数。这也是为什么基数排序有时被称为线性时间排序的原因。

于 2012-06-01T04:10:06.600 回答
1

O(1):它被定义为 ,其中输入以固定常数为界。我们可以将其与我们给定要输入的整数范围在 -10^5 到 10^5 之间进行比较。因此,简而言之,我们可以说它表示对要输入的值的约束。

O(n):当我们对输入没有条件时,它与上述正好相反。例如,当我们必须输入一个字符串时,我们输入的字符串的长度是没有条件的。

于 2020-01-13T11:55:50.000 回答