数据结构~~时间、空间复杂度

目录

一、什么是数据结构

什么是算法

算法的复杂度

二、时间复杂度

三、空间复杂度

四、总结


一、什么是数据结构

数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的 数据元素的集合。

数据结构关注的是数据的逻辑结构和物理存储结构。

逻辑结构主要描述数据元素之间的关系,比如线性结构(如数组、链表)、树结构(二叉树、B 树等)、图结构等。

物理存储结构则是数据在计算机内存中的实际存储方式,例如顺序存储和链式存储。

数据结构的重要性在于:

  • 它能提高数据处理的效率,选择合适的数据结构可以让特定操作更快速地执行。
  • 帮助更好地组织和管理大量的数据,使其更易于操作和理解。
  • 为算法设计提供基础,不同的数据结构适用于不同的算法。

什么是算法

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

算法具有以下特征:

  1. 输入项:算法需要有输入或者说初始条件;
  2. 确定性:算法的每一步必须要有确定的含义,不能有歧义;
  3. 有穷性:算法在执行有限步骤之后必须结束;
  4. 输出:算法必须要有一个或多个输出,即与输入有某个特定关系的量;
  5. 可行性:算法中有待执行的运算和操作必须是可以实现的,能够精确地进行。

算法可大致分为基本算法、数据结构的算法、数论与代数算法、计算几何的算法、图论的算法、动态规划、数值分析、加密算法、排序算法、检索算法、随机化算法、并行算法等。

算法的复杂度

算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般 是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。 时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算 机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计 算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。

一般算法常见的复杂度如下:

二、时间复杂度

时间复杂度,又称时间复杂性,在计算机科学中,它是一个函数,用来定性描述算法的运行时间。

时间复杂度是一个代表算法输入值的字符串的长度的函数,常用大 O 符号表示,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,即考察输入值大小趋近无穷时的情况。

将算法需要执行的运算次数用输入大小 n 的函数表示,即为 T(n)。为了估算算法需要的运行时间和简化算法分析,便引入了时间复杂度的概念。

常见的时间复杂度量级包括:

  • 常数阶 O(1):无论代码执行了多少行,只要没有循环等复杂结构,时间复杂度就都是 O(1)。例如:
  • 线性阶 O(n):代码的执行时间与问题规模 n 呈线性关系。例如上述的 for 循环代码。
  • 对数阶 O(logN):例如:
  • 线性对数阶 O(nlogN):将时间复杂度为 O(logn)的代码循环 N 遍,时间复杂度就是 n * O(logN)。
  • 平方阶 O(n^2):例如嵌套循环
  • 立方阶 O(n³)、K 次方阶 O(n^k)等。

在分析时间复杂度时,通常遵循以下原则:

  1. 循环次数最多原则:只需关注循环次数最多的那段代码。
  2. 加法原则:量级最大的那段代码时间复杂度等于总的时间复杂度。
  3. 乘法原则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积。

算法的时间复杂度可以帮助我们评估算法的效率,在实际应用中,我们希望选择时间复杂度较低的算法,以提高程序的运行速度和性能。但同时,也需要综合考虑空间复杂度等其他因素,以找到最适合具体问题的解决方案。

三、空间复杂度

空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。它是一个算法所需存储空间的函数,记作S(n)=O(f(n)),其中为n问题的规模,f(n)为语句关于的所占存储空间的函数。

常见的空间复杂度有O(1)、O(n)和O(n^2)等:

当算法运行时占用的临时空间不随某一变量n的改变而改变时,即空间复杂度为常量,表示为O(1);

当算法运行时占用的临时空间随n的改变而改变时,空间复杂度即为O(n);

