当前位置: 首页 > news >正文

征服数据结构中的时间和空间复杂度

目录

  • 时间复杂度
    • 推导大O方法
    • 求解时间复杂度的方法
    • 普通顺序结构
    • 单循环
    • 双循环
    • 递归
      • Master定理(主定理)
      • 递归树方法
  • 空间复杂度

一个算法的好坏根据什么来判断呢?有两种一种是时间效率,一种是空间效率。时间效率也可称为时间复杂度,空间效率可以称为空间复杂度。时间复杂度衡量的主要是算法的运行速度而空间复杂度主要衡量的是一个算法所需要的额外空间。

时间复杂度

在进行算法分析时,语句总的执行次数 T(n) 是关于问题规模 n 的函数,进而分析 T(n) 随 n 的变化情况并确定 T(n) 的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)=O(f(n))。 它表示随问题规模n 的增大,算法执行时间的增长率和 f(n) 的增长率相同,称作算法的渐近时间复杂度,简称为时间复 杂度。其中f(n) 是问题规模n 的某个函数。

定义很长,个人觉得了解即可,对于O()这种体现时间复杂度的方法,我们称之为大O记法

推导大O方法

  1. 用常数1取代运行时间中的所有加法常数。
  2. 在修改后的运行次数函数中,只保留最高阶项。
  3. 如果最高阶项存在且不是1,则去除与这个项相乘的常数。
    得到的结果就是大O 阶 。

求解时间复杂度的方法

时间复杂度有最坏时间复杂度,平均时间复杂度,也有最好情况的时间复杂度,但我们一般讨论的都是最坏时间按复杂度,并且如果没有特殊说明,我们也默认为算的是最坏时间复杂度。

我们去计算时间复杂度的时候,说白了也就是去数语句执行次数最多的,算出来的就是时间复杂度,不过要满足大O记法。
O(100)的时间复杂度为O(1),只有常数存在的时候,常数时间复杂度为O(1)

普通顺序结构

这种可以称作求时间复杂度最简单的。

    public static void main(String[] args) {System.out.println("你好!");}//执行了常数次,时间复杂度为O(1)

单循环

我建议大家做这种的时候要多动手,而不是光靠脑子想。尤其我们刚开始接触数据结构的时候。

    public void func(int n) {int i = 1;while (i <= n) {i = i * 2;}}

在这里插入图片描述
这里给大家留一个题,自己动手试试,看是否真懂了呢?

// 计算func4的时间复杂度?
void func4(int N) {
int count = 0;
for (int k = 0; k < n; k++) {
count++;
}
System.out.println(count);
}

双循环

这种分为两种,一种是内外两层互不影响,一种是外层会影响内层。

  1. 两层互不影响的时候
    在这里插入图片描述
    我们一般把log₂n简写成logn
  2. 外层会对内层产生影响的时候
    public void func2(int n) {int m = 0;for (int i = 1; i <= n; i++) {for (int j = 1; j <= (2 * i); j++) {m++;}}}

在这里插入图片描述
希望大家能掌握这种方法,这样对于多层循环也就不害怕了,道理都一样

递归

前段时间看到一个求递归算法时间复杂度的视频,我觉得很容易让人理解,希望也能帮助到你们。

Master定理(主定理)

在这里插入图片描述 * 我们比较下面这两个哪个时间复杂度大就用哪个
在这里插入图片描述
一、规则一
如果左半部大,那么我们最后直接取左半部分作为结果
在这里插入图片描述

二、规则二
如果上面两个算出结果相等,我们需要取左半部分结果再乘上logn,两个组合起来才为最后结果
在这里插入图片描述
三、规则三
当比较两个,如果右边大,我们需要再判断下面图片这个式子
在这里插入图片描述
如果计算后均满足这两个条件,最后结果就是右边的那个结果。

递归树方法

在这里插入图片描述
我们拿第一个举例。
在这里插入图片描述
我们画出了递归树,这种求解复杂度方法是:叶子数 + 层数 * f(n)

对于上面这些方法,核心还是要根据代码能推出正确的式子。T(n)=T(n-1)+ 其余操作的时间复杂度,这个式子含义就是求时间复杂度的时候等于前n-1的时间复杂度加上另外一些其他的操作所需要用到的时间复杂度。

时间复杂度大小排序:O(1)<0(logn)<0(n)<0(nlogn)<0(n²)<0(n³)<0(2”)<0(n!)<O(n”)

空间复杂度

算法的空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记作:S(n)=0(f(n)), 其 中 ,n 为问题的规模,f(n) 为语句关于 n 所占存储空间的函数。空间复杂度的求解也符合大O记法。

穿插个题外话,现在估计还有好多人弄不清KB,GB,MB的大小关系,希望大家能记住,因为不知道啥时候就会用到。
1GB=1024MB 1MB=1024KB 1KB=1024字节

  • 我们在计算空间复杂度的时候,计算的是变量的个数而不是占用了多少空间。
  • 函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

空间复杂度的计算,这我就不细说了,相信大家都有相关的教材,这部分可以参考教材来学习怎么计算

http://www.lryc.cn/news/413626.html

相关文章:

  • springboot Security vue
  • 13. 计算机网络HTTPS协议(一)
  • Bean的作用域和生命周期
  • 【Qt】QMainWindow之菜单栏
  • uni-app封装组件实现下方滑动弹出模态框
  • MATLAB(15)分类模型
  • 非虚拟机安装Centos7连接wifi并开机自动联网
  • 怎么选择的开放式耳机好用?2024超值耳机分享!
  • Web 框架
  • 嗖嗖移动业务大厅(JDBC)
  • 大学生编程入门指南:如何从零开始?
  • 如何基于欧拉系统完成数据库的安装
  • 防御笔记第九天(持续更新)
  • html+css+js前端作业和平精英6个页面页面带js
  • 详解基于百炼平台及函数计算快速上线网页AI助手
  • 【TVM 教程】在 CUDA 上部署量化模型
  • 使用 continue 自定义 AI 编程环境
  • 谷粒商城实战笔记-118-全文检索-ElasticSearch-进阶-aggregations聚合分析
  • ansible,laas,pass,sass
  • 【开源分享】PHP在线提交工单源码|工单管理系统源码 (附源码搭建教程)
  • 【深入探秘Hadoop生态系统】全面解析各组件及其实际应用
  • Flink DataStream API编程入门
  • 案例分享|Alluxio在自动驾驶数据闭环中的应用
  • 为什么选择 Baklib 而不是 Salesforce 进行知识库管理
  • 【C++11】解锁C++11新纪元:深入探索Lambda表达式的奥秘
  • c语言排序(2)
  • vue3+ts+element plus开源框架基础
  • RabbitMQ快速入门(MQ的概念、安装RabbitMQ、在 SpringBoot 项目中集成 RabbitMQ )
  • Linux文件与目录管理命令 ls cp rm mv使用方法
  • KubeSphere 部署的 Kubernetes 集群使用 GlusterFS 存储实战入门