一,概念:
算法: 解决问题的简单指令的集合,比如排序就有很多种,虽然作用相同,但在过程中消耗的资源和时间却会有很大的区别。因而对一种算法分析它的时间复杂度是非常重要的。
时间维度: 执行当前算法所消耗的时间,即 时间复杂度。
表示形式: 算法的时间复杂度通常用
大
O
符
号
大O符号
大O符号表述,
T
[
n
]
=
O
(
f
(
n
)
)
T[n] = O(f(n))
T[n]=O(f(n)) 。其含义为
T
(
n
)
T(n)
T(n)受限于
f
(
n
)
f(n)
f(n),即当
n
n
n趋近于无穷时,
T
(
n
)
<
=
f
(
n
)
T(n)<=f(n)
T(n)<=f(n),可以类比理解为数学中的无穷小,即
T
(
n
)
T(n)
T(n)是比
f
(
n
)
f(n)
f(n)高阶的无穷小量,或者两者为同阶无穷小,但不是说它们是无穷小量,只是为了更好地理解。除此之外,还有
小
o
符
号
、
Θ
符
号
,
Ω
符
号
,
小o符号、Θ符号,Ω符号,
小o符号、Θ符号,Ω符号,也可类比理解为,高阶无穷小,同阶无穷小,低阶无穷小。
二,计算方法:
- 若 T 1 ( n ) = O ( f ( n ) ) , T 2 = O ( g ( n ) ) , 则 有 若T1(n)=O(f(n)),T2=O(g(n)),则有 若T1(n)=O(f(n)),T2=O(g(n)),则有
- T 1 ( n ) + T 2 ( n ) = O ( f ( n ) + g ( n ) ) T1(n)+T2(n)=O(f(n)+g(n)) T1(n)+T2(n)=O(f(n)+g(n))
- T 1 ( n ) ∗ T 2 ( n ) = O ( f ( n ) ∗ g ( n ) ) T1(n)*T2(n)=O(f(n)*g(n)) T1(n)∗T2(n)=O(f(n)∗g(n))
- 如果 T ( n ) 是 一 个 k 次 多 项 式 , 则 T ( n ) = O ( N k ) T(n)是一个k次多项式,则T (n)=O(N^k) T(n)是一个k次多项式,则T(n)=O(Nk),也就是说在计算时间复杂度时,是比较粗略的(忽略低次项和系数),只考虑最高次,但已足够。
- 常见的算法时间复杂度由小到大依次为:
O ( 1 ) < O ( l o g 2 n ) < O ( n ) < O ( n l o g 2 n ) < O ( n 2 ) < O ( n 3 ) < … < O ( 2 n ) < O ( n ! ) Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n^2)<Ο(n^3)<…<Ο(2^n)<Ο(n!) O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<…<O(2n)<O(n!) - 一般来说,普通的赋值语句,普通加法乘法(无循环,递归等),都是
O
(
1
)
;
O(1);
O(1);
一次循环— O ( n ) O(n) O(n),2个循环嵌套— O ( n 2 ) O(n^2) O(n2) … … …… …… k k k 个循环嵌套— O ( n k ) ; O(n^k); O(nk);
一般来说,折半查找,二分法,欧几里得算法等这些 以 2 倍数缩减搜索范围(需要经过 log2^n 次执行完) 的算法,通常为 O ( l o g 2 n ) ; Ο(log2n); O(log2n); -
O
(
n
l
o
g
2
n
)
O(nlog2n)
O(nlog2n)通常是
O
(
l
o
g
2
n
)
Ο(log2n)
O(log2n)的变形,也就是说在它的基础上更改了一些细节,
如:时间复杂度为 O ( l o g n ) O(logn) O(logn)的代码循环 n n n遍,则它的时间复杂度为 n ∗ O ( l o g n ) n*O(logn) n∗O(logn),即 O ( n l o g n ) 。 O(nlogn)。 O(nlogn)。