当前位置: 首页 > news >正文

数据结构时间复杂度与空间复杂度


文章目录

  • 引入
    • 算法
  • 1、时间复杂度
    • 1.概念
    • 2.大O渐进表示法
    • 3.常见时间复杂度计算举例
  • 2、空间复杂度
    • 1.概念
    • 2.常见空间复杂度计算举例


引入

算法

算法就是一段能将一个物体从初始状态转换到某个目标转态的一个有限长序列方法的统称

算法效率:考虑一个方法是否好,就要从它的效率上考虑,能高质量(即高效)的完成目标的算法,就是一个好的算法;而对于算法效率要怎么来进行判定呢?

与算法效率有关的因素有很多,包括:算法所需的时间、空间成本等因素;在计算机相关中包括网络运行速度,硬件等因素都会对效率产生影响,而这些因素都是我们所无法掌控的,所以我们在进行算法效率评定中大致以所需的时间和空间作为主要的衡量标志,来对算法效率进行一个判定,这就是时间复杂度与空间复杂度。

1、时间复杂度

1.概念

在计算机中,算法的时间复杂度也有定量的函数,其实也就是他将目标从初始状态转换为目标状态所需花费的时间。就从理论上来讲,想要获取一个算法的时间复杂度,那就必须将在计算机上运行,然后测量所需的时间,才能计算出它的时间复杂度。但在实际生活中,这种方式较为难以实现,所以我们将算法中基本操作的执行次数来作为它的时间复杂度。

我们就以下方的代码来进行一个举例:

//请计算Test1中++count所执行的次数
void Test1(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--){++count;}printf("%d\n", count);
}

在如上代码中++count一共执行了:N^2 + 2N + 10次

实际上我们计算算法的时间复杂度时,并不需要将准确的执行次数计算出来,而是只需要渐进的表示。因为当你将量级拉大,比如几十万、几百万次执行中,几十、几百次的执行次数对于整体来说影响也不大。我们通常使用的方法是大O渐进表示法。

2.大O渐进表示法

1.表示方法:O(表达式中影响最大的哪一项)
2.推荐大O表示法
 1)确定的常数次,我们都使用O(1) 来表示;原因:只要是常数次,它就不是未知数的影响,无论基数多大,它都不会变,意味着效率不变
 2)O(N) 意味着随着N的变化,运算时间变长
 3)对于有些会有最好情况、最坏情况、与平均情况,这时候的时间复杂度是保守的估算,取最坏结果
3.注意:
 1)不是说一次循环就是O(n),两次循环就是o(n^2),具体要通过程序区分析
 2)时间复杂度计算,不能去数代码执行的次数,要根据思想去计算时间复杂度,然后看哪个更优,再去实现

4.常见的时间复杂度:O(N^2) , O(N) , O(logN) , O(1)

3.常见时间复杂度计算举例

void Test2(int N)
{int count = 0;for (int k = 0; k < 2 * N; ++k){++count;}int M = 10;while (M--){++count;}printf("%d\n", count);
}void Test3(int N, int M)
{int count = 0;for (int k = 0; k < M; ++k){++count;}for (int k = 0; k < N; ++k){++count;}printf("%d\n", count);
}

Test2就是刚刚我们所计算的那道题,用大O表示法来进行表示,它的时间复杂度是:O(N^2)

Test3中基本操作执行了M+N次,有两个未知数M和N,时间复杂度为 O(N+M)

2、空间复杂度

1.概念

空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度 。

空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。 空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。

在当今世界中由于电脑,手机等的储存空间大大增加,所以我们在实际处理问题中对与时间复杂度考虑式要优先于空间复杂度的。

2.常见空间复杂度计算举例

// 计算BubbleSort的空间复杂度?
void Test4(int* a, int n)
{assert(a);for (size_t end = n; end > 0; --end){int exchange = 0;for (size_t i = 1; i < end; ++i){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);exchange = 1;}}if (exchange == 0)break;}
}// 计算阶乘递归Fac的空间复杂度?
long long Test5(size_t N)
{if (N == 0)return 1;return Fac(N - 1) * N;
}

