我对O(n)在太空中的含义有了高度的了解。对于具有输入n的算法而言,这意味着某些内容,此算法分配的内存中的附加存储将与n成比例增加。
因此,如果您有一个算法将数字n作为输入,并创建一个大小为2n的数组并填充它将全部为0,则时间复杂度为O(n),空间复杂度为O(n)因为您正在创建一个相对于输入大小的数组(附加存储)。这种理解是否正确?
其次,O(n)的空间复杂度有多糟糕?像快速排序这样的流行排序算法具有O(n)的最差情况空间复杂度,因此对于任意长数据的排序,O(n)空间复杂度是否可能具有可怕的影响?如果是这样,对于为什么或如何有任何直觉?
答案 0 :(得分:5)
大O表示法中的N通常表示输入的大小,而不是传递给算法的值。
O(n)的空间复杂度意味着对于每个输入元素,可能最多分配固定数量的k个字节,即运行算法所需的内存量不会比k * N时的线性增长更快。 / p>
例如,如果排序算法分配N / 2个元素的临时数组,则该算法具有O(n)空间复杂度。
如果没有某些背景,就无法说是好还是坏。在许多情况下,O(N)的空间复杂性是可以接受的,但规则有例外。有时,您会增加内存复杂性以降低时间复杂度(即,为了显着的加速而支付内存)。这几乎被普遍认为是一个很好的权衡。
答案 1 :(得分:-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)意味着您可能必须查看索引中的每个元素以找到您所在的那个元素寻找。即在找到匹配项之前,算法并不比仅通过整个列表好多少。与各种长期已知的树索引结构相比,它的效率低,这需要花费O(n)时间 - 也就是说,查找某些内容的时间不会与索引中元素的数量呈线性比例增加,因为树结构会减少需要与指数较浅的曲线进行比较的次数。
其他一些类型的算法可能没有比O(n)更好的已知解决方案,例如所有可能相互影响的AI代理字段。