从一个实例(整数幂指数)进行算法时间复杂度的分析

算法的时间复杂度在于基本步骤(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+2O(n)

  • 递归版

    def exp2(a, n):
        if n == 1:
            return a
        else:
            return a*exp2(a, n-1)

    递归版本的时间复杂度为仍然采用递归形式进行及分析。 t(n) :标识当前,则 t(n)=3+t(n1) ,其中3表示:一次判断,一次乘法,一次减法。

    t(n)=3+t(n1)t(n)=3k+t(nk)t(n)=3(n1)+t(1)=3(n1)+2

  • 递归改进版

    f(a,n)=an=(a2)n/2=f(a2,n/2),a×(a2)(n1)/2=a×f(a2,n12),n is evenn is odd

    def 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(n1)=6+6+t(n12)
    所以大致可得: t(n)=12+t(n/2)=12×log2n+t(1)
    时间复杂度为: logn

References

[1] 算法复杂度分析

你可能感兴趣的:(从一个实例(整数幂指数)进行算法时间复杂度的分析)