我有一个大小为N的数组,其中N<=200。
在考虑到约束条件N的情况下,这里的空间复杂度将会是O(1)或(N)。
我有一个大小为N的数组,其中N<=200。
在考虑到约束条件N的情况下,这里的空间复杂度将会是O(1)或(N)。
只有在尝试使用不同的输入来预测算法性能时,复杂性才具有相关性。我认为,如果没有任何上下文环境,仅谈论数组的空间复杂度是没有意义的。
如果您总是创建固定大小为N的数组(硬编码),则其复杂度为O(1),因为无论您的算法处理什么输入,数组占用的空间都相同。
如果N随着输入大小而增长,则其复杂度为O(f(n)),其中f(n)是n(输入大小)和N(数组大小)之间的关系。
注意:O(...)公式是一种用数学符号表示数量级的方法,与乘数无关(抱歉表达不够精确,我已经超出了我的数学水平,从未学过英文术语),因此,如果N是一个常数,O(N)=O(1)(它们完全相同)。
如果我没记错的话,如果f < C * g,则O(f) = O(g)。因此,如果N小于200,则O(N) = O(200) = O(1)
createArray(N){ return new Array(K) }
,那么你的代码空间复杂度将会是O(1)。但是,createArray(N){ return new Array(N) }
的复杂度为O(N)。 - olivarra1空间复杂度通常只针对算法进行定义。
但是让我们聪明地从你的问题中形成一个算法。
Input: N values, N <= 200
Algorithm: Store all values
Output: None
空间复杂度是指执行算法所需的内存量,与N有关。
当你存储1个数字时,你需要一个存储区域。当你存储2个数字时,它会变为两倍。 你的内存复杂度是O(n),这意味着它呈线性增长;就像对于这个算法一样:
Input: N values, N <= 18,446,744,073,709,551,616 (unsigned int 64).
Algorithm: Store all values
Output: None
但是200真的很小,我们能不能说O(1)呢?
让我们再次巧妙地来解决这个问题,因为我们可以将其变成O(1):
Input: N values, N <= 200
Algorithm: Store all values in an array of size 200
Output: None
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] array = new int[n];
for(int i = 0; i < n; i++){
array[i] = in.nextInt();
}
int minimum = array[0];
for(int i = 0; i < n; i++){
if (array[i] < minimum){
minimum = array[i];
}
}
System.out.println(minimum);
n
而变化。总空间需求= 2 + N
,其中2
是变量n
和minimum
的空间,N
是array
的空间。因此,这个算法的空间复杂度为O(N)。我认为这将是O(1)的。如果空间大小随着n的增加而线性增加,则空间复杂度为O(n)。但在您的情况下,函数在200之后不依赖于n; f(n)=a*n+b。