[Date structure]时间/空间复杂度

news/2024/5/19 0:45:25/文章来源:https://blog.csdn.net/qq_60735796/article/details/130118398

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章
⭐作者主页:@逐梦苍穹
⭐所属专栏:数据结构。数据结构专栏主要是在讲解原理的基础上拿Java实现,有时候有C/C++代码。
⭐如果觉得文章写的不错,欢迎点个关注一键三连😉有写的不好的地方也欢迎指正,一同进步😁

目录

  • 1、分析方法
  • 2、常用分析方法
  • 3、记法
  • 4、常见大O阶
    • 4.1、线性阶
    • 4.2、平方阶
    • 4.3、立方阶
    • 4.4、对数阶
    • 4.5、常数阶
  • 5、java中常见内存占用
  • 6、补充说明

1、分析方法

  时间复杂度的分析方法可以分为事前分析法和事后分析法。
  事前分析法是指在实际运行算法之前,通过分析算法的代码和数据结构,推算出算法的时间复杂度。这种方法可以在实际运行之前就预估算法的性能,帮助选择更优秀的算法。
  常用的事前分析方法有渐进复杂度分析法、最坏情况分析法、平均情况分析法和最好情况分析法等。

  事后分析法是指通过实际运行算法并记录其运行时间,来分析算法的时间复杂度。这种方法可以得到较为准确的结果,但需要先运行算法一次才能进行分析,不够高效。常用的事后分析方法有插值搜索和时间分析法。

  插值搜索是一种基于二分查找的搜索方法,它通过在实际运行中采用不同规模的输入,得到不同规模下的运行时间,从而推算出算法在其他规模下的运行时间。这种方法需要预估出算法的时间复杂度,然后通过实验数据进行验证和推算。

  时间分析法是一种基于运行时间的分析方法,它通过实际运行算法并记录每个操作所需的时间,然后对所有操作的时间进行统计和分析,得出算法的时间复杂度。这种方法需要考虑到不同操作的执行次数,需要对算法的实现进行较为详细的分析。
  总的来说,事前分析法和事后分析法都是有效的时间复杂度分析方法,选择哪种方法取决于具体情况和需求。

2、常用分析方法

时间复杂度是衡量算法效率的一种方法,用于描述算法运行时间与输入规模之间的关系。通常用大O符号表示。

在分析时间复杂度时,一般可以采用以下几种方法:

  1. 最坏情况分析法
    最坏情况分析法是一种保守的分析方法,它假设算法在最坏情况下所需的时间是算法在所有情况下所需时间的上界。这种方法通常用于保证算法在任何输入下都能保证一定的效率。
  2. 平均情况分析法
    平均情况分析法是一种更为准确的分析方法,它考虑了算法在不同输入下的表现,并对每种输入进行加权平均。这种方法需要对输入数据的分布进行假设,因此需要较为严格的数学证明。
  3. 最好情况分析法
    最好情况分析法是一种较为乐观的分析方法,它假设算法在最好情况下所需的时间是算法在所有情况下所需时间的下界。这种方法通常用于评估算法的最优性能。
  4. 渐进复杂度分析法
    渐进复杂度分析法是一种简单而又常用的分析方法,它w忽略了算法的常数项和低次项,只关注算法在输入规模增大时的表现。这种方法一般采用大O符号表示算法的渐进时间复杂度,如O(1)、O(log n)、O(n)、O(nlogn)、O(n^2)等。

在实际分析中,可以结合以上方法,选择最适合的方法来分析算法的时间复杂度。需要注意的是,时间复杂度只是一种理论上的估计,实际运行效率还受到许多因素的影响,如算法实现方式、计算机硬件性能等。

3、记法

大O记法
定义:
  在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随着n的变化情况并确定T(n)的量级。

算法的时间复杂度,就是算法的时间量度,记作:T(n)=O(f(n))。它表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度,其中f(n)是问题规模n的某个函数。
在这里,我们需要明确一个事情:执行次数=执行时间
用大写O()来体现算法时间复杂度的记法,我们称之为大O记法。一般情况下,随着输入规模n的增大,T(n)增长最慢的算法为最优算法。

