1、n是算法的输入规模,例如有100W的数据需要排序,那么输入规模n就是100W
2、输入规模n对代码复杂度的影响,主要体现在循环上:
for(i = 1; i < n; i*=2){
sys.out
sys.out
}
当 2*2*2 ... *2 = n(假设x个2相乘时结束),即2^x = n 结束,执行次数x=log2(n),再算上执行两次sys.out,则为:2*log2(n)。我们可以记这个执行次数为T(n),成为算法的相对时间。
注意:我们不会统计究竟算法执行了多长时间,因为这和计算机性能,虚拟机性能,数据长度等有关,我们只统计逻辑上的执行次数
3、如果存在一个f(n),使得当n->无穷大时,有T(n)/f(n)=常数,那么称f(n)是T(n)的同数量级函数,记作T(n)=O(f(n)),称O(f(n))是算法的渐进时间复杂度,简称时间复杂度。
把T(n) 统一为一个数量级函数O(f(n)),以至于各种不同的算法,而f(n)可以是一些常见的标准函数,故最终可以统一成如O(n),O(n^2),O(log(n))等
4、时间复杂度的统计,如有下面代码片段:
sys.out
for(i = 0; i<n ; i++){
sys.out
}
for( i = 1; i < n; i *=2){
sys.out
sys.out
}
for( i = 0; i < n*n; i++){
sys.out
sys.out
sys.out
}
总的执行次数如下:
1 + n + 2*log(n) + 3*n^2 ,当n->无穷时,与n^2是同数量级函数,所以时间复杂度就是O(n^2)
简单总结为:
(1)只保留执行次数的最高阶项
(2)忽略最高阶项的系数