当算法运行时占用的临时空间随n^2的改变而改变时,空间复杂度则为O(n^2,以此类推。

算法的空间复杂度主要考虑在运行过程中为局部变量分配的存储空间的大小,它包括为参数表中形参变量分配的存储空间和为在函数体中定义的局部变量分配的存储空间两个部分。若算法为递归算法,其空间复杂度为递归所使用的堆栈空间的大小,等于一次调用所分配的临时存储空间的大小乘以被调用的次数(即为递归调用的次数加 1,这个 1 表示开始进行的一次非递归调用)。

空间复杂度一般也以数量级的形式给出,用于衡量算法运行时所需额外空间的增长趋势,而不是具体计算占用的存储空间大小。

例如,冒泡排序算法的空间复杂度通常为O(1),因为它在运行过程中只使用了固定数量的额外空间来存储交换标志等少数几个变量;而一些使用递归实现的算法,如计算斐波那契数列的递归算法,其空间复杂度可能为O(n),因为递归调用会在堆栈中占用与输入规模成正比的空间。

在分析算法的优劣时,通常需要同时考虑时间复杂度和空间复杂度。有时为了追求较低的时间复杂度,可能会导致空间复杂度增加;反之,为了降低空间复杂度,可能会使时间复杂度上升。在实际应用中,需要根据具体情况进行权衡和选择。

四、总结

时间复杂度

  • 用于衡量算法运行所需时间随输入规模增长的变化趋势。
  • 常见的时间复杂度级别有:O(1)(常数级)、O(n)(线性级)、O(logn)(对数级)、O(nlogn)(线性对数级)、O(n²)(平方级)等。
  • 帮助我们评估算法在不同规模输入下的效率,以便选择更高效的算法。

空间复杂度

  • 描述算法在运行过程中所需额外存储空间的大小与输入规模的关系。
  • 也有类似的级别划分,如 O(1)(固定额外空间)、O(n)(与输入规模线性相关的额外空间)等。
  • 考虑空间复杂度可以避免因占用过多内存而导致程序运行异常或效率低下。

在实际情况中,需要综合考虑时间复杂度和空间复杂度。有时候为了降低时间复杂度可能会适当增加空间复杂度,反之亦然。例如:

  • 一些排序算法可能时间复杂度较低,但需要额外较多的空间来辅助排序。
  • 某些算法可能空间复杂度低,但运行时间相对较长。

在选择算法时,要根据具体的应用场景和需求进行权衡。如果对运行速度要求极高,可以优先考虑时间复杂度低的算法;如果内存资源有限,则要更关注空间复杂度。总之,要在时间和空间的效率之间找到一个合适的平衡点。

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

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

相关文章

快速搭建Jenkins自动化集成cicd工具

一、简介 jenkins是一款优秀的自动化持续集成运维工具,可以极大的简化运维部署的步骤。 传统的项目部署需要手动更换最新的项目代码,然后打包并运行到服务器上。 使用Jenkins可以自动化实现,当代码编写完成并提交到git后,Jenki…

通过 cloudflare 白嫖个人 docker 镜像加速服务

不知为何,现在大多数的 docker hub 镜像加速站都停止服务,而官方站点又因某些原因访问不到或延迟很高。所以,今天来记录一种通过 CloudFlare 搭建一个自己的镜像加速服务。 0、必看!!! 注意: 此…

pywebview打包本地的html

51.安装 pip install pywebview 2.新建start.py import webview import timeclass API:def say_hello(self, name):time.sleep(2) # 模拟一个耗时操作return fHello, {name}!def main():api API()webview.create_window(pywebview Example, index.html, js_apiapi)webview.…

抛弃Mybatis,拥抱新的ORM 框架!【送源码】

背景 转java后的几年时间里面一直在寻找一个类似.net的orm,不需要很特别的功能,仅希望90%的场景都可以通过强类型语法来编写符合直觉的sql,来操作数据库编写业务。 但是一直没有找到,Mybatis-Plus的单表让我在最初的时间段内看到…

利用golang_Consul代码实现Prometheus监控目标的注册以及动态发现与配置

文章目录 前言一、prometheus发现方式二、监控指标注册架构图三、部分代码展示1.核心思想2.代码目录3、程序入口函数剖析4、settings配置文件5、初始化配置文件及consul6、全局变量7、配置config8、公共方法目录common9、工具目录tools10、service层展示11、命令行参数12、Make…

Android笔记-安装Termux开启ssh,安装vim、android-tool、python等

背景 家里面有个老手机,想将此手机做成一个家庭服务器。控制各种家电。目前准备先控制电视机 流程 用电脑usb连接手机,下载好Termux,在安卓手机上安装好。这里就不记录笔记了,各个手机不一样。 安装好进入手机后: …

mfc140.dll是什么文件?mfc140.dll文件下载安装办法

一、mfc140.dll文件功能与作用 mfc140.dll作为Microsoft Foundation Classes库的一部分,提供了一系列的基础功能,这些功能对于开发Windows桌面应用程序至关重要。 2.1 应用程序框架 mfc140.dll封装了应用程序的生命周期管理,包括初始化、运…

赶论文不用愁:如何利用ChatGPT在3小时内完成论文

在这份指南里,我将详细介绍如何运用ChatGPT 4.0的高级功能来辅助学术研究与文章写作。从挖掘研究课题的初步想法开始,到撰写一篇内容深刻、结构完整的学术论文,我将逐步演示如何在研究的各个阶段中充分利用ChatGPT。值得一提的是,…

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 07:编码中的假象

这是一本老书,作者 Steve Maguire 在微软工作期间写了这本书,英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字,英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

二进制炸弹的fp是什么?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

【算法】优先级队列-基础与应用

优先级队列(Priority Queue)是一种特殊的队列类型,它允许在其元素中分配优先级。与传统的先进先出(FIFO)队列不同,优先级队列中元素的出队顺序取决于它们的优先级。优先级较高的元素会被优先处理&#xff0…

【Qt笔记①】帮助文档、窗口、按钮、信号和槽、lambda表达式

学习第一天:2024-3-9 文章目录 Qt creator 快捷键帮助文档默认生成的main.cpp逐行解释核心类帮助文档的查阅方法-①代码创建按钮第一个第二个对窗口的其他设置 对象树窗口坐标系信号和槽(优点:松散耦合)帮助文档的查阅方法-②找信…

轨迹规划系列之S型速度曲线绝对值定位功能块(Codesys源代码)

1、轨迹规划的作用 轨迹规划的作用(前馈速度+位置插补)-CSDN博客文章浏览阅读13次。轨迹规划可以产生运动控制系统位置闭环控制所需要的前馈速度和插补位置值。前馈速度+PID位置闭环控制典型应用可以参考下面文章链接:1、S7-1200PLC和V90伺服通过工艺对象实现定位控制S7-1200…

表驱动法 -优化逻辑分支

表驱动法 -优化逻辑分支 定义 表驱动法(Table-Driven Approach)是一种编程模式,可以将输入变量作为直接或间接索引在表里查找所需的结果或处理函数,而不使用逻辑语句(if-else 和 switch-case)。索引表可以…

VMware与windows的共享文件夹没找到怎么办?

如果这样子添加,在ubuntu中还是没能找到。开机后有的时候仍然未发现共享文件夹。 二、解决办法 使用如下指令: sudo mount -t fuse.vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other /mnt/hgfs/ 是挂载点,也可以指定其它挂载点 -o allow_other…

DHCP原理1-单个局域网出现多个DHCP服务器会发生什么

1. 背景 DHCP全称是Dynamic Host Configuration Protocol。其协议标准是RFC1541(已被RFC2131取代),主要实现服务器向客户端动态分配IP地址(如IP地址、子网掩码、网关、DNS)和配置信息。其系统架构是标准的C/S架构。RFC…

自学SAP是学习ECC版本还是S4版本?

很多人想学SAP,问我应该学ECC版本还是S4版本,我的建议如果你是自学的话,我个人建议使用ECC版本就行,因为这两个版本前台业务和后台配置的操作差异并不大,主要差异在于数据库的差异,前台业务操作和后台系统配…

OS复习笔记ch12-1

文件系统 概述 文件是大多数应用程序的核心要素,文件系统是操作系统对用户来说最重要的部分之一。 本章的主要内容见下图: 文件,大家耳熟能详的就是的docx、pdf、jpg、MP4等各种后缀文件,根据任务需要文件又分成了文本、图片、…

超越YOLOv8,飞桨推出精度最高的实时检测器RT-DETR!

众所周知,实时目标检测( Real-Time Object Detection )一直由 YOLO 系列模型主导。 飞桨在去年 3 月份推出了高精度通用目标检测模型 PP-YOLOE ,同年在 PP-YOLOE 的基础上提出了 PP-YOLOE 。后者在训练收敛速度、下游任务泛化能力以及高性能部署能力方面…

我国目前常用的卫星影像星座有哪些(高分二号、高分七号、吉林一号、高景一号······)

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 中国目前的遥感卫星在数量、种类和应用领域上都取得了显著进展,覆盖了陆地、气象、海…