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

news2024/10/5 13:34:38

     

目录

一、时间复杂度

定义

常见的时间复杂度

如何计算时间复杂度

计算方法

三、实例分析

二、空间复杂度

定义

重要性

常见的空间复杂度

二、空间复杂度

定义

重要性

常见的空间复杂度

计算方法

三、实例分析

大O的渐进表示法

最好情况(Best Case)6:00

平均情况(Average Case)6:10

最坏情况(Worst Case)6:20

例1:

例2:

例3:

例4

例5


   在计算机科学和算法分析中,时间复杂度和空间复杂度是评估算法效率的两个关键指标。它们帮助我们理解算法在处理数据时所需资源的多少,从而指导我们做出更优的选择。本文将深入浅出地介绍这两个概念,并通过实例加以说明。说白了你在工作当中要让代码的效率变得更好,就需要注意

一、时间复杂度

定义

时间复杂度,简而言之,是指执行算法所需要的计算工作量随着问题规模(通常是输入数据的大小)增长的变化趋势。它关注的是算法运行时间与输入数据规模之间的关系,通常用大O符号表示(O(n)),忽略掉常数项、低阶项以及最高阶的系数。

常见的时间复杂度

  1. O(1) - 常数时间复杂度:算法的执行时间不随输入数据规模变化,如数组访问某个元素。
  2. O(log n) - 对数时间复杂度:二分查找就是一个典型的例子,每一步都将问题规模减半。
  3. O(n) - 线性时间复杂度:遍历数组或列表中的每个元素。
  4. O(n log n) - 线性对数时间复杂度:快速排序、归并排序等高效排序算法。
  5. O(n^2) - 平方时间复杂度:冒泡排序、选择排序等简单排序算法。
  6. O(n^3)O(2^n)O(n!) - 随着问题规模的增长,所需时间急剧增加,分别对应立方、指数、阶乘复杂度。

如何计算时间复杂度

计算方法

空间复杂度的计算方法与时间复杂度相似,也是关注随着问题规模增长,算法所需最大额外空间的变化趋势。

三、实例分析

上面的这些都不能让大家看出复杂度

这里主要举时间复杂度例子

实例1

实例2

实例3

实例4

实例5

  • 找出基本操作:首先确定算法中的基本操作,即执行次数最多的操作。
  • 确定问题规模:用n表示输入数据的大小。
  • 计算增长数量级:分析基本操作的执行次数与n的关系,忽略低阶项和系数,只保留最高阶项。
  • 二、空间复杂度

    定义

    空间复杂度衡量的是算法在运行过程中临时占用存储空间大小的变化情况,同样与问题规模有关。这包括了算法本身占用的空间以及算法运行过程中需要的额外空间。

    重要性

    在内存资源有限的环境下,特别是嵌入式系统或大规模数据处理中,空间复杂度是一个不可忽视的因素。高效利用内存可以提升系统性能,减少资源消耗。

    常见的空间复杂度

  • O(1):算法使用的额外空间不随输入数据规模改变,如原地排序算法。
  • O(n):额外空间正比于输入数据规模,如某些动态规划问题中需要的数组。
  • O(n^2):随着输入规模增大,所需空间平方增长,例如某些矩阵运算。

二、空间复杂度

定义

空间复杂度衡量的是算法在运行过程中临时占用存储空间大小的变化情况,同样与问题规模有关。这包括了算法本身占用的空间以及算法运行过程中需要的额外空间。

重要性

在内存资源有限的环境下,特别是嵌入式系统或大规模数据处理中,空间复杂度是一个不可忽视的因素。高效利用内存可以提升系统性能,减少资源消耗。

常见的空间复杂度

  • O(1):算法使用的额外空间不随输入数据规模改变,如原地排序算法。
  • O(n):额外空间正比于输入数据规模,如某些动态规划问题中需要的数组。
  • O(n^2):随着输入规模增大,所需空间平方增长,例如某些矩阵运算。

计算方法

空间复杂度的计算方法与时间复杂度相似,也是关注随着问题规模增长,算法所需最大额外空间的变化趋势。

