数据结构:绪论之时间复杂度与空间复杂度

发布于:2025-05-22 ⋅ 阅读:(13) ⋅ 点赞:(0)

作者主页

失踪人口回归,陆续回三中。
开辟文章新专栏——数据结构,恳请各位大佬批评指正!


在这里插入图片描述

数据结构的基本知识

数据:

数据是信息的载体

数据元素:

数据元素是数据的基本单位,数据项是构成元素不可分割的最小单位。

数据对象:

具有相同性质的数据元素的集合

数据类型:

  1. 原子类型
  2. 结构类型
  3. 抽象数据类型(ADT):描述了数据的逻辑运算和抽象运算,从而构成一个完整的数据结构定义

数据结构:

有一种或多种特定关系的数据元素的集合

逻辑结构:元素之间的逻辑关系

在这里插入图片描述

集合:元素同属于一个集合

线性结构:一对一,除了第一个元素,所有元素都有唯一先驱,除了最后一个元素,所有元素都有唯一后继

树形结构:一对多

网状结构:多对多

存储结构:物理结构

顺序存储:数据存储在相邻存储单元中,可以实现随机存储,但是外部碎片多

链式存储:利用存储地址的指针来表示元素之间的逻辑关系,不会出现碎片现象,但是要存储指针占用额外空间,只能实现顺序存取

索引存储:检索快,但索引表占用额外空间,增删数据时也要修改索引表,花费时间较多

散列存储:根据元素的关键字直接计算出该元素存储地址,也称哈希存储。快,但是如果散列函数不好,会导致冲突浪费时间

数据运算

算法与其评价

算法的概念:

是对特定问题求解步骤的一种描述。程序=数据结构+算法(步骤)

算法具有:有穷性,确定性,可行性,输入,输出

算法是有穷的,程序是无穷的

一个好的算法应该具备:正确性,可读性,健壮性,高效率与低存储量需求

算法效率的评价:

时间复杂度

  • 定义

    衡量算法执行时间随输入规模增长的变化趋势,不关注具体执行时长,关注的是输入规模变大时,算法运行时间的增长快慢。

  • 表述方法

    用大 O 符号(Big O notation)表示,如 O (1)、O (n)、O (n²) 等。通过分析算法中基本操作的执行次数与输入规模 n 的关系来确定,忽略低阶项和常数系数,保留最高阶项表示量级 。

    在这里插入图片描述

  • 计算规则:

    • 只保留常数项
    • 保留最高项
  • 常用技巧

    在这里插入图片描述

    • 加法规则:当一个算法由多个部分组成时,这意味着在计算总时间复杂度时,取各部分时间复杂度中量级最大的那个。例如,算法一部分时间复杂度是(O(n)),另一部分是(O(n2)),整体时间复杂度就是(O(n2)) 。

      void loveyou(int n){
          //1次
          int i = 1;
          //3001次
          while(i<=n){
              //3000*2次
              i++;
              printf("i love you ");
          }
      }
      int main(){
          loveyou(3000)
      }
      //T(n)=1+3001+3000*2
      //T(n)=3n+3
      
    • 乘法规则:如果一个算法是嵌套结构,外层操作数量级是(f(n)),内层是(g(n)),那么整体时间复杂度就是两者相乘 。比如外层循环n次,内层循环m次,整体时间复杂度就是(O(n×m)) 。

    • 量级比较:“常对幂指阶” 是常见时间复杂度量级从小到大的排序,也是保留阶数最高的依据。

      在这里插入图片描述

  • 如何计算:

    顺序执行的代码只会影响常数项,可以忽略

    只需挑循环中的一个基本操作分析它的执行次数与n的关系即可

    如果有多层嵌套循环,只需关注最深层循环几次就行了

  • 三种复杂度:

    最坏时间复杂度:考虑输入数据“最坏的情况”,执行次数最多的时候

    平均时间复杂度:考虑所有输入数据都等概率出现的情况

    最好时间复杂度:考虑输入数据的最好的情况,

空间复杂度

  • 空间复杂度的定义:

    空间复杂度(Space Complexity)是衡量算法在执行过程中临时占用存储空间大小的量度。

    它反映了算法所需存储空间与输入数据大小之间的关系。

    空间复杂度通常用大O表示法来表示。

    2.2 空间复杂度的分析

    同时间复杂度一样用大O表示法表示;也是表示一个数量级。记作: 在这里插入图片描述

  • 2.3 常见的空间复杂度

    常数阶:

    如果算法的空间复杂度不随问题规模 n 的变化而变化,即算法所需的存储空间是一个常数,那么空间复杂度为 O(1)。

    线性阶:

    如果算法所需的存储空间与问题规模 n 成正比,即算法所需的存储空间随着 n 的增加而线性增加,那么空间复杂度为

    O(n)。

    多项式阶:

    如果算法所需的存储空间与问题规模 n 的关系可以表示为多项式函数,即空间复杂度为 O(n^k),其中 k 是一个正整数。

    对数阶:

    如果算法所需的存储空间与问题规模 n 的关系可以表示为对数函数,即空间复杂度为 O(log n)。

    指数阶:

    如果算法所需的存储空间与问题规模 n 的关系可以表示为指数函数,即空间复杂度为 O(2^n)。

多项式函数,即空间复杂度为 O(n^k),其中 k 是一个正整数。

对数阶:

如果算法所需的存储空间与问题规模 n 的关系可以表示为对数函数,即空间复杂度为 O(log n)。

指数阶:

如果算法所需的存储空间与问题规模 n 的关系可以表示为指数函数,即空间复杂度为 O(2^n)。