首先了解T(.)
我们所看到的时间复杂度一般是O(.)这样表示,但O(.)是一种粗略的表示。
T(.)表示当前程序执行的次数。如:
for(int i=0,i<3,i++){
printf("yyds");
}
那么这段程序的执行次数是11次。我们可以写为T(11)。
再看下面这个代码:
for(int i=0,i<n,i++){
printf("yyds");
}
那么这段程序的执行次数是3n+2次。我们可以写为T(3n+2)。
使用程序语句执行时间的次数来表示代码块的时间复杂度,计算起来太繁琐,不利于粗略评估;那么就提出使用O(.)来粗略的表示代码的时间复杂度
则有:
T(n)=11 --> 常数 --> O(1)
T(n)=3n+2 --> 常数 *n + 常数 --> O(n)
T(n)=3n2+2 --> 常数 *n2 + 常数 --> O(n2)
T(n)~~f(n)~~O(n)
这相当于数学中求极限时的一种近似。即可忽略系数项、低次方项、常数项
关于O(.)
再看下面这个代码:
for(int i=1,i<n,i*=2){
printf("yyds");
}
关于这个函数的时间复杂度时O(logn)。具体推导如下:
我们使用8,16这个两个数进行推算一下 T(.):
T(8)=3+3+(3+1)+1=3X(3)+2 --> 3
T(16) = 4+4+(4+1)+1=3X(4)+2–>4
23=8
24=16
…
2T(n)=n
T(n)=O(logn)
名称 | 时间复杂度 |
---|---|
常数时间 | O(1) |
对数时间 | O(logn) |
线性时间 | O(n) |
线性对数时间 | O(nlogn) |
二次时间 | O(n2) |
指数时间 | O(2n) |