# 一、时间复杂度的定义
T(n) = O(f(n))当且仅当存在正常数c和n0,对所有的的n(n>=n0)满足T(n) <= c*O(f(n)).(一般考虑n比较大时的情况)
此处T(n)为算法的时间复杂度,其中n为算法所处理的数据元素个数,则T(n) = O(f(n))表示算法的时间复杂度随n的增长率与函数f(n)的增长率相同,或者说两者具有相同的数量级。
用大写O()来描述时间复杂度,称之为“大O记法”。
一般情况下,随着输入规模n的增大,T(n)增长最慢的算法为最优算法。
# 二、推导时间复杂度的方法
1、当运行时间只有常数时,则用1来代替。
如:int i = 16, j = 100; //执行一次
printf("hello world"); //执行一次
printf("%d",i); //执行一次
printf("%d",j); //执行一次
上述语句一共执行4次,但时间复杂度并不是O(4),而是O(1)。
2、在得到的运行次数函数中,只保留最高阶,且除去最高阶项中相乘的常数(此常数不为1)。
如:执行次数为f(n) = 2*n^3+4*n^2+6*n+16,时间复杂度为T(n) = O(f(n)) = O(n^3)
# 三、常见的时间复杂度
名称 | 时间复杂度 | 例子 |
常数阶 | O(1) | 100 |
线性阶 | O(n) | 2*n+1 |
平方阶 | O(n^2) | 6*n^2+2*n |
对数阶 | O(log(m)n) | 3*lb6+4 |
nlog阶 | O(n*log(m)n) | 3*n+3*n*log(3)n+16 |
立方阶 | O(n^3) | n^3+6*n+16 |
指数阶 | O(2^n) | 2^n+16 |
lbn为求n的以2为底的对数,即log(2)n
常见的时间复杂度耗费的时间从小到大的顺序为:
O(1)<O(log(m)n)<O(n)<O(n*log(m)n)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
注意:一般求解时间复杂度时,需要考虑的是算法的最坏情况。