数据结构:时间复杂度和空间复杂度

我们知道代码和代码之间算法的不同,一定影响了代码的执行效率,那么我们该如何评判算法的好坏呢?这就涉及到了我们算法效率的分析了。

📖一、算法效率

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

📖二、时间复杂度 

🐬1、概念

算法的时间复杂度其实是一个数学函数,它描述了该算法的运行时间,然而实际上,我们并不能准确的,将一个算法所耗费的时间算出来,只有在机器上跑起来,才能够得到,但是一段代码可能有多个算法,难道我们要每个都上机器上跑吗?这显然是不现实的,因此我们在这种情况下就得到了时间复杂度的分析方式:一个算法所花费的时间与其中语句的执行次数成正比例,因此我们将算法中的基本操作的执行次数,为算法的时间复杂度,并且我们将时间复杂度的表示方法称为大O的渐进表示法

🐬2、大O的渐进表示法 

我们将大O符号作为用于描述函数渐进行为的数学符号表示形式为:O(?)

?: 算法中的基本操作的执行次数

现在我们了解了大O的渐进表示法的使用,那么我们接下来看一下这段代码

public class  Test{public static void main(String[] args) {int count = 0;for (int i = 0; i < n; i++) {count++;}System.out.println(count);}
}

我们可以明确发现算法中的基本操作的执行次数为n次,那么我们的时间复杂度就为O(n)

再来看下面这段代码

public class  Test{void func1(int N){int count = 0;for (int i = 0; i < N ; i++) {for (int j = 0; j < N ; j++) {count++;}}for (int k = 0; k < 2 * N ; k++) {count++;}int M = 10;while ((M--) > 0) {count++;}System.out.println(count);}public static void main(String[] args) {}
}

我们可以发现第一个for循环的执行一次第二个for循环就执行N次,因此上面一共执行了N*N=N^2次,中间的for循环,显然是执行了2N次,而最后的while循环,由于M=10,因此执行了10次,那么这段代码的总体执行次数为(N^2+2N+10)次,那么我们的时间复杂度就是O(N^2+2N+10)次吗?

其实不是的,这时其实又涉及到了另一个方法:推导大O阶方法 

🐬3、推导大O阶方法 

  1. 用常数1取代运行时间中的所有加法常数。
  2. 在修改后的运行次数函数中,只保留最高阶项。
  3. 如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

那么我们还是以上面的代码为例,我们的执行次数为N^2+2N+10,根据规则用常数1,取代所有常数:N^2+2N+1,在修改后的运行次数函数中,只保留最高阶项:N^2,如果最高阶项存在且不是1,则去除与这个项目相乘的常数:(N^2)/1 = N^2

最后根据这个规则我们就得到了最终的时间复杂度为:O(N^2)

通过上面我们会发现大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执想次数。因此我们在实际中一般情况关注的是算法的最坏运行情况.

🐬4、常见的时间复杂度

术语
O(1)常数阶
O(N)线性阶
O(N^2)平方阶
O(logN)对数阶
O(NlogN)NlogN阶
O(N^3)立方阶
O(2^N)指数阶

从上往下时间复杂度不断增大 。

🐬5、实例

好了现在我们已经成功的了解了什么是时间复杂度和时间复杂度的表示方法了,接下来我能一起看几道经典例子。

📌(1)执行次数明确

void func(int N) {int count = 0;for (int k = 0; k < 100; k++) {count++;}}System.out.println(count);

在这段代码中我们明确的可以发现我们的算法基本操作的执行次数为100次,根据规则我们要用常数1取代所有常数,因此我们这段代码的时间复杂度应为O(1)。 而在这里我们其实也得出了一个结论,只有执行次数明确,我们就可以说这段算法的时间复杂度为O(1)(注意:并不是说整体代码的时间复杂度,只是单指这段算法)。

📌(2)冒泡排序

void bubbleSort(int[] array) {for (int end = array.length; end > 0; end--) {boolean sorted = true;for (int i = 1; i < end; i++) {if (array[i - 1] > array[i]) {Swap(array, i - 1, i);sorted = false;}}if (sorted == true) {break;}}}

首先我们将数组的长度看作N,对于一些初学者来说, 一个for循环执行一次另一个for循环执行N-1次,我们N=5为例4+3+2+1+0=10,最后为O(1)这显然是没有问题的,但是当他等于N时我们用这种方法显然是没有办法计算的,然而我们知道,算法中的基本操作的执行次数,为算法的时间复杂度,那么这段代码的基本操作是什么呢?,显而易见,就是两个数的交换,那么我们就知道了其实他的交换次数就是我们的执行次数。

其中我们根据他的交换次数得出的规律发现他是一个以1为公差的等差数列,因此利用等差数列求和公式就能得出他的总次数,最后根据规则得到他的时间复杂度为O(N^2) 

