算法的时间复杂度在于基本步骤(basic steps)的考量。
复杂度 | notation | 描述 |
---|---|---|
常量(Constant) | O(1) | 基本操作的数量为常数,与输入数据的规模无关 n=10^6 ⇒ 1-2 operations |
对数(Logarithmic) | O(logn) | 操作的数量为
log2n
n=10^6 ⇒ 30 operations |
线性(Linear) | O(n) | 操作的数量与输入数据的规模成正比 n=10^6 ⇒ 5000 operations |
平方(Quadratic) | O(n2) | |
立方(Cubic) | O(n3) | |
指数(exponential) |
O(2n)
O(kn) O(n!) | 增长非常恐怖 |
计算整数幂指数的三种思路
f(n)=an
遍历相乘
def exp1(a, n): r = 1 while n: r *= a n -= 1 return r
其基本步骤为(一次迭代):判断(while) + 乘法 + 减法 == 3
所以整个循环下来的时间复杂度为: 3n+2⇒O(n)递归版
def exp2(a, n): if n == 1: return a else: return a*exp2(a, n-1)
递归版本的时间复杂度为仍然采用递归形式进行及分析。 t(n) :标识当前,则 t(n)=3+t(n−1) ,其中3表示:一次判断,一次乘法,一次减法。
t(n)=3+t(n−1)t(n)=3k+t(n−k)t(n)=3(n−1)+t(1)=3(n−1)+2递归改进版
f(a,n)=an=⎧⎩⎨⎪⎪(a2)n/2=f(a2,n/2),a×(a2)(n−1)/2=a×f(a2,n−12),n is evenn is odddef exp3(a, n): if n == 1: return a return exp3(a**2, n//2) if n%2 == 0 a*exp3(a**2, n//2)
n 为偶数时,
t(n)=6+t(n/2) ;
n 为奇数时,t(n)=6+t(n−1)=6+6+t(n−12)
所以大致可得: t(n)=12+t(n/2)=12×log2n+t(1)
时间复杂度为: logn
References
[1] 算法复杂度分析