Test4中使用了常数个额外空间,所以空间复杂度为 O(1)

Test5中递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间。空间复杂度为O(N)

相关文章:

数据结构时间复杂度与空间复杂度

文章目录 引入算法 1、时间复杂度1.概念2.大O渐进表示法3.常见时间复杂度计算举例 2、空间复杂度1.概念2.常见空间复杂度计算举例 引入 算法 算法就是一段能将一个物体从初始状态转换到某个目标转态的一个有限长序列方法的统称 算法效率&#xff1a;考虑一个方法是否好&…...

【计算机网络】内容整理

概述 分组交换 分组交换则采用存储转发&#xff08;整个包必须到达路由器&#xff0c;然后才能在下一个链路上传输)技术。 在发送端&#xff0c;先把较长的报文划分成较短的、固定长度的数据段。 电路交换 在端系统间通信会话期间&#xff0c;预留了端系统间沿路径通信所需…...

【K12】Python写分类电阻问题的求解思路解析

分压电阻类电路问题python程序写法 一个灯泡的电阻是20Ω&#xff0c;正常工作的电压是8V&#xff0c;正常工作时通过它的电流是______A。现在把这个灯泡接到电压是9V的电源上&#xff0c;要使它正常工作&#xff0c;需要给它______联一个阻值为______的分压电阻。 解决思想 …...

数据库面经---10则

数据库范式有哪些&#xff1a;​​​​​​​ 第一范式&#xff08;1NF&#xff09;&#xff1a; 数据表中的每一列都是不可分割的原子值。每一行数据在关系表中都有唯一标识&#xff0c;通常是通过主键来实现。第二范式&#xff08;2NF&#xff09;&#xff1a; 满足第一范式。…...

深度学习基本介绍-李沐

目录 AI分类&#xff1a;模型分类&#xff1a;广告案例&#xff1a; bilibili视频链接&#xff1a;https://www.bilibili.com/video/BV1J54y187f9/?p2&spm_id_frompageDriver&vd_sourcee6a6e7fec41c59c846c142eb5ef1da0b AI分类&#xff1a; 模型分类&#xff1a; 图…...

【上分日记】第369场周赛(分类讨论 + 数学 + 前缀和)

文章目录 前言正文1.3000. 对角线最长的矩形的面积2.3001. 捕获黑皇后需要的最少移动次数3.3002. 移除后集合的最多元素数3.3003. 执行操作后的最大分割数量 总结尾序 前言 终于考完试了&#xff0c;考了四天&#xff0c;也耽搁了四天&#xff0c;这就赶紧来补这场周赛的题了&a…...

CMake Error at CMakeLists.txt:14 (project): The CMAKE_CXX_COMPILER:

报错 CMake Error at CMakeLists.txt:14 (project):The CMAKE_CXX_COMPILER:arm-none-eabi-g 解决办法1 Arm GNU Toolchain Downloads – Arm Developer x86_64 linux上&#xff1a; x86_64 Linux hosted cross toolchains AArch32 bare-metal target (arm-none-eabi)arm-g…...

Sqoop与其他数据采集工具的比较分析

比较Sqoop与其他数据采集工具是一个重要的话题&#xff0c;因为不同的工具在不同的情况下可能更适合。在本博客文章中&#xff0c;将深入比较Sqoop与其他数据采集工具&#xff0c;提供详细的示例代码和全面的内容&#xff0c;以帮助大家更好地了解它们之间的差异和优劣势。 Sq…...

Pandas实战100例 | 案例 31: 转换为分类数据

案例 31: 转换为分类数据 知识点讲解 在处理包含文本数据的 DataFrame 时&#xff0c;将文本列转换为分类数据类型通常是一个好主意。这可以提高性能并节省内存。Pandas 允许将列转换为 category 类型。 分类数据类型: category 类型适用于那些只包含有限数量不同值的列&…...

椋鸟C语言笔记#33:文件的顺序读写

