计算已编写过程的Big-O值的一种方法是,在给定输入大小n的情况下,确定函数中哪一行代码运行次数最多。一旦有了该数字,就删除增长最快的术语,然后除去系数-这就是函数的Big-O表示法。
例如,在此函数中,每行仅运行一次,并且运行相同的时间量,而不管其大小如何a:
int first(int[] a){ printf("Returning the first element of a"); return a[0]; }
该函数本身可能需要1毫秒((1 ms)* n 0)或100毫秒((100 ms)* n 0)-确切的值取决于所用计算机的电源以及要printf()打印的内容。但是,由于这些因素不会随着的大小而变化a,因此对于Big-O计算而言,它们无关紧要-它们是常量系数,因此我们将其删除。因此,此函数的Big-O值为O(1)。
在此函数中,第3行(sum += a[i];)对中的每个元素运行一次a,共计a.length(或n)次:
int sum(int[] a){ int sum = 0; for (int i = 0; i < a.length; i++){ sum += a[i]; } return sum; }
语句i++和i < a.length每个语句也运行n次-我们可以选择这些行,但不必这样做。此外,int sum = 0;,int i = 0,和return sum;每运行一次,这是比少n次-我们忽略这些行。sum += a[i]运行多长时间无关紧要-系数取决于计算机的功能-因此我们删除了该系数。因此,此函数为O(n)。
如果有多个代码路径,通常从最坏的情况下计算big-O。例如,即使此函数无论有多大a(if a[0]is 0)都可能立即退出,但仍然存在导致第6行运行的情况a.length,所以它仍然是O(n):
int product(int[] a){ int product = 0; for (int i = 0; i < a.length; i++){ if (a[i] == 0) return 0; else product *= a[i]; } return product; }