算法的空间复杂度计算公式记作:S(n)=O(f(n)),其中n为输入规模,f(n)为语句关于n所占存储空间的函数。

基于我们对函数渐近增长的分析,推导大O阶的表示法有以下几个规则可以使用:
  1.用常数1取代运行时间中的所有加法常数;
  2.在修改后的运行次数中,只保留高阶项;
  3.如果最高阶项存在,且常数因子不为1,则去除与这个项相乘的常数;

4、常见大O阶

大O阶时间/空间复杂度
线性阶O(n)
平方阶O(n^2)
立方阶O(n^3)
对数阶O(logn)
常数阶O(1)

下面是对常见时间复杂度的一个总结:
在这里插入图片描述

他们的复杂程度从低到高依次为:
  O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)

4.1、线性阶

一般含有非嵌套循环涉及线性阶,线性阶就是随着输入规模的扩大,对应计算次数呈直线增长,例如:
  在这里插入图片描述

上面这段代码,它的循环的时间复杂度为O(n),因为循环体中的代码需要执行n次

4.2、平方阶

一般嵌套循环属于这种时间复杂度
  在这里插入图片描述

上面这段代码,n=100,也就是说,外层循环每执行一次,内层循环就执行100次,那总共程序想要从这两个循环
中出来,就需要执行100*100次,也就是n的平方次,所以这段代码的时间复杂度是O(n^2)

4.3、立方阶

一般三层嵌套循环属于这种时间复杂度
  在这里插入图片描述

上面这段代码,n=100,也就是说,外层循环每执行一次,中间循环循环就执行100次,中间循环每执行一次,最
内层循环需要执行100次,那总共程序想要从这三个循环中出来,就需要执行100100100次,也就是n的立方,所
以这段代码的时间复杂度是O(n^3)

4.4、对数阶

  在这里插入图片描述

由于每次i*2之后,就距离n更近一步,假设有x个2相乘后大于n,则会退出循环。由于是2^x=n,得到x=log(2)n,所以这个循环的时间复杂度为O(logn);
对于对数阶,由于随着输入规模n的增大,不管底数为多少,他们的增长趋势是一样的,所以我们会忽略底数。
在这里插入图片描述
在这里插入图片描述

4.5、常数阶

一般不涉及循环操作的都是常数阶,因为它不会随着n的增长而增加操作次数。例如:
  在这里插入图片描述

上述代码,不管输入规模n是多少,都执行2次,根据大O推导法则,常数用1来替换,所以上述代码的时间复杂度为O(1)

根据前面的折线图分析,我们会发现,从平方阶开始,随着输入规模的增大,时间成本会急剧增大,所以,我们的算法,尽可能的追求的是O(1),O(logn),O(n),O(nlogn)这几种时间复杂度,而如果发现算法的时间复杂度为平方阶、立方阶或者更复杂的,那我们可以认为这种算法是不可取的,需要优化。

5、java中常见内存占用

数据类型内存占用字节数
byte1
short2
int4
long8
float4
double8
boolean1
char2

计算机访问内存的方式都是一次一个字节
  在这里插入图片描述

一个引用(机器地址)需要8个字节表示:
例如: Date date = new Date(),则date这个变量需要占用8个字节来表示

创建一个对象,比如new Date(),除了Date对象内部存储的数据(例如年月日等信息)占用的内存,该对象本身也有内存开销,每个对象的自身开销是16个字节,用来保存对象的头信息。

一般内存的使用,如果不够8个字节,都会被自动填充为8字节

6、补充说明

  由于java中有内存垃圾回收机制,并且jvm对程序的内存占用也有优化(例如即时编译),我们无法精确的评估一个java程序的内存占用情况,但是了解了java的基本内存占用,使我们可以对java程序的内存占用情况进行估算。
  由于现在的计算机设备内存一般都比较大,基本上个人计算机都是4G起步,大的可以达到32G,所以内存占用一般情况下并不是我们算法的瓶颈,普通情况下直接说复杂度,默认为算法的时间复杂度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_285711.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux文件类型和根目录结构

