定义
Time Complexity(时间复杂度) 用来定性的描述算法的执行时间的一个函数,更类似于一个耗时的趋势,函数表示为: O(f(n))
公式
T(n) = O(f(n)) 渐进时间复杂度
名词解释
n :问题的规模,重复执行的次数
T(n) :一段程序运行,各种操作代码所执行的总次数
f(n) :存在的某个函数,使得T(n)/f(n)=非零常数,那么f(n)称为T(n)的同数量级函数
O :大O符号,一种符号,表示渐进于无穷的行为
算法中各种代码操作所执行的总次数用T(n)表示,存在某个函数f(n),使得T(n)/f(n)=非零常数,那么f(n)称为T(n)的同数量级函数(类想一下,在坐标轴中,当入参n趋于无穷时,两条曲线的商为常数),即:T(n)=O(f(n)),O(f(n))就是时间复杂度。O符号表示一个渐进常数,在这个函数中可以忽略低阶项和首项系数。
时间复杂度推导原则
- 如果运行时间是常数量级,用常数1表示
- 只保留时间函数中的最高阶项
- 如果最高阶项存在,则省去最高阶项前面的系数(与这个项相乘的常数)
- 递归算法的时间复杂度 == 递归总次数*每次递归的次数
常见时间复杂度
- 常数阶 O(1)
- 对数阶 O(logN)
- 线性阶 O(n)
- 线性对数阶 O(nlogN)
- 平方阶 O(n2)
- 立方阶 O(n3)
- k次方阶 O(nk) 一般控制k的大小,否则比指数阶更复杂
- 指数阶 O(2n) 一般不用,性能太差
按增长率排序:O(1) < O(logn) < O(n) < O(nlogN) < O(n2) < O(n3) < O(nk) < O(2n)
Example
- 常数阶 O(1)
public void O_1() {
int n = 100; // 没有入参变量,执行规模永远为1行
long[] fib = {
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765,