阵列的空间复杂性?

时间:2017-06-08 08:50:41

标签: java space-complexity

我有一个大小为N的数组,N是< = 200。

这里的空间复杂性是什么。

O(1)(N) - 考虑约束条件N。

5 个答案:

答案 0 :(得分:6)

复杂性仅在您尝试使用各种输入预测算法的性能时才有意义。我不认为在没有任何背景的情况下谈论数组的空间复杂性没有任何意义。

如果你总是创建一个大小为N(硬编码)的数组,那么 O(1),因为无论你的算法输入什么输入,空间你的数组采用的是相同的。

如果你的N与输入的大小一起增长,它的 O(f(n)),其中f(n)是n(输入的大小)和N(数组大小)。

注意:公式O(...)是一个数学符号来表示幅度,而不考虑乘数(抱歉缺乏精确度,我超过了我的数学学位,从未学过英语术语),所以,如果N是常数, O(N)= O(1)(它们具有完全相同的含义)。

如果我记得正确,如果 f &lt; C * g ,O(f)= O(g)。因此,如果N <&lt; 200,O(N)= O(200)= O(1)

答案 1 :(得分:3)

通常只为算法定义空间复杂度。

但是让我们狡猾并从你的问题中形成算法。

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

存储1个号码时,需要200个内存区域。存储2个数字时,需要200个存储区。存储200个数字时,您将需要200个存储区。这意味着存储器是恒定的并且与N无关。因此复杂度为O(1)。

重要的是要注意O(1)并不意味着你需要的内存量是1,这意味着你需要的内存量与N没有任何关系。因此它不会增长N增长。

但是,如果我的对象是50GB蓝光光盘怎么办? O(1)应该非常小,但现在它将是10TB!

此时我们终于可以意识到我们并不总是需要使用Big O符号。我们可以说我们需要存储10TB的数据并购买一些硬盘。 如果你的老师对你是否为非常小的N或O(n)写O(1)大惊小怪,那么他是一个非常糟糕的老师。这个问题的答案既不会改变你的生活,也不会改变你的职业生涯。 Big O Notation仅适用于可以变得难以置信的数字。

答案 2 :(得分:2)

这取决于你的问题的情况。如果你只使用恒定的内存(或空间)。因此,空间复杂度 O(1)

但是,如果您有一些数据结构,如1D阵列,设计用于容纳N个元素,其中N可以在输入到输入之间变化,那么所需的内存量取决于N.当N很小时,所需空间也很小。当N很大时,所需的空间也很大。因此,对所需空间和输入大小存在线性依赖关系。那是 O(N)空间。

同样,如果您有一个大小为NxN的二维数组,那么通常所需空间为 O(N ^ 2)

考虑以下查找算法所需的最小空间的示例:

 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用于变量nminimumN用于array。因此,该算法的空间复杂度为 O(N)

我希望这就是你要找的东西。

答案 3 :(得分:0)

我认为它将是O(1)。如果空间大小随着n的增加而线性增加,则空间复杂度为O(n)。但在你的情况下,函数在200之后不依赖于n; f(n)= a * n + b ..

答案 4 :(得分:0)

  

我有一个大小为N的数组,N为<= 200。

好,您有一个大小为N的数组。那怎么办?意思是,存储某些数据在空间复杂度方面没有任何意义,因为不存在使用该数组(空间)的上下文(如某些代码(算法))。因此,您无法一无所获地衡量空间复杂度(没有要运行的代码,只有数据坐在那里)。

现在,如果您在某种情况下使用此数组,例如创建N倍于此输入数组(其中N <=此数组的长度)的函数的函数,则可以测量空间相对于运行时间的增长方式(语句/行数)执行)。

  

这里的空间复杂度是什么。

     

O(1)或(N)-考虑约束N?

在这种情况下,空间复杂度将为O(1),因为在运行时不会增长,因为没有要执行的代码。只是一个数据(您的数组)。

我希望这对您有帮助