算法与算法分析—时间复杂度、空间复杂度

算法与算法分析

  • 算法的定义

    对特定问题求解方法和步骤的一种描述,它是指令的有限序列。其中每个指令表示一个或多个操作。

  • 算法的描述

    • 自然语言:英语、中文(麻烦)

    • 流程图:传统流程图(框图)——开始结束用圆角矩形,输入输出用平行四边形,操作用矩形,判断用菱形

      NR流程图(盒图)

    • 伪代码:类语言——类C语言

    • 程序代码:C语言程序、Java语言程序

       

  • 算法与程序

    • 算法是解决问题的一种方法或一个过程,考虑如何将输入转换成输出,一个问题可以有多种算法

    • 程序是用某种程序设计语言对算法的具体实现

      程序=数据结构+算法
      数据结构通过算法实现操作
      算法根据数据结构设计程序

       

  • 算法特性:一个算法必须具备以下五个重要特性

    • 有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成

    • 确定性:算法中每一条指令必须有确切的含义,没有二义性,在任何条件下,只有唯一的一条执行路径,即对于相同的输入只能得到相同的输出

    • 可行性:算法是可执行的,算法描述的操作可以通过已经实现的基本操作执行有限次来实现

    • 输入:一个算法有零个或多个输入

    • 输出:一个算法有一个或多个输出

  • 算法设计的要求

    • 正确性

    • 可读性

    • 健壮性

    • 高效性

  • 算法效率

    1. 时间效率

    2. 空间效率

      • 时间效率和空间效率有时候是矛盾的,需要结合具体要求综合的平衡考虑

         

  • 算法效率度量

    • 事前分析: 算法运行时间=∑每条语句的执行次数(语句频度)*该语句执行一次所需时间

      • 算法时间复杂度

        T(n)=2n³+3n²+n+1

      当n->∞ 时 得到f(n)=n³ T(n)=O(n³)

      算法的渐进时间复杂度:T(n)=O(f(n)) (O是数量级的符号)

      1. 找出语句频度最大的那条语句作为基本语句

      2. 计算基本语句的频度得到问题规模n的某个函数f(n)

      3. 取其数量级用符号O表示

      4. 时间复杂度是由嵌套最深层语句的频度决定的

      5. 直接看循环体更简单

        x=0;
        y=0;
        for(int k=0;k<n;k++)          //n+1
            x++;                      //n
        for(int i=0;i<n;i++)           //n+1         
            for(int j=0;j<n;j++)      //n*(n+1)      n*n f(n)=n*n
                y++;                 //n*n

         

        复制代码
         1 i=1;
         2 while(i<=n)
         3     i=i*2;         
         4 /*i=2 
         5  i=2*2
         6  i=2*2*2
         7  ……
         8  i=2^x
         9  执行次数x
        10  i<=n 则 2^x<=n
        11  x<=log2^n
        12  f(n)=x=log2^n
        13  T(n)=O(log2^n) 或O(logn)
        14  */
        复制代码

         

         
         
      6. 最坏时间复杂度

      7. 平均时间复杂度

      8. 最好时间复杂度

        • 算法空间复杂度

          将一维数组a中的n个数逆序存放到原数组中

          1 for(i=0;i<n/2;i++){
          2     t=a[i];
          3     a[i]=a[n-i-1];
          4     a[n-i-1]=t;
          5 }  // S(n)=O(1) 原地工作

           

          1 for(i=0;i<n;i++)
          2     b[i]=a[n-i-1];
          3 for(i=0;i<n;i++)
          4     a[i]=b[i]; // S(n)=O(n)

           

    • 事后分析:将算法实现去测算

      缺点:依赖于计算机软硬件等环境因素影响

posted @   煮煮侠  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示