【问题标题】:What exactly does O(n) space complexity mean and how inefficient is it?O(n) 空间复杂度到底是什么意思,它的效率有多低?
【发布时间】:2015-02-24 03:34:50
【问题描述】:

我对 O(n) 在空间中的含义有很高的理解。这意味着对于输入为 n 的算法,该算法在内存中分配的额外存储空间将与 n 成比例地增加。

因此,如果您有一个算法,将数字 n 作为输入,并创建一个大小为 2n 的数组并将其填充为全 0,则时间复杂度将为 O(n),空间复杂度为 O(n)因为您正在创建一个与输入大小相关的数组(附加存储)。这种理解正确吗?

其次,O(n) 的空间复杂度有多糟糕?流行的排序算法,如快速排序,最坏情况下的空间复杂度为 O(n),所以对于任意长的数据进行排序,O(n) 空间复杂度是否可能产生可怕的影响?如果是这样,是否有任何关于为什么或如何的直觉?

【问题讨论】:

  • 我有时想知道学校里的错误信息会给出诸如“O(n) 的空间复杂度有多糟糕”之类的问题。它就是这样,它要么适合,要么你把你的算法扔到窗外去尝试别的东西(或放弃)。作为旁注,您极不可能低于 O(n),因为您可能首先将所有 n 值保存在内存中。
  • 这个问题似乎离题了,因为它是关于一般编程概念的——它更适合程序员 SE。

标签: algorithm sorting data-structures time-complexity space-complexity


【解决方案1】:

O(n) 意味着成本随着输入元素的数量以线性而不是指数(例如 O(n^2))或对数(例如 O(log(2)))的速率增加,这在这些情况下,例如键表中的元素数量。如果您需要您的算法有效地处理较大的 n 值,O(n) 是不好的,特别是如果您可以使用一种替代方案,它的比例小于线性比例(例如 O(log(n)))。

时间复杂度和空间复杂度是不同的问题。

只有当 n 的可能值最终会使用有问题的内存或存储量时,空间复杂性才是一个大问题。在许多情况下,可能需要 O(n) 进行存储,因为为了在某些情况下达到小于 O(n) 的目标,您需要压缩数据,和/或您的数据可能有重复。对于一个基本示例,如果您有一个键/值函数,其中值很大但经常重复,则为每个键复制值可能效率低下,这将是 O(n),因此存储在映射而不是数组中对于空间来说可能效率更高。

在索引查找算法的情况下,通常会说最坏情况 O(n) 的时间复杂度不好,因为 O(n) 意味着您可能必须查看索引中的每个元素才能找到您要的那个寻找。 IE。该算法并不比只遍历整个列表直到找到匹配项好多少。与各种众所周知的树索引结构相比,它的效率低下,这确实需要 O(n) 时间 - 也就是说,查找某些内容的时间不会与索引中的元素数量成线性比例增加,因为树结构减少了与指数较浅的曲线进行比较所需的次数。

某些其他类型的算法可能没有比 O(n) 更好的已知解决方案,例如所有可能相互交互的 AI 代理领域。

【讨论】:

  • O(n) 并不意味着成本与(一些)n 成正比。
【解决方案2】:

大 O 表示法中的 N 通常表示输入的大小,而不是传递给算法的值。

O(n) 的空间复杂度意味着对于每个输入元素,最多可以分配固定数量的 k 字节,即运行算法所需的内存量增长速度不会快于 k*N 处的线性增长。

例如,如果排序算法分配 N/2 个元素的临时数组,则称该算法具有 O(n) 空间复杂度。

如果没有上下文,就不可能说它是好是坏。在许多情况下,O(N) 的空间复杂度是可以接受的,但也有例外。有时您会增加内存复杂度以降低时间复杂度(即为显着加速而支付内存费用)。这几乎被普遍认为是一个很好的权衡。

【讨论】:

  • 可能值得一提的是 big-o 和 theta 表示法之间的区别。
  • 你很小心地说你可以为每个输入元素分配最多 k 个字节,但接着说错了“即调整算法所需的内存量随着 k*N 线性增长”。 O 是一个上限,不是一个精确的描述(直到一个常数),只有最简单的 O(N) 函数是线性的。
猜你喜欢
  • 2023-03-16
  • 2011-01-14
  • 1970-01-01
  • 2012-01-03
  • 2010-12-26
  • 2015-05-25
  • 2017-09-01
  • 2011-10-22
  • 1970-01-01
相关资源
最近更新 更多