算法与数据结构学习总结---算法复杂度

算法学习—算法复杂度

  1. 数据结构和算法本质上是”快“和"省"。所以代码的执行效率是非常重要的度量
  2. 我们采用时间复杂度和空间复杂度来计算

1. 时间复杂度—大O复杂度表示法

在这里插入图片描述

  1. 我们假设执行上图一行代码的时间为t,通过估算,代码的执行时间T(n)与执行次数成正比,记做:T(n)=O(f(n))

    1. T(n): 代码执行时间
    2. n:数据规模
    3. f(n):每行代码执行次数总和
    4. O:代码的执行时间与f(n)表达式成正比
    5. 上面的例子中的T(n)=O(2n+2)
    6. 当n无限大时,低阶、常量、系统都可以忽略
    7. 所以T(n)=O(n)
    8. 所以时间复杂度为O(n),也就是代码执行时间随着数据规模的增加而增长
  2. 下图中,T(n)=O(n*n),也就是代码执行时间随着数据规模的增加而平方增长,所以时间复杂度为O(n^2),时间复杂度也成为渐进时间复杂度。
    在这里插入图片描述

2. 计算时间复杂度的技巧

  1. 计算循环执行次数最多的代码
  2. 总复杂度=量级最大的复杂度
  3. 如下图所示:时间复杂度为O(n^2),因为嵌套代码的复杂度等于嵌套内外代码复杂度的乘积(乘法法则)
    在这里插入图片描述

3. 常见的时间复杂度

  1. O(1)
    1. 这种是最简单的,也是最好理解的,就是常量级
    2. 不是只执行了一行代码,只要代码的执行不随着数据规模(n)的增加而增加,就是常量级
    3. 在实际应用中,通常使用冗余字段存储来将O(n)变成O(1),比如Redis中有很多这样的操作用来提升访问性能
    4. 比如:SDS、字典、跳跃表等
  2. O(logn)、O(nlogn)
    1. 如下图所示:
    2. 如果2 =n,x=log n,忽略系数为logn,那么T(n)=O(logn),如果将该代码执行n遍 则时间复杂度记录为:T(n)=O(n*logn),即O(nlogn)
    3. 快速排序、归并排序的时间复杂度都是O(nlogn)
      在这里插入图片描述
  3. O(n)
    1. 很多线性表的操作都是O(n),这也是最常见的一个时间复杂度
    2. 比如:数组的插入删除、链表的遍历等
  4. O(m+n)
    1. 如下图所示,代码的时间复杂度由两个数据的规模来决定
    2. m和n是代码的两个数据规模,而且不能确定谁更大,此时代码的复杂度为两段时间复杂度之和,即:T(n)=O(m+n),记作:O(m+n)
      在这里插入图片描述
  5. O(m*n)
    1. 根据乘法法则代码的复杂度为两段时间复杂度之积,即T(n)=O(mn),记作:O(mn),当m==n时,为O(n^2)
      在这里插入图片描述

4. 空间复杂度

  1. 空间复杂度全称是渐进空间复杂度,表示算法的存储空间与数据规模之间的增长关系
  2. 比如将一个数组拷贝到另一个数组中,就是相当于空间扩大了一倍:T(n)=O(2n),忽略系数。即为:O(n),这是一个非常常见的空间复杂度,比如跳跃表、hashmap的扩容
  3. 此外还有:O(1),比如原地排序、O(n ) 此种占用空间过大
  4. 由于现在硬件相对比较便宜,所以在开发中常常会利用空间来换时间,比如缓存技术,典型的数据结构中空间换时间是:跳跃表
  5. 在实际开发中我们也更关注代码的时间复杂度,而用于执行效率的提升
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值