我对空间复杂性感到非常困惑。 如果我使用HashMap或ArrayList或其他数据结构,这意味着我已经创造了一个新的空间,所以空间复杂度是线性的吗?
答案 0 :(得分:1)
空间复杂性意味着算法需要运行的空间。
示例1:排序算法
所有排序算法至少需要O(n)
空间来保存他们必须排序的列表(长度为n
)
n!
个排列,因此此算法需要O(n * n!)
空间。 示例2:数字表示
可以用不同方式保存数字n
:
≥2
):由于O(log n)
n = 2log n
个空格
n
作为一个(n = 1 + 1 + 1 + ... + ... + 1
)的总和,你必须保存每一个。因此O(n)
。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)