目录 一、Linux文件类型 二、Linux系统的目录结构 1. FHS 2. 路径以及工作目录 &#xff08;1&#xff09;路径 &#xff08;2&#xff09;工作目录 一、Linux文件类型 使用ls -l命令查看到的第一个字符文件类型说明-普通文件类似于Windows的记事本d目录文件类似于Windo…

[NOIP2000 提高组] 进制转换

[NOIP2000 提高组] 进制转换 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置为指数,以 10为底数的幂之和的形式。例如 123 可表示为 10^22*10^13*10^0 这样的形式。 与之相似的&#xff0c;对二进制数来说&#xff0c;也可表示成…

WordPress添加阿里云OSS对象云储存配置教程

背景&#xff1a;随着页面文章增多&#xff0c;内置图片存储拖连网站响应速度&#xff0c;这里对我来说主要是想提升速度 目的&#xff1a;使用第三方云存储作为图片外存储(图床)&#xff0c;这样处理可以为服务器节省很多磁盘空间&#xff0c;在网站搬家的时候减少文件迁移的工…

2023TYUT移动应用软件开发程序设计和填空

目录 程序设计 程序设计1&#xff1a;根据要求设计UI,补充相应布局文件&#xff0c;即.xml文件 程序设计2&#xff1a;根据要求,补充Activity.java文件 程序填空 说明&#xff1a; 程序设计 程序设计1&#xff1a;根据要求设计UI,补充相应布局文件&#xff0c;即.xml文件…

安装Nginx——docker安装

使用docker安装Nginx 1.开启docker systemctl start docker docker search nginx[rootlocalhost ~]# systemctl start docker //开启docker [rootlocalhost ~]# docker search nginx //搜素镜像 2. docker pull nginxdocker imagesdocker run -…

【ROS】基于WIFI网络实现图像消息跨机实时传输

【开发背景】 研究机器人目标检测算法的时候&#xff0c;常常需要把推理图像实时展示出来&#xff0c;以供观摩。而ROS1提供的跨机通信方法&#xff0c;要么是配置单Master&#xff0c;要么是配置多Master&#xff1b;一方面配置麻烦&#xff0c;另一方面传输效率低下&#xf…

SQL select总结(基于选课系统)

表详情&#xff1a; 学生表&#xff1a; 学院表&#xff1a; 学生选课记录表&#xff1a; 课程表&#xff1a; 教师表&#xff1a; 查询&#xff1a; 1. 查全表 -- 01. 查询所有学生的所有信息 -- 方法一&#xff1a;会更复杂&#xff0c;进行了两次查询&#xff0c;第一…

基于灵动微SPIN系列开发的水泵方案介绍 以 MM32SPIN040C/MM32SPIN560C为主控

水泵是输送液体或使液体增压的机械。它将原动机的机械能或其他外部能量传送给液体&#xff0c;使液体能量增加&#xff0c;主要用来输送液体包括水、油、酸碱液、乳化液、悬乳液和液态金属等。 水泵以 MM32SPIN040C/MM32SPIN560C为主控。 水泵方案 MCU: MM32SPIN系列 1.输入…

【JavaWeb】后端(Maven+SpringBoot+HTTP+Tomcat)

目录一、Maven1.什么是Maven?2.Maven的作用?3.介绍4.安装5.IDEA集成Maven6.IDEA创建Maven项目7.IDEA导入Maven项目8.依赖配置9.依赖传递10.依赖范围11.生命周期二、SpringBoot1.Spring2.SpringBoot3.SpringBootWeb快速入门二、HTTP1.HTTP-概述2.HTTP-请求协议3.HTTP-响应协议…

机器学习实战:Python基于Logistic逻辑回归进行分类预测

目录1 前言1.1 Logistic回归的介绍1.2 Logistic回归的应用2 iris数据集数据处理2.1 导入函数2.2 导入数据2.3 简单数据查看3 可视化3.1 条形图/散点图3.2 箱线图3.3 三维散点图4 建模预测4.1 二分类预测4.2 多分类预测5 讨论1 前言 1.1 Logistic回归的介绍 逻辑回归&#xff…

产品知识沉淀

