如何正确理解空间复杂性?

时间:2014-04-23 01:12:05

标签: space-complexity

我对空间复杂性感到非常困惑。 如果我使用HashMap或ArrayList或其他数据结构,这意味着我已经创造了一个新的空间,所以空间复杂度是线性的吗?

2 个答案:

答案 0 :(得分:1)

空间复杂性意味着算法需要运行的空间。

示例1:排序算法
所有排序算法至少需要O(n)空间来保存他们必须排序的列表(长度为n

  1. Bubblesort(以及大多数其他排序算法)也可以就地,这意味着它不需要更多空间,因为它需要保存列表。 (只是按错误的顺序搜索两个元素并交换它们)
  2. Stupid-Sort 列出输入列表的所有排列(并保存它们),然后搜索已排序的排列。由于存在n!个排列,因此此算法需要O(n * n!)空间。
  3. 示例2:数字表示
    可以用不同方式保存数字n

    1. 二进制(或任何其他基础≥2):由于O(log n)
    2. ,这需要n = 2log n个空格
    3. 一元:在这里你写n作为一个(n = 1 + 1 + 1 + ... + ... + 1)的总和,你必须保存每一个。因此O(n)
    4. 需要n = n ⋅ 1空间

      对不起这个愚蠢无用的例子。我只是选择一些简单的东西。

答案 1 :(得分:1)

首先,关于您的问题:If I use HashMap or ArrayList or other data structure, dose this mean I have made a new space,so the space complexity is linear?

答案是“不,空间复杂性不是线性的。”
这些数据结构有它们的实现。因此空间复杂性取决于结构的实现 例如(在Java中):

ArrayList:它由Resizable-array实现。容量是用于存储列表中元素的数组的大小。当元素添加到ArrayList时,其容量会自动增加。因此,如果您使用它,空间复杂性将在您的程序中添加此ArrayList的实际大小。

HashMap:它有点复杂。 HashMap中的元素存储在 transient Entry[] table;
而Entry的实现是:

static class Entry<K,V> implements Map.Entry<K,V> {
final K key;
V value;
Entry<K,V> next;
final int hash;
.........
}

Here are more details.

众所周知,计划有两个主要特征:
1.时间复杂度 - &gt; CPU使用率
2.空间复杂性 - &gt; RAM使用

程序的空间复杂度(对于给定的输入)是该程序在执行期间需要存储的基本对象的数量。 该数字是根据输入数据的大小n计算的。

空间复杂性:例1 // note: x is an unsorted array int findMin(int[] x) { int k = 0; int n = x.length; for (int i = 1; i < n; i++) { if (x[i] < x[k]) { k = i; } } return k; }
S(fi ndMin,n)= n + 2
T(fi ndMin,n)= O(n)

空间复杂性:例2 // note: x is an unsorted array void multVect(int[] x, int[][] a) { int k = 0; int n = x.length; for (int i = 1; i < n; i++) { for (int j = 1; j < n; j++) { a[i][j] = x[i] * x[j] } } }
S(multVect,n)= n×n + 2
T(multVect,n)= O(n ^ 2)