术语 O(1) 空间和不使用额外空间的含义
Posted
技术标签:
【中文标题】术语 O(1) 空间和不使用额外空间的含义【英文标题】:Meaning of the terms O(1) space and without using extra space 【发布时间】:2012-06-06 08:07:37 【问题描述】:这让我有点困惑。当约束如下时,我解决给定问题的方法应该是什么:
1) 不使用额外空间: 例如:如果我想对给定的数组进行排序,我几乎没有办法做到这一点。 冒泡排序,不断交换(只是循环,没有递归)。我相信据说这是不使用额外空间的。 如果我使用递归对元素进行排序,会发生什么情况。是和“不使用额外空间”一样,还是使用的堆栈计入算法的空间复杂度?
2) 在 O(1) 空间中: O(1) 空间的含义是什么?这是否意味着恒定的空间。现在如果它是常数空间那么请评论以下情况:
a) 如果我在第三个变量的帮助下进行冒泡排序。它不是一个额外的空间,它不会依赖于输入的大小,所以它是恒定的空间。
b) 此外,如果我将计数排序应用于自然数,它实际上并不需要与总数成正比的空间量,我们是否认为它在恒定空间 O(1) 中。
如果有区别,请解释一下。 谢谢
【问题讨论】:
【参考方案1】:“没有多余的空间”意味着一定数量的空间,通常正好是 n,可通过输入获得,并且不应使用更多空间,尽管在面试中我从不在乎候选人是否使用 O(1) 额外空间。老实说,在任何现代语言中,您都很难避免 O(1) 额外空间用于您可以采取的几乎任何琐碎操作。
在限制算法的空间复杂度时堆栈计数。
O(1) 表示常数。
计数排序至少使用 O(k) 空间,其中 k 是可能的最大键大小。因此,理论上,如果我们谈论的是固定位数上的整数,那是一个常数。这也是为什么基数排序有时被称为线性时间排序的原因。
【讨论】:
要清楚,计数排序使用 O(k) additional 空间,但总体空间为 O(n + k),因为您甚至需要占用空间来存储输入考虑。基数排序与计数排序有些不同,请不要混淆两者。【参考方案2】:根据Fortnow & Homer (2003),
计算的空间复杂度 [...] 被视为工作磁带上使用的空间量。
排序算法至少都是 O(n) 空间,因为它需要空间来存储所有输入(无论是在内存上还是在磁盘上)。因此,即使是冒泡排序,空间复杂度仍然是O(n)。
但是,有时,我们对整体空间复杂度不感兴趣(尤其是在上述情况下),但我们想知道算法使用的额外空间。对于冒泡排序,我们可以说它使用了恒定数量的额外空间。
递归是一个非常特殊的情况,我们必须考虑堆栈。我们在递归时存储状态,我们根据输入多次调用递归函数。由于递归层数取决于输入大小,空间复杂度必须考虑堆栈空间使用情况。
我不确定 O(1) 空间算法是否常见,但循环查找算法就是这样的示例之一。该算法本身仅使用恰好 2 个“指针”的空间。需要单独计算其循环的函数使用的额外空间。
在计数排序的情况下,空间复杂度取决于输入n的大小(计数)和最大输入值k。这两个参数是相互独立的,因此 空间复杂度为 O(n + k)。使用的额外空间可以定义为 O(k)。
【讨论】:
【参考方案3】:O(1) :它被定义为 ,其中输入以固定常数为界。我们可以将其与我们给定要输入的整数范围在 -10 之间进行比较^5 到 10^5。 所以简而言之,我们可以说它表示对要输入的值的限制。
O(n) :当我们对输入没有条件时,它与上面的正好相反。 例如,当我们必须输入一个字符串时,我们输入的字符串的长度是没有条件的
【讨论】:
以上是关于术语 O(1) 空间和不使用额外空间的含义的主要内容,如果未能解决你的问题,请参考以下文章
2021-09-20:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O