梁宁-产品思维30讲 看一个人或看一个产品&#xff0c;可以由表及里的五层来做观察和判断&#xff1a;感知层、角色层、资源层、能力圈和存在感 存在感之于人就好像生存之于动物一样&#xff0c;是触发情绪和推动行动的开关。 动物的状态和情绪&#xff0c;都是关乎它的生存需…

Stearic acid-mPEG,mPEG-STA,甲氧基PEG-单硬脂酸,具有优异疏水性

●外观以及性质&#xff1a; 硬脂酸是一种具有优异疏水性的18碳饱和脂肪酸脂质。PEG修饰的硬脂酸是一种具有亲水性和疏水性的优良的两亲性聚合物。聚乙二醇化脂质是一种优良的脂质体形成材料&#xff0c;可用于药物递送、基因转染和疫苗递送。硬脂酸是十八烷酸CH3&#xff08;C…

微信小程序开发 | API应用案例(下)

API应用案例&#xff08;下&#xff09;6.1【案例5】模拟时钟6.1.1 案例分析6.1.2 前导知识6.1.3 钟表页面布局6.1.4 钟表页面绘制6.2【案例6】罗盘动画6.2.1 案例分析6.2.2 前导知识6.2.3 设计罗盘页面布局6.2.4 手指触摸旋转罗盘6.2.5 单击按钮操作罗盘6.3【案例7】文件上传与…

关于药物|新药|药品市场调研报告(实操资料分享)

药品市场调研报告是指对药品行业进行详细的市场情况研究和分析。往往伴随着药品市场调研目的地不同&#xff0c;如战略探索、新药开发、投资决策等&#xff0c;报告编辑的内容要点要求也不一样。但总的核心要点内容笔者已提炼&#xff0c;如下&#xff1a; 一、药品市场调研报告…

Python学习笔记--判断语句

&#xff08;一&#xff09; 布尔类型和比较运算符 1. 布尔类型&#xff1a;判断结果 True&#xff1a;表示真&#xff08;是、肯定&#xff09; False&#xff1a;表示假&#xff08;否、否定&#xff09; """ 演示布尔类型的定义 以及比较运算符的应用 "…

【花雕学AI】找出合适的提示词—让ChatGPT发挥出最大的潜力与价值

ChatGPT 是一种基于人工智能技术的自然语言处理系统&#xff0c;它可以回答各种问题&#xff0c;提供有用的信息和建议。然而&#xff0c;要让 ChatGPT 发挥出最大的潜力和价值&#xff0c;我们需要使用一些提示词来帮助它更好地理解我们的问题和需求。这些提示词包括明确、详细…

文件上传漏洞 --- php邂逅windows通用上传缺陷

目录 后端源码 前端源码 后端代码审计 方式一绕过原理 --- 冒号加特性 验证及结果 方式二绕过原理 --- 数据流 验证及结果 环境需求 php5.2.17IIS环境&#xff0c;可以下载phpstuday2018来满足环境的要求。 后端源码 <?php //U-Mail demo ... if(isset($_POST[sub…

项目3:积分等级表接口的开发和使用(后台)

项目3&#xff1a;积分等级表接口的开发和使用 1.service-core的controller创建admin包 2.对积分登记表完成增删改查 3.配置swagger接口生成器和ui 4.统一设置返回结果 5.统一设置异常处理 6.统一日志处理 项目3&#xff1a;积分等级表接口的开发和使用 1.service-core的…

编码与加密基础笔记

文章目录&#x1f449;1、ASCII 编码&#x1f449;2、了解Base64&#x1f449;3、MD5消息摘要算法&#x1f449;4、对称加密与 AES&#x1f449;5、非对称加密与 RSA参考书籍《Python 3 反爬虫原理与绕过实战》&#x1f449;1、ASCII 编码 ASCII编码实际上约定了字符串和二进制…

unity的基本窗口界面简要介绍

呜呜呜呜呜呜呜呜呜&#xff0c;怎么可能不难过啊&#xff0c;这tm比失恋难受 学习学习&#xff0c;我要移情别恋 打开一个项目&#xff0c;在左上角或者其他地方&#xff0c;能看到以下界面 Scene&#xff1a;场景编辑窗口 在这个界面我们可以自由切换视角观看场景&#xff0…