数组的空间复杂度



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

这里的空间复杂性是多少。

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

只有当您尝试预测算法在各种输入下的性能时,复杂性才有意义。我认为在没有任何上下文的情况下谈论数组的空间复杂性没有任何意义。

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

如果你的 N 随着输入的大小而增长,它是 O(f(n)),其中 f(n) 是 n(输入大小)和 N(数组大小)之间的关系。

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

如果我没记错的话,如果f

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

但是,让我们狡猾地从您的问题中形成一个算法。

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) 应该非常小,但现在是 10 TB!

在这一点上,我们可能最终意识到我们并不总是需要使用大O符号。我们可以说我们需要存储10TB的数据并购买一些硬盘。 如果你的老师对你写O(1)是用非常小的N还是O(n)写大惊小怪,那么他是一个非常糟糕的老师。这个问题的答案既不会改变你的生活,也不会改变你的职业生涯。大 O 表示法只对可以变得令人难以置信的大的数字有意义。

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

但是,如果您有一些数据结构,例如 1D 数组,旨在容纳 N 个元素,其中 N 可能因输入而异,那么所需的内存量取决于 N。当N小时,所需的空间也很小。当N很大时,则所需的空间也很大。因此,对所需空间和输入大小存在线性依赖关系。那是O(N)空间。

同样,如果你有一个大小为 NxN 的 2D 数组,那么通常,所需的空间是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)。

我希望这就是你要找的。

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

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

好的,您有一个大小为 N 的数组。怎么样?这意味着,存储一些数据在空间复杂性方面没有任何意义,因为没有像使用此数组(空间)的某些代码(算法)这样的上下文。因此,您无法测量无所事事的空间复杂性(无需运行代码,只需将数据坐在那里)。

现在,如果你在某些上下文中使用此数组,例如创建 N 次此输入数组的函数,其中 N <= 此数组的长度,那么您可以测量空间相对于此函数的运行时间(执行许多语句/行所花费的时间)的增长方式。

这里的空间复杂性是多少。

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

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

我希望这有帮助

最新更新