你询问的是计算机科学中被称为算法复杂性分析的主题。写程序时考虑算法复杂度非常重要,因为它与运行时间有关,即你的计算需要多长时间才能完成。
大O符号,或者O(n),代表算法执行的上限运行时间。在这种情况下,O(n)表示对于n个元素,算法计算需要考虑所有n个元素才能完成,是一种线性的计算方式。这种大O时间复杂度的范围从常数时间O(1)到非常缓慢的O(n^n)。同时还要考虑以下方程式:
y=10n+1
y=5n+10
这两个的时间复杂度都是O(n),因为随着元素数量的增加,方程式会变得越来越大。我们忽略常数,因为方程式将由于变量而变得更大和更快,而不是由于永远不变的常数值而变化。
而对于以下方程:
y=10n^2+5n+5
由于10n^2是导致方程增长更快的最大增长元素,因此复杂度将为O(n^2)。我们删除常量并考虑方程中增长最快的组成部分来评估复杂度。
对于Big-Omega复杂度,我们认为这是算法复杂度分析的下限。例如,一个算法可能在Omega(n)(最好情况)下运行得很快,但最长需要O(n^2)(最坏情况),这在排序算法或搜索算法的分析中很常见。
在某些情况下,为了优化原因,我们希望编写具有高效和更快算法的程序,特别是当我们想要更快的解决方案或更快的运行时间时。
您提供的代码示例是O(n),因为它使用for循环迭代n个元素。考虑双重for循环,其中在当前for循环中有第二个循环。由于在最坏情况下迭代n*n个元素,因此这是O(n^2)。
用于初始化空矩阵的O(n^2)运行时间的Java伪代码:
int result[n][m];
for(int i=0; i<n; ++i){
for(int j=0; j<m; ++j){
result[i][j] = 0;
}
}
请注意,它使用了两个循环,因此导致了O(n^2)的运行时间。
下面是一张图表展示方程式随时间增长的情况(以及它们增长的速度):
![Graph](https://social.msdn.microsoft.com/Forums/getfile/329411)