萌新的学习笔记&#xff0c;写错了恳请斧正。 目录 光标&#xff08;文件位置指示器&#xff09; 文件的顺序读写 fgetc 使用实例 fputc 使用实例 fgets fputs 使用实例 fscanf fprintf fread fwrite 使用实例 光标&#xff08;文件位置指示器&#xff09; 我们…...

Transformer - Attention is all you need 论文阅读

虽然是跑路来NLP&#xff0c;但是还是立flag说要做个project&#xff0c;结果kaggle上的入门project给的例子用的是BERT&#xff0c;还提到这一方法属于transformer&#xff0c;所以大概率读完这一篇之后&#xff0c;会再看BERT的论文这个样子。 在李宏毅的NLP课程中多次提到了…...

安装配置Flink

安装配置Flink 1.上传安装包到Linux 2.解压到指定路径 tar -zxf ./flink-1.14.0-bin-scala_2.12.tgz /usr/local/src/3.修改环境变量 vi ~/.bashrc#往最后加入 export FLINK_HOME /usr/local/src/flink-1.14.0/ export PATH$PATH:$FLINK_HOME/bin#激活环境变量 source ~/.…...

解决Spss没有创建虚拟变量的选项的问题

这个是今天用spss想创建虚拟变量然后发现我的spss没有。 然后能怎么办我就百度呗&#xff0c; 说是在扩展里连接扩展中心 天哪&#xff0c;谁能连上&#xff0c;我连不上 于是就找到了从github上下载到本地&#xff0c;然后安装到spss中 目录 解决方法 点击code 再点击D…...

wxWidgets实战:使用mpWindow绘制阻抗曲线

选择模型时&#xff0c;需要查看model的谐振频率&#xff0c;因此需要根据s2p文件绘制一张阻抗曲线。 如下图所示&#xff1a; mpWindow 左侧使用mpWindow&#xff0c;右侧使用什么&#xff1f; wxFreeChart https://forums.wxwidgets.org/viewtopic.php?t44928 https://…...

深度学习15—(迁移学习)冻结和解冻神经网络模型的参数

冻结与解冻代码&#xff1a; def freeze_net(net):if not net:returnfor p in net.parameters():p.requires_grad Falsedef unfreeze_net(net):if not net:returnfor p in net.parameters():p.requires_grad True 这段代码定义了两个函数&#xff1a;freeze_net 和 unfree…...

强化学习应用(八):基于Q-learning的无人机物流路径规划研究(提供Python代码)

一、Q-learning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个价值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是通过不断更新一个称为Q值的…...

常见面试题之HTML

行内元素有哪些&#xff1f;块级元素有哪些&#xff1f; 空(void)元素有那些&#xff1f; HTML 中的行内元素&#xff08;inline elements&#xff09;通常用于在一行内显示&#xff0c;不会独占一行的空间。常见的行内元素有&#xff1a; <span>&#xff1a;用于对文本…...

数据结构与算法教程,数据结构C语言版教程!(第三部分、栈(Stack)和队列(Queue)详解)六

第三部分、栈(Stack)和队列(Queue)详解 栈和队列&#xff0c;严格意义上来说&#xff0c;也属于线性表&#xff0c;因为它们也都用于存储逻辑关系为 "一对一" 的数据&#xff0c;但由于它们比较特殊&#xff0c;因此将其单独作为一章&#xff0c;做重点讲解。 使用栈…...

使用Docker部署PDF多功能工具Stirling-PDF

1.服务器上安装docker 安装比较简单&#xff0c;这种安装的Docker不是最新版本&#xff0c;不过对于学习够用了&#xff0c;依次执行下面命令进行安装。 sudo apt install docker.io sudo systemctl start docker sudo systemctl enable docker 查看是否安装成功 $ docker …...

linux安装系统遇到的问题

这两天打算攻克下来网络编程&#xff0c;发现这也确实是很重要的一个东西&#xff0c;但我就奇了怪了&#xff0c;老师就压根没提&#xff0c;反正留在我印象的就一个tcp/ip七层网络。也说正好&#xff0c;把linux命令也熟悉熟悉&#xff0c;拿着我大一课本快速过过 连接cento…...

