【问题标题】:What is O(1) space complexity?什么是 O(1) 空间复杂度?
【发布时间】:2017-09-01 19:42:22
【问题描述】:

我很难理解什么是 O(1) 空间复杂度。我理解这意味着算法所需的空间不会随着输入或我们使用算法的数据的大小而增长。但这究竟是什么意思?

如果我们在链表上使用算法,比如 1->2->3->4,要遍历链表到达“3”,我们声明一个临时指针。并遍历列表直到我们到达 3。这是否意味着我们还有 O(1) 的额外空间?或者它是否意味着完全不同的东西。如果这根本没有意义,我很抱歉。我有点困惑。

【问题讨论】:

  • o(1) 空间复杂度意味着您使用的内存量是恒定的,不依赖于它正在处理的数据,更多信息here
  • @RodrigoGonzalez 这并非完全正确。首先你写了 little-o,它和 big-O 不一样。假设您的意思是 Big-O:假设您有一个函数接受单个整数输入 n,它使用 10 kB 用于偶数 n 和 20 kB 用于奇数 n。此函数占用O(1) 空间,但它肯定不会占用恒定数量的空间。请不要将这与 constant space 混淆,后者表示一个常数 上限,而不是一个常数 amount

标签: complexity-theory space-complexity


【解决方案1】:

为了回答你的问题,如果你有一个遍历列表的遍历算法,它分配一个指针来这样做,遍历算法被认为是 O(1) 空间复杂度。另外,假设遍历算法不需要1个指针而是1000个指针,空间复杂度仍然认为是O(1)。

但是,如果假设由于某种原因,算法在遍历大小为 N 的列表时需要分配“N”个指针,即它需要分配 3 个指针来遍历包含 3 个元素的列表,10 个指针用于遍历大小为 N 的列表10 个元素,1000 个元素的列表的 1000 个指针等等,那么该算法被认为具有 O(N) 的空间复杂度。即使“N”非常小(例如 N=1)也是如此。

总结上面的两个例子,O(1) 表示常量空间使用:算法分配相同数量的指针,与列表大小无关。相比之下,O(N) 表示线性空间使用:算法空间使用随输入大小一起增长。

【讨论】:

  • 临时指针和非临时指针有什么关系?提前感谢解答。
  • 对不起,这个词与答案无关,因此将其删除:) 当我们谈论空间复杂度时,我们只关心程序执行期间使用的存储空间。
  • 为了更好地理解什么是大 O:如果你有 1000 个指针,你也可以说它是 O(1000)。这与 O(1) 相同,因为 big-O doesn't care 大约是 constant factors。通常使用 O(1),因为它是最简单的形式。
  • 公平地说,任何返回数据副本的纯算法必须至少为 O(N),而(就地)变异数据的算法可能为 O(1)?
  • 如果指针的数量根据输入发生变化,但指针的最大数量最多只能达到 100,这会被视为 O(1) 还是 O(N)?
【解决方案2】:

假设我创建了一些具有固定大小的数据结构,无论我对数据结构做什么,它都将始终具有相同的固定大小。因此,对该数据结构执行的操作是 O(1)。

举个例子,假设我有一个固定大小为 100 的数组。我所做的任何操作,无论是从数组中读取还是更新元素,该操作在数组上都是 O(1)。数组的大小(以及它使用的内存量)没有改变。

另一个例子,假设我有一个 LinkedList,我向其中添加元素。每次我向 LinkedList 添加一个元素时,都会对列表进行 O(N) 操作,因为我正在增加将所有元素保存在一起所需的内存量。

希望这会有所帮助!

【讨论】:

  • 这是一个非常糟糕的例子。虽然 C 数组在对其成员应用操作时不会改变大小,但其他语言并非如此
  • 我明白,这个特定的例子适用于 C 语言,可能不适用于其他语言的实现。一旦我有时间,我会在我的解释中添加一个附录。感谢您的输入@symcbean
  • 这不是O(1) 的意思。 O(1) 函数不需要对所有输入使用 fixed 大小,它只需要对所有输入有一个恒定的上限(在空间上)。例如,假设您有一个接受单个整数输入 n 的函数,它使用 10 kB 用于偶数 n 和 20 kB 用于奇数 n。此函数占用O(1) 空间,但它肯定不使用固定大小。但是,上限是固定的,为 20 kB。
【解决方案3】:

它只是程序使用的内存量。相对于输入大小,算法完成其执行所需的主内存的计算机内存量。

算法的Space Complexity(s(P)) 是算法完成其执行相对于输入大小所占用的总空间。它包括常量空间和辅助空间。

S(P) = 常数空间 + 辅助空间

恒定空间是该算法固定的空间,通常等于输入和局部变量使用的空间。辅助空间是算法使用的额外/临时空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 2020-09-11
    • 2021-01-01
    • 2019-10-08
    • 2015-05-25
    相关资源
    最近更新 更多