数据结构之算法复杂度(超详解)

在这里插入图片描述


在这里插入图片描述


文章目录

  • 1. 算法复杂度
    • 1.1 数据结构
    • 1.2 算法
    • 1.3 二者的重要性
  • 2. 算法效率
    • 开胃小菜:
    • 复杂度概念
  • 3. 时间复杂度
    • 3.1 大O表示法
    • 3.2 时间复杂度示例练习
      • 例1
      • 例2
      • 例3
      • 例4
      • 例5
      • 例6
      • 例7
  • 4. 空间复杂度
    • 4.1 空间复杂度示例练习
      • 例1
      • 例2
  • 5. 开胃小菜扩展
    • 5.1 思路2:采用空间换时间的方法
    • 5.2 思路3(优解):

1. 算法复杂度

1.1 数据结构

数据结构(Data Structure)计算机存储、组织数据的方式,指相互之间存在⼀种或多种特定关系的数据元素的集合。没有⼀种单⼀的数据结构对所有用途都有用,所以要学各式各样的数据结构,如:线性表、树、图、哈希等

1.2 算法

算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是⼀系列的计算步骤,用来将输入数据转化成输出结果。

1.3 二者的重要性

研究算法和数据结构的最终目的就是为了 “快” 和 “省”,快是指速度快,省是指耗费的内存等硬件资源少。而讨论数据结构和算法,必然涉及复杂度分析。包括时间复杂度分析和空间复杂度分析。

随着信息技术的快速发展,如今空间已不再稀缺,64G,128G,256G已然平常,甚至还有1TB。但是,这是否意味着我们可以不在乎空间复杂度呢?肯定不是。

小引:摩尔定律

集成电路上可以容纳的 晶体管 数目在大约每经过18个月到24个月便会增加一倍。 换言之,处理器的性能大约每两年翻一倍,同时价格下降为之前的一半。摩尔定律是内行人摩尔的经验之谈,汉译名为“定律”,但并非自然科学定律,它一定程度揭示了信息技术进步的速度。

2. 算法效率

如何衡量一个算法的好坏呢?

开胃小菜:

轮转数组
在这里插入图片描述

代码实现:

在这里插入图片描述


代码实现造成结果:
在这里插入图片描述

可以看见我们跑通了37个用例,但是在某一个用例时,超出了时间限制,这是什么原因导致的呢?
我们可以看看这题给出的提示
在这里插入图片描述
如果给出的数组非常大,里面存放了很多的数据,同时要轮转90次,这时就会超出时间的限制
那么,如何衡量其好与坏呢?为此我们需要引入复杂度的概念


复杂度概念

算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。
因此衡量⼀个算法的好坏,⼀般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。

时间复杂度主要衡量⼀个算法的运行快慢,而空间复杂度主要衡量⼀个算法运行所需要的额外空间

3. 时间复杂度

定义:在计算机科学中,算法的时间复杂度是⼀个函数式T(N),它定量描述了该算法的运行时间。时
间复杂度是衡量程序的时间效率,那么为什么不去计算程序的运行时间呢?

  1. 因为程序运行时间和编译环境和运行机器的配置都有关系,比如同⼀个算法程序,用一个老编译
    器运行编译和新编译器编译,在同样机器下运行时间不同。
  2. 同⼀个算法程序,用一个老低配置机器和新高配置机器,运行时间也不同
  3. 并且时间只能程序写好后测试,不能写程序前通过理论思想计算评估

这个是我在vs编译器下realise x64位环境下,通过冒泡排序运行3次将100000排成升序各自所需要的时间,因此我们不去计算程序的运行时间。
在这里插入图片描述