SOCD Cleaner终极指南:告别游戏输入冲突,开启精准操作新时代

SOCD Cleaner终极指南&#xff1a;告别游戏输入冲突&#xff0c;开启精准操作新时代 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 你是否曾在《街头霸王6》中因为同时按下左右方向键而错失连招机会&#xff1…...

移动充电机器人AI边缘计算方案:从感知到精准对接的工程实践

1. 项目概述&#xff1a;当充电桩“活”了过来最近在跟进一个挺有意思的项目&#xff0c;跟几位做智慧园区和社区运营的朋友聊&#xff0c;他们都在头疼同一个问题&#xff1a;新能源车的充电焦虑&#xff0c;已经从“找不到桩”升级到了“桩被占着”。固定充电桩的利用率在高峰…...

基于RP2040与VL53L1X的自动触发空气炮:嵌入式感知-决策-执行系统实践

1. 项目概述&#xff1a;一个会“思考”的自动空气炮如果你玩过或者听说过那些在鬼屋里突然喷气吓人的恶作剧道具&#xff0c;那你大概能想象出这个项目的最终效果。但今天我们要做的&#xff0c;远不止一个简单的“吓人盒子”。这是一个融合了现代嵌入式系统、高精度传感器和气…...

如何通过虚拟地址查找物理地址

1 如何通过虚拟地址查找物理地址&#xff08;原理与代码&#xff09; 本文说明 虚拟地址&#xff08;VA&#xff09;到物理地址&#xff08;PA&#xff09; 的映射在 x86-64 Linux 上如何理解与实现&#xff0c;并给出可编译的示例代码。不同架构&#xff08;ARM、RISC-V&#…...

ARM ETMv4跟踪寄存器架构与调试实践

1. ARM ETMv4 跟踪寄存器架构概述ARM嵌入式跟踪宏单元(ETM)是处理器调试架构中的关键组件&#xff0c;ETMv4作为其第四代架构&#xff0c;提供了更强大的指令和数据跟踪能力。与传统的断点调试不同&#xff0c;ETM采用实时跟踪技术&#xff0c;能够在不中断处理器运行的情况下&…...

Protégé工具与OWL本体建模实践指南

1. 本体建模基础与Protg工具概述本体&#xff08;Ontology&#xff09;作为知识工程领域的核心概念&#xff0c;最初源自哲学领域&#xff0c;在计算机科学中被重新定义为"对共享概念体系的明确形式化规范说明"。在语义网架构中&#xff0c;本体位于XML和RDF层之上&a…...

spoof 与网络安全:如何利用 MAC 地址伪造增强企业安全防护

spoof 与网络安全&#xff1a;如何利用 MAC 地址伪造增强企业安全防护 【免费下载链接】spoof Easily spoof your MAC address in macOS, Windows, & Linux! 项目地址: https://gitcode.com/gh_mirrors/sp/spoof 在当今数字化时代&#xff0c;网络安全已成为企业运营…...

SubDomainizer与其他工具集成:打造完整的网络安全评估工作流

SubDomainizer与其他工具集成&#xff1a;打造完整的网络安全评估工作流 【免费下载链接】SubDomainizer A tool to find subdomains and interesting things hidden inside, external Javascript files of page, folder, and Github. 项目地址: https://gitcode.com/gh_mirr…...

SpringBoot+Vue民宿管理系统源码+论文

代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 分享万套开题报告任务书答辩PPT模板 作者完整代码目录供你选择&#xff1a; 《SpringBoot网站项目》1800套 《SSM网站项目》1500套 《小程序项目》1600套 《APP项目》1500套 《Python网站项目》…...

TLM通信:从基础操作到UVM高级连接模式

1. TLM通信基础&#xff1a;从信号级到事务级的跨越 第一次接触TLM这个概念时&#xff0c;我正被一堆信号线搞得焦头烂额。当时在做一个以太网MAC验证项目&#xff0c;每次调试都要跟踪几十根信号线的时序&#xff0c;简直像在解一团乱麻。直到同事提醒我&#xff1a;"为什…...