📌(3)二分查找

 int binarySearch(int[] array, int value) {int begin = 0;int end = array.length - 1;while (begin <= end) {int mid = begin + ((end-begin) / 2);if (array[mid] < value)begin = mid + 1;else if (array[mid] > value)end = mid - 1;elsereturn mid;}return -1;}

二分查找又称折半查找,原理是先取中间数,将中间数与我们要找的数进行比较,如果不是在进行折半,知道找到,这题我们其实可以将他看成一个纸条,我们要找一段纸条的长度,如果我们先将他这半一次,就得到了这是最好的情况时间复杂度就为O(1),但是如果我们要找X次才能找到,那么O(X),才是我们的时间复杂度,那么X等于什么呢?我们可以想象找一次纸条就要折半,如果一次找到那么乘于一次2就等于他的长度,X次找到就是乘于X个2即2^X=N。那么

logN在算法分析中表示是 底数为2,对数为N,因此时间复杂度为O(logN)。 

📌(4)递归

long factorial(int N) {return N < 2 ? N : factorial(N-1) * N;}

我们来看这段代码,我们发现他是一段递归,而对于他的时间复杂度,我们先把N看成是1,当N=1时,我们执行次数为1,当N=2时,执行次数为2,当N=3时,执行次数为3,因此当这段代码为N时,我们总体的执行次数应为N,所以我们的时间复杂度为O(N)

📖三、空间复杂度 

🐬1、概念  

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。空间复杂度计算规则基
本跟时间复杂度类似,也使用大O渐进表示法。 

📌(1)

他的临时空间变量, 就是三个临时变量,所以空间复杂度为O(1)

📌(2)

他的临时空间变量为n+1,所以空间复杂度为O(n)。

📌(3) 

根据上面所学N为几就会执行几次,同样也会开辟几个临时空间,因此他的临时空间变量为N,所以空间复杂度为O(N)


好的今天我们要分享的就到这里了,我们下一篇在见!

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

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

相关文章

Clisoft SOS设置Workarea

Clisoft SOS设置Workarea 本人也是刚刚接触这个软件&#xff0c;可能有些方面不够完善&#xff0c;欢迎大佬指点。 这里就不演示创建创建Server和Project&#xff0c;可以参考Clisoft SOS设置Server和Project 创建Workarea 创建好目录并设置好权限 # 创建组 [bhlumaster ~]$…

【题库】人工智能训练师练习题

单选题 1、Windows系统不能进行数据爬虫。 A.正确 B.错误 2、自然语言处理是一门融语言学、计算机科学、心理学于一体的科学。 A.正确 B.错误 3、文本分类是指将文本按照内容的不同判别到一个或多个预先确定的文本类别之中的过程。 A.正确 B.错误 4、中文分词只局限于中…

安徽省乡镇界面图层+arcgis数据shp格式-乡镇名称和编码2020年+wgs84坐标内容测评

最新安徽省乡镇界面图层arcgis数据shp格式-乡镇名称和编码2020年wgs84坐标无偏移

LabVIEW软件Bug的定义与修改

在LabVIEW软件开发过程中&#xff0c;bug&#xff08;程序错误或缺陷&#xff09;指的是程序中导致不符合预期行为的任何问题。Bug可能是由于编码错误、逻辑漏洞、硬件兼容性问题、系统资源限制等因素引起的。它可能会导致程序崩溃、功能无法正常执行或输出结果不符合预期。理解…

WebRTC 在视频联网平台中的应用:开启实时通信新篇章

在当今这个以数字化为显著特征的时代浪潮之下&#xff0c;实时通信已然稳稳扎根于人们生活与工作的方方面面&#xff0c;成为了其中不可或缺的关键一环。回首日常生活&#xff0c;远程办公场景中的视频会议让分散各地的团队成员能够跨越地理距离的鸿沟&#xff0c;齐聚一堂共商…

oracle位运算、左移右移、标签算法等

