如果各位同学还对时间复杂度有疑问?看这一篇就可以啦!

news2025/7/13 18:43:28

🎇🎇🎇作者:
@小鱼不会骑车
🎆🎆🎆专栏:
《java练级之旅》
🎓🎓🎓个人简介:
一名专科大一在读的小比特,努力学习编程是我唯一的出路😎😎😎
在这里插入图片描述

今天小鱼讲到的是关于时间复杂度空间复杂度的理解。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

了解时间复杂度

  • 时间复杂度
    • 前言
    • 时间复杂的讲解
    • 如何简化时间复杂度
    • 时间复杂度的计算

时间复杂度

前言

我们来举个例子!
假如我们有A,B两台电脑,A电脑的执行速度是1000次/s,B电脑的执行速度是1次/s,假如两台电脑都执行相同的代码,那么是不是我的A电脑会更快的完成任务。

答案是:对的!

但是我们改变一下条件,假设两台电脑需要完成一个查找数组中指定元素的任务,A电脑中的代码每次可以遍历1个元素,B电脑中的代码每次可以遍历100个元素。那么大家认为这两台电脑哪一个会更快的完成任务?
在这里插入图片描述

通过这个图表我们就可以看出,当运行到10秒时,我们的B对元素遍历的次数已经和A持平了,再往后面我们的B的遍历次数更是远超A.

于是我们可以通过上图的对比看出,哪怕是电脑的性能很好很优良,但是却还依然跑不过B,这就体现到了代码运行效率的重要性!

时间复杂的讲解

上面举得例子只是为了让大家知道代码运行效率的重要性,下面才是真正的讲解如何计算代码的运行效率!

大家看这段代码!

   public static void main(String[] args) {
        int n=100;
        while ((n)!=0) {
            n--;
        }
    }

大家认为这段代码会运行多久?

可能就会有同学回答说:这个要放计算机上跑跑才知道吧…

那我如果将n改为10000呢?需要运行多久啊?

同学:这个…要不再测试一次?

其实呀,我们并不能精准的测量出程序运行的时间,有的计算机的运行速度会快一些,有的则会慢一些…于是呢,就有人提出了用计算机的语句的执行次数来当作计算机的时间效率,而不是运行的时间。

我们来算算上述的代码执行了多少次

为了方便讨论,这里我们把每一条语句的执行时间都看做是一样的,记为一个时间单元

在这里插入图片描述
由于黄色的最后还需要判断一次,所以需要n+1个时间单元 !

那么我们就可以计算出这个程序的语句执行了多少次,我们可以用函数来表达:y=n+n+1+1,化简就是:y=2n+2;函数图像就是

在这里插入图片描述

所以,如果要预测程序运行的时间我们可以把运行时间函数求出来。

可是如果光看这个函数还是有些复杂啊!

其实呀,我们平时都会对这些函数进行简化的,使得它既简单又没有失去函数得主要特性。

咦?那怎么简化啊?

如何简化时间复杂度

对于时间复杂度来说,我们比较关心的就是影响最终结果的最高次项。

在这里插入图片描述
比如说:T(n)=2n+2, 当n非常大的时候常数2和n的系数2对函数结果的影响就很小了
例如:

T(n)=n+1 忽略常数项 T(n)~n

T(n)=n+n^2 忽略低阶项 T(n)~n^2

T(n)=3n 忽略最高阶的系数 T(n)~n

所谓低阶项就是当n很大时,该项对于这个数的影响很小,比如n相对于n^2来说,n就是低阶项!

对此呢,我们有一个比较的关系,不同项进行比较只保留最高阶项,比较关系如下

在这里插入图片描述

化简后的函数可以代表原函数的总体趋势,并且简化后的式子就可以称为这个算法的时间复杂度,记作O(f(n)),其中f(n)是简化后的式子,例如刚才的T(n)=2*n+2,简化后为T(n)~ f(n) ~ n,所以我们也可以记作O(n).

更准确地说O代表了运行时间函数的一个渐进上界,即T(n)在数量级上小于等于f(n)

那我们如何计算时间复杂度呢?

时间复杂度的计算

经过了前面的两个小部分的讲解,我们也可以总结出:计算算法复杂度大O的方法

一.得出运行时间的函数
二.对该函数进行简化

1.用常数1取代运行时间中所有加法常数
2.修改后的函数只保留最高阶项
3.如果最高阶项存在,并且不是1,则忽略这个最高项数的系数

举个例子,看下面代码:
在这里插入图片描述

我们可以看出,T(n)=5,我们可以对这个函数进行简化,将他的常数项用1来取代,又因为该函数没有最高阶项,所以他的时间复杂度就是O(1)

O(1)也被称为常数阶

当然啦,如果我们一个一个去数语句再去计算函数是很麻烦的,有没有简便一些的方法吗?

