时间频度(T(n)):语句被执行的次数。
时间频度的特点(当n较大时):
- 可以忽略常数项。
- 可以忽略低次项。
- 可以忽略系数(当指数大于2时不能忽略)。
比如,一个算法的时间频度是 3n^2+2n+1 ,这时我们可以把常数项(1),低次项(2n),以及系数(3)都可以忽略掉,变成 n^2(再强调一下,当指数超过2,即为立方或更高次幂时,不能忽略系数)。
时间复杂度:
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f (n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。这是百度百科上的解释,理解不了的,可以根据上述时间频度的特点,将能忽略的都忽略掉,得到的即为 f(n)。
常见的时间复杂度(时间复杂度从小到大):
- 常数阶(O(1))
- 对数阶(O(logn))
- 线性阶(O(n))
- 线性对数阶(O(nlogn))
- 平方阶(O(n^2))
- 立方阶(O(n^3))
- k方阶(O(n^k))
- 指数阶(O(2^n))(指数阶的时间复杂度已经很大了,在写代码时注意避免。)
举例:
常数阶:无论代码有多长,只要没有循环等复杂结构,代码执行次数不随某个变量增加而增加,那么这些代码的时间复杂度就是常数阶。
int i = 3;
int j = 5;
i++;
j++;
int n = i + j;
对数阶:
int i = 1;
while(i < n){
i = i * 2;
}
线性阶:一个for循环。
线性对数阶:
for(int i=0;i<n;i++){
j = 1;
while (j < n){
j = j * 2;
}
}
平方阶:两层for循环。
立方阶:三层for循环。
k方阶:k层for循环。