文章目录 oracle基础函数创建bitor(按位或)函数bitnot(按位非)函数bitxor(按位异或)函数左移函数BITSHIFT()函数(实测不可用&#xff0c;废弃掉该方案)右移函数(略&#xff0c;有此场景吗?) 实际应用资质字典增删改查分别对应什么操作新增对应操作查询对应的操作修改删除(正向…

信息系统管理师试题-人力资源

信息系统管理师试题-人力资源 当组织计划的人力资源需求超过供给时&#xff0c;可通过下列方法解决&#xff0c;其中不包括&#xff08;&#xff09; A降低录用标准&#xff0c;招聘新员工 B增加临时性员工和使用退休员工 C减少加班数量或工作时间 D提高员工工作效率 答案C 下…

【银河麒麟高级服务器操作系统实例】tcp半链接数溢出分析及处理全过程

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://document.kylinos.cn 服务器环境以及配置 系统环境 物理机/虚拟机/云…

[文献精汇]使用PyCaret预测 Apple 股价

2024年专题 量化专题 共计 102 篇 涵盖量化框架、数据篇、风险与收益、策略篇、多因子模型、编程篇、图形篇、机器学习、Backtrader等主题&#xff0c;全方面了解量化领域知识。机器学习共计29篇 涵盖机器学习基本介绍、监督学习、集成算法、无监督学习以及机器学习实战。研报…

新一代智能工控系统网络安全合规解决方案

01.新一代智能工控系统概述 新一代智能工控系统是工业自动化的核心&#xff0c;它通过集成人工智能、工业大模型、物联网、5G等技术&#xff0c;实现生产过程的智能化管理和控制。这些系统具备实时监控、自动化优化、灵活调整等特点&#xff0c;能够提升生产效率、保证产品质量…

02.02、返回倒数第 k 个节点

02.02、[简单] 返回倒数第 k 个节点 1、题目描述 实现一种算法&#xff0c;找出单向链表中倒数第 k 个节点。返回该节点的值。 2、题解思路 本题的关键在于使用双指针法&#xff0c;通过两个指针&#xff08;fast 和 slow&#xff09;&#xff0c;让 fast 指针比 slow 指针…

【简博士统计学习方法】第1章:1. 统计学习的定义与分类

自用笔记 1. 统计学习的定义与分类 1.1 统计学习的概念 统计学习&#xff08;Statistical Machine Learning&#xff09;是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科。 以计算机和网络为平台&#xff1b;以数据为研究对象&#xff1b;以…

PS 解析成ES流

最近做ps 解析&#xff0c;整理了一下&#xff1a; 解析如下&#xff1a; 这里理解为&#xff0c;后面会跟着pes头&#xff0c;在长度F00D-2-0A字节以后。

Android存储方案对比(SharedPreferences 、 MMKV 、 DataStore)

简介&#xff1a;本文介绍了Android开发中常用的键值对存储方案&#xff0c;包括SharedPreferences、MMKV和DataStore&#xff0c;并且对比了它们在性能、并发处理、易用性和稳定性上的特点。通过实际代码示例&#xff0c;帮助开发者根据项目需求选择最适合的存储方案&#xff…

Mycat2使用教程

运行环境框架包 下载地址&#xff1a;mycat2-install-template-1.20.zip 运行包 下载地址&#xff1a;mycat2-1.21-release-jar-with-dependencies.jar 说明 解压运行环境框架包&#xff0c;将运行包放到mycat的lib目录下 配置数据源 打开conf/datasources/prototypeDs.da…

望获实时Linux系统与大语言模型深度融合,开创实时智能无限可能!

大语言模型的崛起为智能化应用开辟了新的可能性。借助深度学习技术&#xff0c;这些模型能够理解和生成自然语言&#xff0c;处理复杂的文本和语义信息。这使得它们在诸如人机问答、内容生成和数据分析等领域展现出巨大的潜力。在实时控制领域&#xff0c;大语言模型能够显著提…

基于 GEE Sentinel-1 数据集提取水体

目录 1 水体提取原理 2 完整代码 3 运行结果 1 水体提取原理 水体提取是地理信息和遥感技术的关键应用之一&#xff0c;对于多个领域都具有重要的应用价值。它有助于更好地管理水资源&#xff0c;保护环境&#xff0c;减少灾害风险&#xff0c;促进可持续发展&#xff0c;以…

『SQLite』表的创建、修改和删除

本节摘要&#xff1a;主要讲述SQLite中创建、删除、修改表等操作。 创建表 CREATE TABLE 语句来创建表。 修改表 ALTER TABLE 语句来修改表名称、已有表字段&#xff0c;或者新增字段。 删除表 DROP TABLE 语句用来删除表. 注意&#xff1a; 上述内容详细讲解见文章&#…

java自动更新实体类的创建时间和更新时间3种方式

一、使用数据库的自动更新机制 1.创建表时设置创建时间和更新时间的默认值 ALTER TABLE lspace_diga.hot_city MODIFY COLUMN gmtCreate TIMESTAMP DEFAULT CURRENT_TIMESTAMP;ALTER TABLE lspace_diga.hot_city MODIFY COLUMN gmtModified TIMESTAMP DEFAULT CURRENT_TIMEST…

深入理解 pytest_runtest_makereport:如何在 pytest 中自定义测试报告

pytest_runtest_makereport 是 pytest 系统中的一个钩子函数&#xff0c;它允许我们在测试执行时获取测试的报告信息。通过这个钩子&#xff0c;我们可以在测试运行时&#xff08;无论是成功、失败还是跳过&#xff09;对测试结果进一步处理&#xff0c;比如记录日志、添加自定…