那么算法的时间复杂度是⼀个函数式T(N)到底是什么呢?这个T(N)函数式计算了程序的执行次数。在编译链接过程中,我们知道算法程序被编译后生成⼆进制指令cpu执行这些编译好的指令。那么我们通过程序代码或者理论思想计算出程序的执行次数的函数式T(N),假设每句指令执行时间基本⼀样(实际中有差别,但是微乎其微),那么执行次数时间就是等比正相关,这样也脱离了具体的编译运行环境。执行次数就可以代表程序时间效率的优劣。比如解决⼀个问题的算法a程序T(N) = N算法b程序T(N) = N^2,那么算法a的效率⼀定优于算法b
在这里插入图片描述
实际中我们计算时间复杂度时,计算的也不是程序的精确的执行次数,精确执行次数计算起来还是很麻烦的(不同的一句程序代码,编译出的指令条数都是不⼀样的),计算出精确的执行次数意义也不大,因为我们计算时间复杂度只是想比较算法程序的增长量级,也就是当N不断变大时T(N)的差别,上⾯我们已经看到了当N不断变大时常数和低阶项对结果的影响很小,所以我们只需要计算程序能代表增长量级的大概执行次数,复杂度的表示通常使用大O渐进表示法

3.1 大O表示法

在这里插入图片描述
在这里插入图片描述

什么意思呢?
我们以上面Func1为例T(N)=N^2+2*N+10
根据大O阶第一条规则:只保留最高阶项,O(N)=N^2。


在这里插入图片描述


3.2 时间复杂度示例练习

例1

在这里插入图片描述
Func2执行的基本操作次数:
T (N) = 2N + 10
根据推导规则第3条得出:

Func2的时间复杂度为: O(N)

例2

在这里插入图片描述
T (N) = M + N
因此:Func2的时间复杂度为: O(N)

例3

在这里插入图片描述
T (N) = 100
根据推导规则第1条得出

Func2的时间复杂度为: O(1)

例4

在这里插入图片描述
strchr执行的基本操作次数:
(1)若要查找的字符在字符串第一个位置,
则:T (N) = 1
(2)若要查找的字符在字符串最后的⼀个位置,
则:T (N) = N
(3)若要查找的字符在字符串中间位置,
则:T (N) =N/2
因此:strchr的时间复杂度分为:
最好情况: O(1)
最坏情况: O(N)
平均情况: O(N)

由于大O表示法一般表示最坏的情况,即O(N)

例5

在这里插入图片描述
(1)若数组有序,
则:T (N) = N,O(N)
(2)若数组有序且为降序,
则:T (N) =N ∗ (N + 1)/2,即O(N^2)

因此:BubbleSort的时间复杂度取最
差情况为: O(N^2 )

例6

在这里插入图片描述
当n=2时,执行次数为1
当n=4时,执行次数为2
当n=16时,执行次数为4
假设执行次数为 x ,则 2x = n
因此执行次数: x = log n

因此:func5的时间复杂度取最差情况为:O(log2 n)

提问:那么log2n,logn,lgn等有区别吗?

是没有区别的,我们要注意的是增长量级,即变化的n,无论底数为多少,当n越来越大时,这个底数对结果的影响是越来越小的,当n趋于无穷时,这个影响可以忽略不计,因此上面几种表示方法都是可以的。

例7

在这里插入图片描述
调用一次Fac函数的时间复杂度为 O(1)
而在Fac函数中,存在n次递归调用Fac函数

因此:阶乘递归的时间复杂度为: O(n)

算递归的复杂度的万能公式:创建了多少次函数栈帧(递推了多少次)*单次递归执行的次数。


4. 空间复杂度

空间复杂度也是⼀个数学表达式,是对⼀个算法在运行过程中因为算法的需要额外临时开辟的空间
空间复杂度不是程序占用了多少bytes的空间,因为常规情况每个对象大小差异不会很大,所以空间复
杂度算的是变量的个数
空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法
注意:函数运行时所需要的栈空间(存储参数、局部变量、⼀些寄存器信息等)在编译期间已经确定好
了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

4.1 空间复杂度示例练习

例1

在这里插入图片描述
BubbleSort额外申请的空间有exchange,end有限个局部变量,使用了常数个额外空间。
因此空间复杂度为 O(1)。

例2

在这里插入图片描述
Fac递归调用了N次,额外开辟了N个函数栈帧,
每个栈帧使用了常数个空间

因此空间复杂度为: O(N)


