408考研笔记之数据结构(一):时间复杂度与空间复杂度问题

  1. 一个好的算法要保证效率和低存储量需求。其中效率为算法的执行时间,存储量需求是指算法执行过程中所需要的最大存储空间。也就是算法效率的度量是通过时间复杂度和空间复杂度来描述。

  2. 一个语句的频度是指该语句在算法中的执行次数,而时间复杂度就是分析所有语句频度之和的数量级。

  3. n为该算法的问题规模,时间复杂度与n有关。

  4. 那么,为什么要事先计算算法的时间复杂度呢?有些问题不能事后计算,比如导弹控制算法。并且有其他几种原因影响时间开销:①机器性能。②编程语言(越高级的语言执行效率越低)。③编译程序产生的机器指令质量。所以不能让算法先运行,再统计时间开销。

  5. 计算时间复杂度的例子
    void LoveYou{
    int i = 1;
    while(i<=n){
    i++;
    printf(“I love you %d\n”,i);
    }
    printf(“i love you more than %d\n”,i);
    }
    该算法的时间复杂度最原始的方法就是判断每条语句执行的次数。显然为1+(n+1)+(n)+(n)+1=3n+3【加括号是为了分清是哪个语句的执行次数】

  6. 上面的算法过于简单,可以用一条一条语句计算的方法。而往往在开发的过程中会面临几千行几万行的代码,那么应该怎么计算呢?
    分析程序时间复杂度时有以下两条规则
    ①加法规则:多项相加,只保留最高项,且系数变为1。T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))
    ②乘法规则:多项相乘都保留
    T(n)=T1(n)xT2(n)=O(f(n))+O(g(n))=O(f(n)xg(n))
    比较数量级的方法,一般而言:
    O(1)<O(log2n)<O(n)<O(nlong2n)<O(n²)<O(n³)<O(2ⁿ)<O(n!)<O(nⁿ)【常对幂指阶】

  7. 通过以上推论,可知常数项是可以忽略的,而顺序执行的代码只执行一次,生成的也是常数项。所以计算时间复杂度只需挑一个循环的基本操作来分析。另外在程序里加入一段代码(无任何循环)并不影响时间复杂度。假如有多层循环,则只需关注最深层。

  8. 有些事件并不能一次计算时间复杂度,需要分别判断最好情况和最坏情况以及平均情况。

  9. 关于时间复杂度计算的步骤:①找一个基本操作(最深层的循环)。②分析该基本操作的执行次数t与问题规模n的关系,得出t=f(n)。③比较数量级,去掉常数项以及系数,即求出时间复杂度O(n)。

  10. 空间复杂度:算法所耗费的存储空间。
    S(n) =O(g(n))

  11. 一个程序执行时需要存放本身所用的指令、常数、变量、和输入数据、对数据的操作的工作单元等。所以输入数据所占空间属于问题本身,与算法无关,所以空间复杂度只需分析除输入和程序之外的额外空间。空间复杂度依然遵循加法规则和乘法规则。

发布了2 篇原创文章 · 获赞 3 · 访问量 64

猜你喜欢

转载自blog.csdn.net/qq_38652677/article/details/105188050