时间复杂度
渐进时间复杂度(asymptotic time complexity):
若果存在函数f(n),使得当n区域无穷大时,T(n)/f(n)的极限值为不为零的常数,则f(n)是T(n)的同数量级函数,记作T(n)=O(f(n)),称为O(f(n)),O为算法的渐进时间复杂度,简称时间复杂度。因为渐进时间复杂度用大写O来表示,所以也被为大O表示法。
如何推导出时间复杂度呢?
①如果运行时间是常数量级,则用常数1表示;
②值班刘时间函数的最高阶项;
③如果最高阶项存在,则省去最高阶项前的系数。
怎么计算时间复杂度,看下面几个例子:
1、
public void test1(){
System.out.println("Hello"); //需要执行一次;
System.out.println("World"); //需要执行一次;
}
T(n) = 2,执行次是常量,则转化时间复杂度为T(n) = O(1)
2、
void test2(int n) {
for (int i = 0; i < n; i++) {
System.out.println("Hello"); //需要执行一次;
System.out.println("World"); //需要执行一次;
System.out.println("!!!!!!"); //需要执行一次;
}
}
T(n) = 3n,执行次是线性的,则转化时间复杂度为T(n) = O(n)
3、
void test3(int n) {
for (int i = 0; i > n; i *= 2) {
System.out.println("等一分钟"); //需要执行一次;
System.out.println("等一分钟"); //需要执行一次;
}
}
上面这段代码以为每次循环中i 乘以2,所以循环退出条件为2^x>n;则x次后退出循环;即 次;即T(n) = 2logn。所以这个循环的时间复杂度为O(logn)。
4、
void test4(int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) {
System.out.println("等一分钟"); //需要执行一次;
}
System.out.println("做点什么"); //需要执行一次;
}
}
第一次中打印语句1次,第二次执行2执行2次...第n次执行n次,一共执行了1+2+3+...+n次,T(n) = 0.5n^2 + 0.5n,执行次数使用多项式表示的,即O(n)=n^2
常见的时间复杂度:O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n)