其实是可以偷偷懒的,一般来说程序最内层执行次数最多的语句就决定了整个函数的趋势。

在这里插入图片描述

我们只需要找到最内层语句执行次数的规律就行!所以我们就可以清楚的得出上面的时间复杂度是O(n).

并且呢,我们也可以根据这个方法得出下面这个代码的时间复杂度O(n^2)
.在这里插入图片描述

如果还有人不太理解这个O(n^2)这个时间复杂度的意思,我给大家用数学的角度来算一下!
在这里插入图片描述

在这里插入图片描述

所以我们可以理解为上述的代码的时间复杂度为O(n^2)

下面再来介绍最后一个比较牛 * 的时间复杂度O(log2N),读作log以2为底N的对数。
怎么个牛 * 法呢?二分查找大家都知道吧,在一个有序数组里查找指定的元素,如果我们用从前往后遍历的方式来查找,我们用这个世界的人口举例
在这里插入图片描述
我们简单认为是76亿人,所以我们假设这个数组是76亿个元素,如果我们想从这76亿个元素中查找到一个指定的元素,那么最坏的情况就是查找76亿次,多么庞大的次数啊。
但是!假设这是一个有序数组,该数组有76亿个元素,大家猜猜我们需要查找多少次?
答案是我们只需要查找33次,就可以找到这个要被查找的元素,牛不牛!在这里插入图片描述
我们再来看看O(logN)的函数图像

在这里插入图片描述
上下图对比,它随着自变量的增大,因变量增长的很慢很慢!

	int a=1;
    while (a<=n) {
       a*=2;
   }

这段代码的复杂度就是对数级别的,O(logn)
怎么计算它的时间复杂度呢?

在这里插入图片描述

复杂度的内容好多,会一直伴随着我们学习数据结构与算法,所以我们现在只需呀简单理解复杂的的含义就行!


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chrome浏览器一键切换搜索引擎,一键切换谷歌和百度搜索

chrome浏览器一键切换搜索引擎&#xff0c;一键切换谷歌和百度搜索 背景 有么有办法在谷歌和百度之间&#xff08;或其他引擎或非引擎&#xff0c;如Youtube、B站、Bing等&#xff09;之间切换。我们当然是不想重新输入keyword&#xff0c;甚至点击浏览器插件的图标后再选择引…

Scala010--Scala中的常用集合函数及操作Ⅰ

之前我们已经知道了Scala中的数据结果有哪些&#xff0c;并且能够使用for循环取到该数据中的元素&#xff0c;现在我们再进一步的去了解更加方便及常用的函数操作&#xff0c;使得我们能够对集合更好的利用。 目录 一&#xff0c;foreach函数 1&#xff0c;遍历一维数组 1&…

Pytorch中CrossEntropyLoss()详解

一、损失函数 nn.CrossEntropyLoss() 交叉熵损失函数 nn.CrossEntropyLoss() &#xff0c;结合了 nn.LogSoftmax() 和 nn.NLLLoss() 两个函数。 它在做分类&#xff08;具体几类&#xff09;训练的时候是非常有用的。 二. 什么是交叉熵 交叉熵主要是用来判定实际的输出与期望…

HTML CSS个人网页设计与实现——人物介绍丁真(学生个人网站作业设计)

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

SpringBoot SpringBoot 原理篇 1 自动配置 1.8 bean 的加载方式【六】

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇1 自动配置1.8 bean 的加载方式【六】1.8.1 ImportSelector1 自动配置 1.8 b…

改进牛顿法潮流计算IEEE33节点潮流计算matlab程序——

IEEE33节点潮流计算matlab程序——改进牛顿法潮流计算 改进牛顿法的基本原理 参考文献&#xff1a;一种新的配电网潮流算法——改进牛顿法-拉夫逊法 牛顿法是改进牛顿法的基础&#xff0c;对牛顿法作科学的近似&#xff0c;即雅可比矩阵做一些更改&#xff0c;使得每次计算得…

stm32项目平衡车详解(stm32F407)下

stm32项目平衡车详解(stm32F407)下 HC-SRO4 超声波测距避障功能开发 TSL1401 CCD摄像头实现小车巡线功能 文章目录stm32项目平衡车详解(stm32F407)下前言一、HC-SRO4 超声波测距避障功能开发HC-SRO4超声波测距模块&#xff1f;超声波测距避障功能开发避障模式开发二、TSL1401 …

【微软】【ICLR 2022】TAPEX:通过学习神经 SQL 执行器进行表预训练

重磅推荐专栏&#xff1a; 《Transformers自然语言处理系列教程》 手把手带你深入实践Transformers&#xff0c;轻松构建属于自己的NLP智能应用&#xff01; 论文&#xff1a;https://arxiv.org/abs/2107.07653 代码&#xff1a;https://github.com/microsoft/Table-Pretrainin…

