很多时候,当谈到算法的时间复杂性时,内存也会被考虑在内。我想知道big-O(1),big-O(n),big-O(n * n)内存是什么意思?
它与时间复杂性有何关系?
答案 0 :(得分:19)
正如xmoex所说:
o(1)构成常量内存使用。因此,输入量无关紧要。
o(n)构成线性内存使用。因此,更多输入意味着线性更多的内存。
o(n * n)构成二次存储器使用。因此,更多的输入意味着更多的内存(平均x ^ 2。
在大多数情况下,这种内存复杂度的度量与时间复杂度的度量完全无关。对于计算机算法,重要的是要知道算法将如何管理这两种复杂性以决定算法的质量。但是两者都必须单独计算。根据您的使用案例和问题的情况,一个可能比另一个更重要。
答案 1 :(得分:6)
o(1)表示恒定的平均内存使用量,无论输入的大小如何 o(n)表示如果你正在处理n个元素,你的平均内存需求会增长 o(n * n)表示如果您正在处理n个元素,则平均内存需求将增长为二次
有一篇关于所谓的big o notation的wiki文章(也涵盖了很少的......)
答案 2 :(得分:1)
我不确定你的意思是大O还是little-O,但我会更广泛地回答。
对于内存而言,它与时间的含义相同。如果函数在内存O(1)中增长,则无论输入大小如何,它都使用恒定的内存量。如果函数在O(n)中增长,则使用线性量,而O(n * n)则使用二次量。
答案 3 :(得分:1)
在mamory方面的复杂性意味着需要多大的内存大小增长同时增加一些待处理的项目。一个很好的例子是排序算法。
O(1)
和O(log n)
意味着在排序N项算法时需要更少的内存,然后为N个项目分配总内存。 (AKA就地分拣)O(n)
- 内存消耗是线性的,因此只要项目数增长,内存消耗就会增长O(n*n)
表示算法需要更多额外的内存。答案 4 :(得分:1)
这里每个人都解释了Big O符号的含义。所以,我不打算再解释一下。但我会简要解释一下你。
采取任何没有循环的小程序。
{ int a=1;
print("%d",a);
}
该程序的执行时间可以忽略不计。让,声明和打印需要单位时间。所以它的时间复杂度将是O(1)
另一个带有一个循环且运行n次的程序
{int a,i;
long n=10000000;
for(i=0;i<n;i++)
// doing some calculations
}
正如你在这里看到的那样,声明的时间可以忽略不计,即O(1)。如果我们让第4行占用一些时间单位,即O(n)。然后,总体时间复杂度将是
O(1)+O(n)=O(n).
现在你可以理解O(n * n),即2个循环。
为了更好地理解......
在未排序列表中查找项目= O(n)
通过简单算法或冒泡排序乘以两个n位数字= O(n * n)
使用二进制搜索= O(log n)
查找已排序数组中的项目蛮力的推销员问题= O(n!)