常见问题时间复杂度的计算过程

        算法是用系统的方法解决实际问题的策略机制,算法的质量将影响到程序的效率,而时间复杂度则是评判时间复杂度的标准,时间复杂度越小,算法越好,程序执行效率越高,反之,效率越差。

【表示方法】

       大O表示法:

       当且仅当存在正常数c和n0,使得

           T(n)<=cf(n)

       对所有的n>n0成立。T(n)=O(f(n))称为算法的渐进时间复杂度,简称时间复杂度。(f(n)是问题规模n的某个函数)。例如:T(n)= n^2+4n+1,则可以用数学助记符号O(n^2)表示时间复杂度。

     

       分析:(1)f(n)是n足够大时,对T(n)起支配作用的表达式。

                  (2)时间复杂度跟f(n)前面的系数关系不大。 

       

                                                   图1  n的二次方与一次方对比图                                                                            图2  一次方与log2X的对比图


        由图1可明显看出,n^2与n做对比,始终会存在一个点A,前者超过后者,因此起决定作用的是n^2;由图2可以看出,x对比log2x,x起决定作用。

【常见算法复杂度】

        常见的算法设计分为5大类: 

                   

       经典排序算法:

                                                

         算法时间复杂度与算法的构成是紧密结合的,并不是准确的比较或者交换次数,而是一个概数,且在不同的条件下比较或者交换次数是不同的,可分为最坏时间复杂度,最好时间复杂度,平均时间复杂度,默认情况下算的是最坏复杂度。

      1.  归并排序复杂度

                                

      归并排序体现的是分组思想,现采用上面16个数的排序(体现特殊情况)对应一般情况的分析方法:

                 

         根据上面16个数排序的特殊情况来归纳一般情况(n):

           (1)计算每次分组比较+交换次数:n

           (2)共进行了几次分组:

                          

        由上图可以得出,组的个数都是在原来的基础上/2得到的,到1为止,因此,共进行几次分组,即n可以进行几次二分运算,为log2(n).

            (3)总复杂度为:O(n*log2(n))

      2.  0-1背包问题复杂度

        0-1背包问题的实现时嵌套在两个循环里的,具体实现请看上篇博文《动态规划算法》。

        其分两步循环实现:第一步,内层嵌套先判断能不能物品能不能放进包内,共要比较允许的最大重量W次;第二步,外层循环确定共有几个物品,执行n次循环。
   
       因此时间复杂度很清楚为:T(n)=n*w=O(nw)

    3. 快速选择算法复杂度

        复杂比较次数是不确定的,指定的默认值不同,比较次数也不同,复杂度也就不同,如下实例:共分组次数为4,比较次数为:5+3+2+1=11
                                             
                                                 
                                                        
                                                                                                          
          上面是一种复杂的情况,下面举例说明平均复杂度与最坏时间复杂度:
           (1)平均时间复杂度,每次指定的值都会排序到本组中间的情况:

                               
         假设n足够大时,n要远远大于比较的次数,此时,每次分组比较次数(n-2*m-1)就可以看做是n了(m为第几次比较)。n每次取中间值,相当于二分法可以分log2n次,所以平均时间复杂度可以理解为O(nlog2n)。

       (2)最坏时间复杂度, 每次指定的值都排在末尾
                                         
   
       由上图可以得到,比较次数为1+2+3+...n-1=n*(n-1)/2,所以最坏情况下的时间复杂度为O(n^2)。

 【总结】

        时间复杂度的计算过程是由特殊到一般的过程,使用特殊的数值得到普遍的规律,而结果却是一个概数,但这种结果已经足够让我们作为依据评论一个算法的优劣。
       
        同时也让我们明白,算法的执行次数尽管复杂多变,我们只要取平均或最差情况,就能实现自己的目的,只有理解这些模糊数据的存在,才能真正理解算法复杂度。

  研究文档下载地址:http://wenku.baidu.com/view/eb65c8f3a98271fe900ef90e



      


  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 62
    评论
一、数据结构部分 考点1. 算法复杂度分析问题:能够给出特定算法用大O表示的时间或空间复杂度 考点2. 线性表的存储结构对比问题:链式存储和顺序存储的优缺点对比,各使用于那种应用场合 考点3. 树、二叉树和森林的相互转换问题:树<->二叉树<->森林之间的转换问题,注意树的左孩子右兄弟表示法 考点4. 二叉树的构造与遍历问题:给定二叉树,能给出相应的前中后序遍历序列;给定一个中序遍历序列,再给出一个前序或后序遍历序列,构造出二叉树 考点5. Huffman树的构造与Huffman编码:节点的权值,根到叶子节点的路径长度;给定一组数据的出现频率,构造相应的Huffman码 考点6. 图相关的定义问题:有向图,无向图,连同,强连通等概念的对比 考点7. 图的最小生成树问题:Prim算法和Kruskal算法的具体步骤,给定一个图,能使用给定的算法构造相应的最小生成树 考点8. 图的关键路径问题:给定一个图,能求出相应的关键路径,并且能给出求关键路径所需的中间表格 考点9. 二分查找算法的基本方法:给定一组数据和需要查找的关键字,能够给出二分查找经过的节点序列 考点10. 排序算法的特征问题:给定一组数据的初始状态和经过若干论排序后的状态,能推断出所使用的排序算法 二、计算机组成原理部分 考点1. 计算机硬件系统与冯诺依曼体系结构:五大件、存储执行、顺序执行、数据与操作有相同存储方式 考点2. 补码运算:补码的加减乘除法;给定两个数,能给出相应的计算过程和结果 考点3. ALU的结构与并行进位加法:并行进位加法公式的推导等 考点4. DRAM的刷新问题:三种刷新方式刷新效率的计算 考点5. Cache替换算法与写方法:各种不同替换算法的原理,写直达与写回 考点6. Cache与虚存的效率问题:使用Cache和虚存对存取效率提高的比率计算 考点7. 常见的寻址方式:各种寻址方式的寻址过程,使用到的硬件设备 考点8. 时序系统:三级时序系统之间相互的关系 考点9. I/O设备相关指标及计算问题:访问速率,存储容量,访问周期等指标的计算 考点10. 指令执行过程与CPU控制信号传输过程:取指令,分析指令,执行指令,不同指令指令周期中各个微操作以及相应的微指令序列 一、数据结构部分   考点1. 线性表的基本操作问题:顺序表,单链表,带头结点的单链表,双向链表上的增删改操作   考点2. 稀疏矩阵的压缩存储问题:稀疏矩阵的三元组表示,特殊矩阵的压缩存储,矩阵中元素下标的计算   考点3. 特殊线性表的性质问题:栈的FILO和队列的FIFO性质及其在实际问题中的应用   考点4. 基于二叉树性质的计算问题:计算二叉树的层数,节点总数,叶节点数等   考点5. 二叉排序树的构造与基于其的查找问题:给定数据序列,能给出相应的二叉排序树   考点6. 图的存储结构问题:图的矩阵表示,链表表示等表示方法的特点,以及不同的图,不同的应用问题中存储方法的选择   考点7. 图的最短路径问题:Dijkstra算法,给定一个图,能够按照Dijkstra算法逐步找到单源最短路径   考点8. 散列查找的特点与散列表的构造问题:不同散列函数的使用,不同散列存储方式的特征   考点9. 排序算法的选择问题:根据给定的数据序列的特点,选择相应的高效排序算法   考点10. 排序算法的应用问题:在解决特定的应用问题时,使用合适的排序算法先对数据进行处理,可以简化问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 62
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值