Java中的时间和空间复杂度详解

 更新时间:2025年12月26日 09:08:57   作者:月下清融析愿  
文章主要介绍了如何衡量算法的好坏,包括时间效率和空间效率,时间效率用时间复杂度衡量,空间效率用空间复杂度衡量,时间复杂度通过大O渐进表示法进行分析,空间复杂度也使用大O渐进表示法,文章还列举了一些常见的时间复杂度计算例子,并介绍了如何计算空间复杂度

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

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

二,算法效率

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

三,时间复杂度

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)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中输入输出方式详细讲解

    Java中输入输出方式详细讲解

    这篇文章主要给大家介绍了关于Java中输入输出方式的相关资料,Java输入输出是指使用java提供的一些类和方法来实现数据的输入和输出,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • 解读HttpServletRequestWrapper处理request数据流多次读取问题

    解读HttpServletRequestWrapper处理request数据流多次读取问题

    在Java Web开发中,获取HTTP请求参数是常见需求,本文详细讨论了通过POST方式获取参数的两种主要方法:使用request.getParameter()适用于application/x-www-form-urlencoded和multipart/form-data内容类型;而对于application/json类型的数据
    2024-10-10
  • activemq整合springboot使用方法(个人微信小程序用)

    activemq整合springboot使用方法(个人微信小程序用)

    这篇文章主要介绍了activemq整合springboot使用(个人微信小程序用),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Java实现多文件压缩加密并重命名压缩文件对象的方法

    Java实现多文件压缩加密并重命名压缩文件对象的方法

    这篇文章主要介绍了Java实现多文件压缩加密并重命名压缩文件对象的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • java面向对象的三大特性之一继承用法实例分析

    java面向对象的三大特性之一继承用法实例分析

    这篇文章主要介绍了java面向对象的三大特性之一继承用法,结合实例形式分析了java面向对象程序设计中继承的基本原理与具体使用方法,需要的朋友可以参考下
    2019-11-11
  • idea 有时提示找不到类或者符号的解决

    idea 有时提示找不到类或者符号的解决

    这篇文章主要介绍了idea 有时提示找不到类或者符号的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Redis集群与SSM整合使用方法

    Redis集群与SSM整合使用方法

    这篇文章主要介绍了Redis集群与SSM整合使用方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-12-12
  • Java使用MyBatis框架分页的5种方式

    Java使用MyBatis框架分页的5种方式

    这篇文章主要为大家详细介绍了Java使用MyBatis框架分页的5种方式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Spring AOP 与代理的概念与使用

    Spring AOP 与代理的概念与使用

    大家知道我现在还是一个 CRUD 崽,平时用 AOP 也是 CV 大法。最近痛定思痛,决定研究一下 Spring AOP 的原理。 这里写一篇文章总结一下。主要介绍 Java 中 AOP 的实现原理,最后以两个简单的示例来收尾。
    2020-10-10
  • SpringBoot HttpMessageConverter消息转换器的使用详解

    SpringBoot HttpMessageConverter消息转换器的使用详解

    在整个数据流转过程中,前端的请求报文转化为Java对象,Java对象转化为响应报文,这里就用到了消息转换器HttpMessageConverter
    2022-06-06

最新评论