5. 开胃小菜扩展

轮转数组


按照思路1的方法:经过上面复杂度的学习,我们可以得出其时间复杂度为O(N^2),当给的数据过大,轮转次数过多时,势必会造成超过时间限制。

5.1 思路2:采用空间换时间的方法

我们如何将O(N^2)的时间复杂度降为O(N)呢(即只嵌套一层循环)?
在这里插入图片描述

可以发现这里的空间复杂度为O(N),那么是否可以让空间复杂度降为O(1),同时又保持时间复杂度为O(N)呢?见思路3。

5.2 思路3(优解):

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码看似更复杂了些,但它同时满足了降时间复杂度为O(N)和空间复杂度为O(1)。


在这里插入图片描述


在这里插入图片描述


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

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

相关文章

【C++笔记】map和set的使用

【C笔记】map和set的深度剖析 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】map和set的深度剖析前言一.set1.1 序列式容器和关联式容器1.2 set系列的使用1.3 set类的介绍1.4 set的构造和迭代器1.5 set的增删查1.6…

最新AI自动无人智享直播系统 —— 视频自动播软件热门之选

在当今数字化浪潮汹涌澎湃的时代,直播行业正经历着前所未有的变革与创新。而最新的 AI 自动无人智享直播系统,无疑成为了视频自动播软件中的热门之选,正引领着直播领域迈向新的高度。 这款 AI 自动无人智享直播系统,其核心优势在于…

气膜球幕:科技与艺术的完美融合,沉浸式体验引领未来—轻空间

在现代化展览和活动中,如何突破传统展示方式,吸引观众的目光,带来前所未有的沉浸式体验?气膜球幕作为一种创新的科技展示平台,凭借其独特的球形结构和多功能应用,正在成为各大展览、活动和娱乐项目的首选。…

计算机视觉硬件知识点整理六:工业相机选型

文章目录 前言一、工业数字相机的分类二、相机的主要参数三、工业数字摄像机主要接口类型四、选择工业相机的考量因素六、实例分析 前言 随着科技的不断进步,工业自动化领域正经历着前所未有的变革。作为工业自动化的重要组成部分,工业相机在工业检测、…

Mysql读写分离分库分表

读写分离 什么是读写分离 读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上。 这样的话,就能够小幅提升写性能,大幅提升读性能。一般情况下,我们都会选择一主多从,也就是一台主数据库负责写,其他的从…

【C语言】结构体(四)

本篇重点是typedef关键字 一,是什么? typedef用来定义新的数据类型,通常typedef与结构体的定义配合使用。 简单来说就是取别名 ▶ struct 是用来定义新的数据类型——结构体 ▶ typedef是给数据类型取别名。 二,为什么&#xf…

普中51单片机——LED流水灯模块

1、GPIO概念 GPIO(general purpose intput output)是通用输入输出端口的简称,可以通过软件来控制其输入和输出。51 单片机芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、 控制以及数据采集的功能。 1.1、GPIO分类 &a…

Linux入门系列--压缩与解压

一、前言 为了使传输的文件大小尽可能地小,我们采用压缩的方式生成压缩文件,然后将压缩包传输过去就可以了。衡量压缩方法地好坏主要有两点综合考量:一是压缩速度,二是压缩程度。很好理解,压缩一个文件,我…

云服务器重装系统后 一些报错与解决[ vscode / ssh / 子用户]

碰见的三个问题: 1.vscode连接失败 2.登录信息配置 3.新建子用户的一些设置 思考:遇见问题,第一反应 应该如何解决 目录 1. 错误 解决方法 原因 步骤 1:找到known_hosts文件并编辑 步骤 2:通过VSCode终端输入…

【包教包会】CocosCreator3.x——重写Sprite,圆角、3D翻转、纹理循环、可合批调色板、不影响子节点的位移旋转缩放透明度

一、效果演示 重写Sprite组件,做了以下优化: 1、新增自变换,在不影响子节点的前提下位移、旋转、缩放、改变透明度 新增可合批调色板,支持色相、明暗调节 新增圆角矩形、3D透视旋转、纹理循环 所有功能均支持合批、原生平台&…

