算法导论 时间复杂度分析

1.非递归算法

非递归算法时间复杂度分析较为简单,通常是计算算法中基本语句的执行次数,一般都是一个关于问题规模n的表达式。
例1:如果算法的执行时间不随着问题规模n的增加而增长,它的基本语句执行的次数是固定的,总的时间由一个常数来限界。

    此类算法的时间复杂度是O(1)。

例2:当有若干个循环语句时,时间复杂度是由嵌套层数最多的循环语句中的基本语句的执行次数决定。

void fun(int n){
    int x=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++){
            for(int k=1;k<=j;k++){
                x++;             //基本语句
            }
        }
    }
}

该算法的基本语句是x++;所以

在这里插入图片描述

2.递归算法

递归树

递归树是一棵结点带权值的树。初始的递归树只有一个结点,它的权标记为T(n);然后按照递归树的迭代规则不断进行迭代,每迭代一次递归树就增加一层,直到树中不再含有权值为函数的结点(即叶结点都为T(1))。
下面以递归方程分析递归树的迭代过程。
在这里插入图片描述

第一步: 把根结点T(n)用根是cn、左结点为T(n/2)、右结点为T(n/2)的子树代替 (如a到b)
第二步: 把叶结点按照“第一步”的方式展开;T(n2)用根是cn/2、左节点为T(n4),右结点为T(n4)的子树代替。(如c所示)
第三步: 反复按照“第一步”的方式迭代,每迭代一次递归树就增加一层,直到树中不再含有权值为函数的结点,即叶结点都为T(1))。

在这里插入图片描述

递归树层数为h,递归树每层代价均为n,则有
在这里插入图片描述
然后将所有层的代价求和,得到所有层次的递归调用的总代价 。在上图(d)部分中,完全展开的递归树高度为lgn(树高为根结点到叶结点最长简单路径上边的数目),所有递归树具有lgn+1层,所以总代价为cn∗(lgn+1),所以时间复杂度为Θ(nlgn)。

猜你喜欢

转载自blog.csdn.net/iiaba_/article/details/85029102