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

这篇具有很好参考价值的文章主要介绍了[Date structure]时间/空间复杂度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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)

下面是对常见时间复杂度的一个总结:
[Date structure]时间/空间复杂度

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

4.1、线性阶

一般含有非嵌套循环涉及线性阶,线性阶就是随着输入规模的扩大,对应计算次数呈直线增长,例如:
  [Date structure]时间/空间复杂度

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

4.2、平方阶

一般嵌套循环属于这种时间复杂度
  [Date structure]时间/空间复杂度

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

4.3、立方阶

一般三层嵌套循环属于这种时间复杂度
  [Date structure]时间/空间复杂度

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

4.4、对数阶

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

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

4.5、常数阶

一般不涉及循环操作的都是常数阶,因为它不会随着n的增长而增加操作次数。例如:
  [Date structure]时间/空间复杂度

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

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

5、java中常见内存占用

数据类型 内存占用字节数
byte 1
short 2
int 4
long 8
float 4
double 8
boolean 1
char 2

计算机访问内存的方式都是一次一个字节
  [Date structure]时间/空间复杂度

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

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

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

6、补充说明

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

到了这里,关于[Date structure]时间/空间复杂度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构(时间复杂度,空间复杂度)

    算法的时间复杂度是一个数学函数,算法中的基本操作的执行次数,为算法的时间复杂度。 1.大O的表示法 2.推导大O表示法 1、用常数1取代运行时间中的所有加法常数。 2、在修改后的运行次数函数中,只保留最高阶项。 3、如果最高阶项存在且不是1,则去除与这个项目相乘的

    2024年02月07日
    浏览(37)
  • 什么是时间复杂度和空间复杂度

    🍕博客主页:️自信不孤单 🍬文章专栏:数据结构与算法 🍚代码仓库:破浪晓梦 🍭欢迎关注:欢迎大家点赞收藏+关注 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。 算法(Algorithm):就是定义良好的计算过程

    2023年04月15日
    浏览(34)
  • 数据结构 — 时间复杂度、空间复杂度

    数据结构_空间复杂度_时间复杂度讲解_常见复杂度对比 本文介绍数据结构中的时间复杂度和空间复杂度 ***文章末尾,博主进行了概要总结,可以直接看总结部分*** 博主博客链接:https://blog.csdn.net/m0_74014525 点点关注,后期持续更新系列文章 算法效率指的是算法在处理数据时

    2024年02月13日
    浏览(37)
  • 详解时间复杂度和空间复杂度问题

            前言:本来我并不认为时间复杂度和空间复杂的有多重要,只要日常会判断和分析算法的复杂度即可,但是,不论是在考研的数据结构与算法中,还是在日常的刷题中,我们都会见到,限制我们时间和空间复杂度的算法设计问题,这对我们要求就高了,所以,我们需

    2024年02月02日
    浏览(40)
  • 算法之【时间复杂度】与【空间复杂度】

    目录 一、算法 1、算法定义 2、两种算法的比较 3、算法的特性 4、算法设计的要求 二、算法的复杂度 1、时间复杂度 1.1定义 1.2大O的渐近表示法 1.3推导大O阶方法 1.4最坏情况与平均情况 1.5常见的时间复杂度计算示例 🍂常数阶: 🍂线性阶:  🍂对数阶: 🍂平方阶: 2、空间

    2024年02月05日
    浏览(42)
  • 【基础知识整理】时间复杂度 & 空间复杂度

    时间复杂度与空间复杂度的作用是在衡量一个算法的优劣性,以及在二者之间进行权衡,寻找二者的平衡点。 时间复杂度是指执行算法所需时间的增长率,而空间复杂度则是指执行算法所需存储空间的增长率。 高时间复杂度的算法可能需要在短时间内完成大规模数据的计算

    2024年02月10日
    浏览(35)
  • 【数据结构】时间复杂度与空间复杂度

    在学习C语言的时候,大多数的小伙伴们并不会对算法的效率了解,也许算法也是一个陌生的领域,当进入了数据结构这个模块,就应该对算法的效率做一个清晰的认识。但是算法的效率是什么呢?这里就引出来时间复杂度与空间复杂度的概念了。 算法效率 指的是算法解决问

    2024年02月07日
    浏览(31)
  • 时间复杂度空间复杂度相关练习题

    【题目】:题目链接 思路1:排序——》qsort快排——》时间复杂度O(n*log2n)  不符合要求 思路2: (0+1+2+3+...+n)-(a[0]+a[1]+[2]+...+a[n-2]) ——》 时间复杂度O(N)空间复杂度为O(1) (0+1+2+3+...+n)直接用等差数列求和就可 思路3:数组中是几就在第几个位置写一下这个值  ——》

    2024年02月13日
    浏览(32)
  • 算法学习22:时间复杂度 和 空间复杂度

    提示:以下是本篇文章正文内容: 😍😍😍文章链接👍👍👍 提示:这里对文章进行总结: 💕💕💕

    2024年04月22日
    浏览(64)
  • 数据结构——时间复杂度与空间复杂度

    目录 一.什么是空间复杂度与时间复杂度 1.1算法效率 1.2时间复杂度的概念 1.3空间复杂度的概念 二.如何计算常见算法的时间复杂度 2.1大O的渐近表示法  使用规则 三.如何计算常见算法的空间复杂度 3.1 大O渐近表示法 3.2 面试题——消失的数字  3.3 面试题——旋转数组 分为两

    2024年02月07日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包