南昌榉之乡托养机构解读:自闭症与看电视并无必然联系

在探讨自闭症的成因时,有人会问:自闭症是多看电视引起的吗?今天,就让我们来看看南昌榉之乡托养机构对此有何见解。 榉之乡大龄自闭症托养机构在江苏、广东、江西等地都有分校,一直致力于为大龄自闭症患者提供专业的支持…

卷积神经网络(CNN)的层次结构

卷积神经网络(CNN)是一种以其处理图像和视频数据的能力而闻名的深度学习模型,其基本结构通常包括以下几个层次,每个层次都有其特定的功能和作用: 1. 输入层(Input Layer): 卷积神经网…

Milvus×OPPO:如何构建更懂你的大模型助手

01. 背景 AI业务快速增长下传统关系型数据库无法满足需求。 2024年恰逢OPPO品牌20周年,OPPO也宣布正式进入AI手机的时代。超千万用户开始通过例如通话摘要、新小布助手、小布照相馆等搭载在OPPO手机上的应用体验AI能力。 与传统的应用不同的是,在AI驱动的…

数据结构之二叉树详解:从原理到实现

1. 什么是二叉树? 二叉树(Binary Tree)是一种树形数据结构,其中每个节点最多有两个子节点,分别被称为左子节点和右子节点。二叉树可以用来表示层次关系,如文件目录、组织结构,或用于快速查找、…

CTF-PWN: WEB_and_PWN [第一届“吾杯”网络安全技能大赛 Calculator] 赛后学习(不会)

附件 calculate.html <!DOCTYPE html> <html lang"en"> <head><!-- 设置字符编码为 UTF-8&#xff0c;支持多语言字符集 --><meta charset"UTF-8"><!-- 设置响应式视图&#xff0c;确保页面在不同设备上自适应显示 --&…

用于LiDAR测量的1.58um单芯片MOPA(一)

--翻译自M. Faugeron、M. Krakowski1等人2014年的文章 1.简介 如今&#xff0c;人们对高功率半导体器件的兴趣日益浓厚&#xff0c;这些器件主要用于遥测、激光雷达系统或自由空间通信等应用。与固态激光器相比&#xff0c;半导体器件更紧凑且功耗更低&#xff0c;这在低功率供…

【maven-5】Maven 项目构建的生命周期:深入理解与应用

1. 生命周期是什么 ​在Maven出现之前&#xff0c;项目构建的生命周期就已经存在&#xff0c;软件开发人员每天都在对项目进行清理&#xff0c;编译&#xff0c;测试及部署。虽然大家都在不停地做构建工作&#xff0c;但公司和公司间&#xff0c;项目和项目间&#xff0c;往往…

数字时代的文化宝库:存储技术与精神生活

文章目录 1. 文学经典的数字传承2. 音乐的无限可能3. 影视艺术的数字化存储4. 结语 数字时代的文化宝库&#xff1a;存储技术与精神生活 在数字化的浪潮中&#xff0c;存储技术如同一座桥梁&#xff0c;连接着过去与未来&#xff0c;承载着人类文明的瑰宝。随着存储容量的不断增…

STM32标准库-FLASH

FLASH模仿EEPROM STM32本身没有自带EEPROM&#xff0c;但是自带了FLASH存储器。 STM32F103ZET6自带 1M字节的FLASH空间&#xff0c;和 128K64K的SRAM空间。 STM32F4 的 SPI 功能很强大&#xff0c;SPI 时钟最高可以到 37.5Mhz&#xff0c;支持 DMA&#xff0c;可以配置为 SPI协…

重学设计模式-工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)

在平常的学习和工作中&#xff0c;我们创建对象一般会直接用new&#xff0c;但是很多时候直接new会存在一些问题&#xff0c;而且直接new会让我们的代码变得非常繁杂&#xff0c;这时候就会巧妙的用到设计模式&#xff0c;平常我们通过力扣学习的算法可能并不会在我们工作中用到…