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

Java 时间和空间复杂度

学习目标:

1,算法效率

2,时间复杂度

3,空间复杂度

一,如何衡量一个算法的好坏

答:看时间效率和空间效率

二,算法效率

算法效率分析分为两种: 第一种是时间效率,第二种是空间效率
时间效率  被称为  时间复杂度,而  空间效率  被称作  空间复杂度
时间复杂度主要衡量的是一个    算法的运行速度,
空间复杂度主要衡量的是一个    算法所需要的额外空间

三,时间复杂度

1,时间复杂度的概念:

时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个数学函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例算法中的基本操作的执行次数,为算法的时间复杂度。

2,大O的渐进表示法

Func1 执行的基本操作次数 :

实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法。
O符号(Big O notation):是用于描述函数渐进行为的数学符号

3,推导大O阶方法

1、用常数1取代 运行时间 中的所有 加法常数 。
2、在 修改后的 运行次数函数中,只保留 最高阶项 。
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数(系数)。得到的结果就是大O阶。
使用大O的渐进表示法以后,Func1的时间复杂度为:

通过上面我们会发现大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。
平时所说的时间复杂度或空间复杂度,都是指在 最坏情况下的 时间复杂度

那么平均时间复杂度怎么算,我这里给个例子,大家了解一下就行

4, 常见时间复杂度计算举例

求复杂度 一定要结合 算法的思想

例1    O(N)

例2    O(M+N)

例3    O(100)  写作100即可

例4     O(1/2*n^2 - 1/2*n) -> O(n^2)[最坏情况每次都要交换,即逆序]

最好情况是执行一轮 O(N)

例5    0()    最好情况就是在中间的时候,一次直接找到,就是1

这是二分查找,最坏情况就是最后一次才找到

第一次:  n/2^1 第二次:  n/2^2  ....  .....  第x次:  n/2^x = 1 (最后要找的那个数据看作1)

对第x次进行等式变形:n = 2^x -> x = 

例6      O(N)

递归的时间复杂度 = 递归的次数 * 每次递归执行的次数

这个题目 每次递归执行的次数是 1 ,因为 三目运算符 无论结果如何实际上只运行一次

所以 时间复杂度为 O(N-1) - > O(N)

例7    O(2^N)

先了解一下 什么是 斐波那契数列

实际上,通过其递归公式我们可以得出这样的一个式子

2^0 + 2^1 + 2^2 + ... ... + 2^(N-2) + 2^ (N-1) = S(n)

下图是主播简单的推导

这是一个等比数列

等比数列求和= S(n) = 2^n - 1

则 时间复杂度为 O(2^N)

5,以后常遇到的复杂度

O(1)    <   O(logN)[默认以2为底]    <  O(N)    <    O(N*logN)    <   O(N^2)

四,空间复杂度

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟时间复杂度类似,也使用O渐进表示法
计算举例:

冒泡排序的空间复杂度是O(1)

斐波那契数列动态开辟了N个空间,空间复杂度是O(N)

递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间。空间复杂度为O(N)

http://www.dtcms.com/a/323178.html

相关文章:

  • 徘徊识别场景误报率↓77%:陌讯动态时序建模方案实战解析
  • 二叉搜索树的C语言实现
  • 《软件测试与质量控制》实验报告五 功能自动化测试
  • 掌握数据可视化:全局配置项详解
  • Java进阶之单列集合List接口下的通用方法
  • Ubuntu22.04 安装vitis2023.2 卡在“Generating installed device list“.
  • 【Datawhale AI夏令营】让AI读懂财报PDF(多模态RAG)(Task 2)
  • 用 C 语言深入理解 Linux 软链接:原理、API 与编程实践
  • 【CTF】PHP反序列化基础知识与解题步骤
  • Claude Code 的核心能力与架构解析
  • Alibaba Cloud Linux 3 生成 github 公钥
  • 【Word】行中包含英文字符致使下划线加粗的解决方法
  • 3款强力的Windows系统软件卸载工具
  • 理解协议最大传输单元(MTU)和TCP 最大报文段长度(MSS)
  • 力扣热题100------70.爬楼梯
  • 从零学习three.js官方文档(一)——基本篇
  • 每日五个pyecharts可视化图表-line:从入门到精通
  • 记录一次ubuntu20.04 解决gmock not found问题的过程
  • Spring 框架中提供Aware接口,实现感知容器对象
  • 机器学习——模型的简单优化
  • CPU缓存(CPU Cache)和TLB(Translation Lookaside Buffer)缓存现代计算机体系结构中用于提高性能的关键技术
  • 盟接之桥说制造:以品质为基,消费者导向差异而生
  • Linux系统编程Day10 -- 进程管理
  • CTF常用工具汇总(二)
  • 【32】C#实战篇——两个文件夹下 相同名字的文件 进行配对(两个文件夹下的文件数量和文件类型不一定相同,所以要过滤掉我们不要的文件)
  • ArkUI中的布局组件Row(一)
  • 计算机网络1-6:计算机网络体系结构
  • 【Python 高频 API 速学 ④】
  • Office安装使用?借助Ohook开源工具?【图文详解】微软Office产品
  • 使用 Conda 安装 xinference[all](详细版)