三、实例分析

//请计算一下Func1中++count语句总共执行了多少次?
void Funcl(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);
}

这个代码的时间复杂度是多少嘞?

这边我们看一下我们有一个嵌套循环,外循环执行一次,内循环就要执行N次,所以我们得出了N的平方,再看我们的第二个循环循环的是2*N,下面的while循环10次,由这些依据我们得到一个公式

F(N) = N^2+2*N+10

我们计算时间复杂度有一个大O的渐进表示法来表示,来看个例子:

               精确值                      估算值

N=10      F(N)=130                   100

N=100    F(N)=10210               10000

N=1000  F(N)=1002010           1000000

 实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这 里我们使用大O的渐进表示法。

大O的渐进表示法

由于我们得计算机,运算很快

这个也要看我们的电脑配置

大O渐进表示法,简单来说,是一种衡量算法随着输入数据量增加时,其执行时间或所需资源如何增长的方法。它不关注具体的计算时间,而是关心增长的趋势和速度。

想象一下,你正在研究两个不同的背包打包算法。一个算法检查每件物品与背包内所有可能位置的组合(这可能会导致检查的数量呈指数级增长),而另一个算法则采用更聪明的方法,比如按物品价值和重量预先排序(这样可能最多只需检查每个物品一次)。为了比较这两个算法哪个在面对大量物品时表现更好,我们就需要用到大O表示法。

通过上面我们会发现大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。

举个例子吧,假如你今天在看我的博客,但是你女朋友给你发消息说晚上出来玩,然后叫你定个时间,于是就出来三种情况

最好情况(Best Case)6:00
  • 描述:博客非常短,你几乎立刻就读完了。
  • 算法复杂度:在这种情况下,无论博客多长,你都能瞬间完成阅读并回复消息。这类似于一个常数时间操作,可以用O(1)表示,意味着操作时间不随输入大小变化。
平均情况(Average Case)6:10
  • 描述:博客的长度中等,既不太长也不太短,你需要花一些合理的时间阅读。
  • 算法复杂度:如果大多数时候博客的长度在一个可预期的范围内,且阅读时间与博客长度成正比,那么这可以视为线性时间复杂度,即O(n),其中n代表博客的字数。这意味着阅读时间随博客长度线性增长。
最坏情况(Worst Case)6:20
  • 描述:博客异常长,需要很长时间才能读完。
  • 算法复杂度:在这种情况下,如果阅读时间直接与博客的长度成正比(忽略可能的加载时间等其他因素),复杂度仍然是O(n)。但如果考虑到随着博客越来越长,你的注意力可能会分散,导致阅读每个额外字词所需时间轻微增加,这种情况下虽然仍是线性关系,但强调了在极端条件下的体验。

这三种情况,你选哪一个最保险?才能不让你的女朋友等你嘞?所以我们有时候不要把预期拉的太高,做事要想好最坏的打算

通过这些我们回到上面的代码我们就可以得出他的时间复杂度是O(n^2),因为他影响最大,也是最坏的那个

接下来我们看几个例子来练习一下

例1:
//计算Func3的时间复杂度?
void Func3(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);

F(M+N)

这里没有明确说明N远大于M还是M远大于N,都没有明确说明,那就是对执行次数影响是同等的,谁都不能舍去,所以结果为O(N)=N+M。

例2:
//计算Func4的时间复杂度?
void Func4(int N)
{
int count =0;
for (int k =0;k<100;++k)
{
++count;
}
printf("%d\n",count);
}
 

大家看一下这个时间复杂度是多少?

