数据结构(一) - 绪论

绪论

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

算法的描述:

  • 自然语言:英文、中文
  • 流程图:传统流程图、NS流程图
  • 伪代码:类语言:类C语言
  • 程序代码:C语言、JAVA

算法与程序:

  • 算法是解决问题的一种方法或一个过程,考虑如何将输入转换成输出,一个问题可以有多种算法。
  • 程序使用某种设计语言对算法的具体实现

概念

  • 一个好的算法首先要具备正确性,然后是健壮性、可读性,在几个方面都满足的情况下发,主要考虑算法的效率

  • 算法的效率以以下两个方面来考虑:

    • 时间效率: 算法所消耗的时间
    • 空间效率: 算法执行过程中所消耗的存储空间
  • 算法时间的度量

    • 可以依据该算法编制的程序在计算机上执行所消耗的时间来度量

    两种度量方法:

    • 事后统计

      • 将算法时间,测算其时间和空间的开销
      • 缺点:编写程序实现算法将花费较多的时间和精力;所得实验结果依赖于计算机的软硬件登环境因素,掩盖算法本身的优劣
    • 事前分析

      • 对算法所消耗资源的一种估算方法

      • 算法运行时间 = (每条语句的执行次数 * 该语句执行一次所需要的时间) 所有语句求和 , 又称为语句频度

      • 每条语句执行一次所需的时间,一般是随机器而异的。取决于机器的指令性能、速度及编译代码的质量。是由机器本身
        软硬件环境决定的,它与算法无关。
        所以,我们可以假设执行每条语句所需的时间均为单位时间。此时对算法的运行时间的讨论就可转化为讨论该算法中所有
        语句的执行次数,即频度之和了

      • 若由某个辅助函数f(n), 使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。
        记作T(n)=O(f(n)),称O(f(n))为算法的渐进3时间复杂度(O是数量级的符号),简称时间复杂度

        n 越大算法的执行时间越长

        • 排序:n为记录数
        • 矩阵:n为矩阵的阶数
        • 多项式:n为多项式的系数
        • 集合:n为元素的个数
        • 树: n为树的结点的个数
        • 图:n为图的顶点数与边数
  • 算法时间复杂度的定义
    算法中基本语句重复执行的次数是问题规模n的某个函数f(n),算法的时间度量记作:T(n)=O(f(n))
    它表示随着n的增大,算法执行的时间的增长率和f(n)的增长率相同,称渐进时间复杂度

分析算法时间复杂度的基本方法

忽略所有低次幂项和最高次幂系数,体现增长率的含义

方法:

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

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

  • 取其数量级用符号"O"表示

  • 有些情况下,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同
    例如:在数组中,顺序查找某个元素,返回其所在的位置。

    • 最好情况是1次
    • 最坏情况n次
    • 平均时间复杂度:O(n)

算法时间效率的比较:

渐进空间复杂度

  • 空间复杂度:算法所需存储空间的度量,记作:S(n) = O(f(n)),其中n为问题的规模(或大小)

  • 算法主要占据的空间
    -- 算法本身要占据的空间,输入/输出,指令,常数,变量登
    -- 算法要使用的辅助空间

    列如:将数组逆序排列有不同的算法

    //空间复杂度:S(n) = O(1)
    public static int[] rever(int[] arr) {
        int n = arr.length;
        int t = 0;
        for (int i = 0; i < n / 2; i++) {
            // 后面的元素
            t = arr[n - i - 1];
            arr[n - i - 1] = arr[i];
            arr[i] = t;
        }
        return arr;
    }
    
    //空间复杂度S(n)=O(n)
    public static int[] rever2(int[] arr) {

        int[] tmp = new int[4];
        int n = arr.length;
        for (int i = 0; i < n; i++) {
            tmp[i] = arr[n - i - 1];
        }

        for (int i = 0; i < n; i++) {
            arr[i] = tmp[i];
        }
        return arr;
    }

本文内容引自青岛大学 王卓老师的讲课内容

posted @ 2022-03-19 21:03  chuangzhou  阅读(59)  评论(0编辑  收藏  举报