数字图像处理(十五)图像旋转

文章目录前言一、图像旋转算法1.算法原理2. 一些需要注意的点3.举例4. 均值插值法二、编程实现1.C代码2.实验结果参考资料前言 图像的旋转是指以图像中的某一点为原点以逆时针或者顺时针方向旋转一定的角度。通常是绕图像的起始点以逆时针进行旋转。 一、图像旋转算法 1.算法原…

JAVA并发之谈谈你对AQS的理解

文章目录一、AQS是什么二、AQS具备哪些特性三、用的哪种设计模式四、AQS与锁二者之间的关系五、如何基于AQS实现一把独占锁六、参考资料一、AQS是什么 AQS的全称是 &#xff08;AbstractQueuedSynchronizer &#xff09;&#xff0c;它定义了一套多线程访问共享资源的同步器框架…

【算法基础】(一)基础算法 --- 归并排序

✨个人主页&#xff1a;bit me ✨当前专栏&#xff1a;算法基础 &#x1f525;专栏简介&#xff1a;该专栏主要更新一些基础算法题&#xff0c;有参加蓝桥杯等算法题竞赛或者正在刷题的铁汁们可以关注一下&#x1f339; &#x1f339; &#x1f339; 归并排序&#x1f4a4;一.归…

猴子也能学会的jQuery第十期——jQuery元素操作(上)

&#x1f4da;系列文章—目录&#x1f525; 猴子也能学会的jQuery第一期——什么是jQuery 猴子也能学会的jQuery第二期——引用jQuery 猴子也能学会的jQuery第三期——使用jQuery 猴子也能学会的jQuery第四期——jQuery选择器大全 猴子也能学会的jQuery第五期——jQuery样式操作…

基于拟蒙特卡洛模拟法的随机潮流计算matlab程序

电力系统随机潮流计算中常采用模拟法&#xff0c;该方法原理简单、使用方便&#xff0c;能够精确地模拟实际物理过程&#xff0c;但是简单的蒙特卡洛模拟法收敛速度很慢&#xff0c;要得到精确的结果需要以大量的计算时间为代价。本章在此基础上提出了基于拟蒙特卡洛模拟的随机…

【菜菜的sklearn课堂笔记】逻辑回归与评分卡-用逻辑回归制作评分卡-异常值和样本不均衡处理

视频作者&#xff1a;菜菜TsaiTsai 链接&#xff1a;【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili 描述性统计处理异常值 现实数据永远都会有一些异常值&#xff0c;首先我们要去把他们捕捉出来&#xff0c;然后观察他们的性质。注意&#xff0c…

【雷达检测】基于复杂环境下的雷达目标检测技术附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

3.6、媒体接入控制

1、基本概念 有多台主机连接到这根同轴电缆上&#xff0c;共享这跟传输媒体&#xff0c;形成了总线型的局域网。 各主机竞争使用总线&#xff0c;随机的在信道发送数据。 主机 C 与主机 D 同时使用总线来发送数据&#xff0c;这必然会产生所发送信号的碰撞 2、静态划分信道…

二阶锥松弛在配电网最优潮流计算中的应用(IEEE33节点配电网最优潮流算例matlab程序)(yalmip+cplex)

二阶锥规划在配电网最优潮流计算中的应用IEEE33节点配电网最优潮流算例matlab程序&#xff08;yalmipcplex&#xff09; 参考文献&#xff1a;二阶锥规划在配电网最优潮流计算中的应用 最优潮流计算是电网规划、优化运行的重要基础。首先建立了配电网全天有功损耗最小化的最优…

ABAP学习笔记之——第四章:模块化程序

一、子程序&#xff1a; 语法&#xff1a; 参数&#xff1a; 参数(Parameter)是指调用子程序时用于传入、传出的值。子程序中的参数与一般用 DATA语句定义的局部变量相同。调用子程序时使用的参数叫实参(Actual Parameter)&#xff0c;在子程序中使用的参数叫虚参(Formal Par…

nginx(六十八)http_proxy模块 nginx与上游的ssl握手

一 nginx作为客户端与上游的SSL/TLS握手 理解上&#xff1a; nginx作为客户端,此时类似浏览器的角色,发请求建立连接 nginx作为server端与下游进行SSL/TLS握手 ① nginx与后端选择什么样的协议 1&#xff09;如果nginx与上游是局域网内,一般通过http建立请求,不需要进行…

使用flv.js + websokect播放rtsp格式视频流

1.问题背景 在最近的项目中&#xff0c;涉及到海康接入的视频播放的问题&#xff0c;海康这边获取到的视频流是rtsp格式&#xff0c;web端目前没有直接可以播放的组件&#xff0c;于是最开始是后端处理了视频流&#xff0c;返回hls格式的m3u8地址&#xff0c;这样用videojs插件…