这个循环一共执行了100次,这个100是一个常数,所以我们这里的空间复杂度是O(1)(就是我们可以看出来的次数,执行次数不是未知数

例3:

例4

这个就要根据逻辑理解这个O(2^N)

例5

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

注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因 此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

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

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

相关文章

吴恩达机器学习笔记:第 9 周-15 异常检测(Anomaly Detection) 15.3-15.4

目录 第 9 周 15、 异常检测(Anomaly Detection)15.3 算法15.4 开发和评价一个异常检测系统 第 9 周 15、 异常检测(Anomaly Detection) 15.3 算法 在本节视频中&#xff0c;我将应用高斯分布开发异常检测算法。 异常检测算法&#xff1a;对于给定的数据集 x ( 1 ) , x ( 2…

2024年短剧小程序视频解析下载

小程序下载工具我已经打包好了&#xff0c;有需要的自己下载一下 小程序下载工具链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;1234 --来自百度网盘超级会员V10的分享 1.首先解压好我给大家准备好的压缩包 2.退出微信&#xff0c;点击电脑右下角进行退出 3…

链栈--c语言实现

#include <stdio.h> #include <stdlib.h> #include <stdbool.h>// 栈节点的结构体定义 typedef struct StackNode {int data; // 数据域struct StackNode *next; // 指针域&#xff0c;指向下一个节点 } StackNode, *LinkStack;// 初始化栈 …

【保姆级教程】Linux上部署Stable Diffusion WebUI和LoRA训练,拥有你的专属图片生成模型

0 写在前面 Stable Diffusion 是当前最火热的图像生成模型之一&#xff0c;目前已经广泛应用于艺术创 作、游戏开发、设计模拟等领域&#xff0c;因其开源生态和易于使用而受到创作者的广泛关注&#xff0c;相比 Midjourney 而言&#xff0c;其最大的优势是完全免费&#xff0…

笔记1--Llama 3 超级课堂 | Llama3概述与演进历程

1、Llama 3概述 https://github.com/SmartFlowAI/Llama3-Tutorial.git 【Llama 3 五一超级课堂 | Llama3概述与演进历程】 2、Llama 3 改进点 【最新【大模型微调】大模型llama3技术全面解析 大模型应用部署 据说llama3不满足scaling law&#xff1f;】…

使用node调用chrome(基于selenium-webdriver包)

下载测试版chrome和chromedriver https://googlechromelabs.github.io/chrome-for-testing/ 把chromedriver复制到chrome的文件里 设置环境变量 编写代码 const { Builder, Browser, By, Key, until } require(selenium-webdriver) const puppeteer require(puppeteer)//查…

Modelsim自动仿真平台的搭建

Modelsim自动仿真平台的搭建 如果要搭建自动仿真平台脚本那就需要更改下面3个文件。run_simulation.bat、complie.do和wave.do文件。注&#xff1a;前提是安装了modulsim并且配置好了环境变量&#xff0c;这里不过多介绍。 一、下面是run_simulation.bat文件的内容 : 注释的…

企业计算机服务器中了devicdata勒索病毒怎么处理,devicdata解密数据恢复

网络技术的不断应用与发展&#xff0c;加快了社会进步的步伐&#xff0c;越来越多的企业利用网络开展各项工作业务&#xff0c;网络为企业提供了极大便利&#xff0c;大大提高了生产效率&#xff0c;网络数据安全问题成为了众多企业关心的主要话题。近日&#xff0c;云天数据恢…

C# Web控件与数据感应之 CheckBoxList 类

目录 关于数据感应 CheckBoxList 类 范例运行环境 数据源表设计 角色字典表 用户角色表 AutoValueDBList 方法 原理 设计 实现 调用示例 初始化数据 启动查询模式 使用保存模式 小结 关于数据感应 数据感应也即数据捆绑&#xff0c;是一种动态的&#xff0c;We…

11个2024年热门的AI编码助手

大家好&#xff0c;人工智能&#xff08;AI&#xff09;领域的大型语言模型&#xff08;LLMs&#xff09;已经逐渐发展成熟&#xff0c;并且深入到了我们日常的工作当中。在众多AI应用中&#xff0c;编码助手尤为突出&#xff0c;是开发人员编写更高效、准确无误代码的必备辅助…

C#创建obj三维模型文件

介绍 使用开源库创建obj三维模型文件。 开源库地址&#xff1a;https://github.com/JeremyAnsel/JeremyAnsel.Media.WavefrontObj 相关API地址&#xff1a;https://jeremyansel.github.io/JeremyAnsel.Media.WavefrontObj/api/JeremyAnsel.Media.WavefrontObj.ObjFile.html …

【文献阅读】 The ITS Irregular Terrain Model(Longely-Rice模型)海上电波传播模型

前言 因为最近在做海上通信的一个项目&#xff0c;所以需要对海上的信道进行建模&#xff0c;所以才阅读到了这一篇文献&#xff0c;下面的内容大部分是我的个人理解&#xff0c;如有错误&#xff0c;请见谅。欢迎在评论区和我一起讨论。 Longely-Rice模型介绍 频率介于 20 …

Redis协议与异步方式

Rredis Pipeline redis pipeline 是一个客户端提供的机制&#xff0c;而不是服务端提供的&#xff1b; pipeline 不具备事务性&#xff1b; 目的&#xff1a;节约网络传输时间&#xff1b; 通过一次发送多次请求命令&#xff0c;从而减少网络传输的时间。 Redis发布订阅 为了支…

文件传送协议

壹、文件传输协议FTP 一、FTP简介 文件传送协议FTP曾是互联网上使用最广泛的协议&#xff1b; 在互联网发展的早期阶段&#xff0c;用FTP传送文件约占整个互联网的通信量的三分之一&#xff1b;知道1995年&#xff0c;www的通信量才首次超过FTP。 FTP实现的是通过网络实现异…

删除链表中等于给定值 val 的所有结点(三种方法深入解析)

又见面啦&#xff0c;接下来的链表相关Oj题目我会根据我自己的理解来给大家讲解&#xff0c;包括解析和代码&#xff0c;希望你可以对链表有更加深入的理解&#xff01;&#xff01; 题目&#xff1a; 先上链接&#xff1a; OJ题目 给你一个链表的头节点 head 和一个整数 va…

ICode国际青少年编程竞赛- Python-1级训练场-路线规划

ICode国际青少年编程竞赛- Python-1级训练场-路线规划 1、 Dev.step(3) Dev.turnLeft() Dev.step(4)2、 Dev.step(3) Dev.turnLeft() Dev.step(3) Dev.step(-6)3、 Dev.step(-2) Dev.step(4) Dev.turnLeft() Dev.step(3)4、 Dev.step(2) Spaceship.step(2) Dev.step(3)5、…

欧拉回路(leetcode 重新安排行程)

先学习一下欧拉回路是怎么一回事。 对于图中这七个节点&#xff0c;从节点1出发&#xff0c;最终要到达节点1&#xff0c;并且每条路只能走一次&#xff0c;且每条路都得走过一次。 使用dfs&#xff0c;如果算法按照字典序的排列方式选择下一个节点。 第一部分&#xff1a;那…

VS Code 保存+格式化代码

在 VSCode 中&#xff0c;使用 Ctrl S 快捷键直接保存并格式化代码&#xff1a; 打开 VSCode 的设置界面&#xff1a;File -> Preferences -> Settings在设置界面搜索框中输入“format on save”&#xff0c;勾选“Editor: Format On Save”选项&#xff0c;表示在保存…

CUDA内存访问模式

大多数设备端数据访问都是从全局内存开始的&#xff0c;并且多数GPU应用程序容易受内存带宽的限制。因此&#xff0c;最大限度的利用全局内存带宽是调控核函数性能的基本。 对齐与合并访问 如图&#xff0c;所有的应用程序数据最初存在于DRAM上&#xff0c;也就是物理设备内存上…

【HTTP上】协议/域名/url/请求和响应/状态码/重定向

文章目录 0.应用层协议0.1HTTP协议 1.域名2.DNS3.访问浏览器4.URL搜索特殊字符如#&~ 5.万维网6.http请求和响应的格式6.1HTTP请求格式6.2HTTP响应格式6.3示例6.3模拟HTTP【框架】6.4查看请求或响应的工具FiddlerPostman 7.网页7.0对访问网页的认识7.1wget7.2新的认识7.3GET…