数据结构 --- 复杂度概念及计算讲解(时间复杂度,空间复杂度)

在这里插入图片描述
今天没有sao话,今天认真学习

一、时间复杂度

1、概念讲解

2、计算讲解

二、空间复杂度

1、概念讲解

2、计算讲解

三、常见复杂度对比

四、完结撒❀

前言:

经常刷题的人都知道,我们在解决一道题时可能有多个解法,那么如何判断那个解法才是最优解呢?
我们通常从代码的两个方面进行判断:1.时间 2.空间。
–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–

一、时间复杂度

我们通常可能会认为一个算法的实现方式越短越简洁就越好,其实不是,比如对于以下斐波那契数列:

long long Fib(int N)
{if(N < 3)return 1;return Fib(N-1) + Fib(N-2);
}

斐波那契数列的递归实现方式非常简洁,但简洁就一定好吗?那该如何衡量其好坏呢?
算法在编写为可执行程序后,运行时需要消耗时间资源和空间(内存)资源。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。

1、概念讲解

时间复杂度的定义:

在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。

从理论上来说,一个算法执行所消耗的时间是不能计算出来的,只有把代码放到机器上跑起来才能知道,而我们如果将每一个算法都进行上机测试,那么这是非常麻烦的,所以才有了时间复杂度这个分析方式。
一个算法所花费的时间与其中语句的执行次数成正比例,算法中基本操作的执行次数,为算法的时间复杂度

2、计算讲解

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

这里简单提一下大O的渐进表示法

大O符号(Big O notation):是用于描述函数渐进行为的数学符号。
推导大O阶方法:

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

下面进行举例讲解:

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

计算Func1函数的时间复杂度。
脑袋冥想调试法可以运行出来Func1函数对++count语句一共执行的次数为:

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

我们将N设置为具体数字,并且以10倍增长的方式计算F(N)的数值:
··· N=10 F(N)= 130
··· N=100 F(N)= 10210
···N=1000 F(N)= 1002010

可以看到到越大时,F(N)之间的差距会越来越微不足道,所以我们使用大O的渐进表示法去掉了那些对结果影响不大的项,得到的就是时间复杂度,那么Func1的时间复杂度为O(N^2)。

可以看成时间复杂度是按照等级来进行划分范围的,我们只需要知道函数时间复杂度的范围来判断其代码的执行是否高效就够了。

那么时间复杂度一般有这几个等级:
O(1):表示代码运行的次数为已经指定的常熟次。
O(logN):比如二分查找。
O(N):根据问题规模N的值,确定时间复杂度。
O(N+M):根据两个未知数N,M,的问题规模的值,确定时间复杂度。
O(N^2):比如冒泡排序,斐波那契递归。

这里特别强调一下:
在所给的问题规模是未知数的情况下,有些算法的时间复杂度存在最好、平均和最坏的情况

最坏情况:任意输入规模的最大运行次数(上界)
平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最小运行次数(下界)

在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)

二、空间复杂度

在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度,所以对于空间复杂度的关注没有时间复杂度那么高,甚至有时可以牺牲一些空间来换取时间上的提升

1、概念讲解

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

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

2、计算讲解

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

下面我们举讲解:

// 计算阶乘递归Fac的空间复杂度?
long long Fac(size_t N)
{if(N == 0)return 1;return Fac(N-1)*N;
}

空间复杂度主要通过函数在运行时候显式申请的额外空间来确定,所以我们需要知道Fac函数在递归过程中一共开辟了多少次空间来调用函数,学过函数栈帧的创建和销毁的同学可能一眼就看出来答案了。
我们在每一次调用函数时都会在栈区开辟一块空间,上面我们可以假设N等于10,那么Fac函数的递归在栈区中一共就会开辟10次空间进行调用,所以空间复杂度为O(N)。

三、常见复杂度对比

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

5201314O(1)

线性阶

3n+4O(n)

平方阶

3n^2+4n+5O(n^2)

对数阶

3log(2)n+4O(logn)

nlogn阶

2n+3nlog(2)n+14O(nlogn)

立方阶

n^3+2n ^2+4n+6O(n^3)

指数阶

2^nO(2^n)

四、完结撒❀

如果以上内容对你有帮助不妨点赞支持一下,以后还会分享更多编程知识,我们一起进步。
最后我想讲的是,据说点赞的都能找到漂亮女朋友
在这里插入图片描述

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

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

相关文章

【python】flask模板渲染引擎Jinja2,使得前后端交互更加便捷

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

nginx详解(持续更新)

nginx定义 nginx安装 nginx目录 程序相关命令 服务相关命令 虚拟主机&#xff08;server&#xff09; 路由匹配&#xff08;location&#xff09; 代理&#xff08;proxy_pass&#xff09; 正向代理 反向代理 负载均衡&#xff08;upstream&#xff09; 负载均衡策略 动静分…

【EPLAN】授权-MAX100.17问题解决

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决EPLAN 客户端授权连接时出现-MAX100.17 报错问题&#xff1b; 2、 问题场景 用于解决在EPLAN 客户端授权连接时&#xff0c;出现-MAX100.17 报错&#xff1a;无法建立与EPLAN Client Service[MAX 100.17] 的连…

13_Linux内核配置选项

内核配置选项 内核配置通常是对内核支持的各个功能进行取舍配置&#xff0c;将配置的方案保存到 configure文件中。在编译内核的时候&#xff0c;就会根据此配置对内核进行取舍编译。 编译内核之前要先配置。为了正确、合理地设置内核编译配置选项&#xff0c;从而只编译系统需…

前端部署到服务器,使用xshell和xftp

最近在做一个项目的时候&#xff0c;需要搭建测试环境&#xff0c;所以记录一下部署过程&#xff0c;备忘。 前台项目用到的是nuxt2&#xff0c;后台管理系统用的是vue2&#xff0c;后端用的是egg。 因为我们的后端已经在服务器上设置Nginx了&#xff0c;所以我们只需要简单的…

宜搭低代码高级认证实操题1 todolist

进行中待办 已完成待办 待办事项 待办事项远程api和变量配置 回调函数 function didFetch(content) {//console.log(content.data);// content.b 1; 修改返回数据结构中的 b 字段为1let res content.data;let todoList [];for(let i in res){todoList.push(res[i]);}consol…

本地部署大模型的几种工具(上-相关使用)

目录 前言 为什么本地部署 目前的工具 vllm 介绍 下载模型 安装vllm 运行 存在问题 chatglm.cpp 介绍 下载 安装 运行 命令行运行 webdemo运行 GPU推理 ollama 介绍 下载 运行 运行不同参数量的模型 存在问题 lmstudio 介绍 下载 使用 下载模型文件…

【Functional Affordances】机器人manipulation

文章目录 1. Robo-ABC: Affordance Generalization Beyond Categories via Semantic Correspondence for Robot Manipulation摘要和结论引言相关工作模型框架实验 2. Click to Grasp: Zero-Shot Precise Manipulation via Visual Diffusion Descriptors摘要和结论引言模型框架实…

OpenLayers基础教程——WebGLPoints图层样式的设置方法

1、前言 前一篇博客介绍了如何在OpenLayers中使用WebGLPoints加载海量数据点的方法&#xff0c;这篇博客就来介绍一下WebGLPoints图层的样式设置问题。 2、样式运算符 在VectorLayer图层中&#xff0c;我们只需要创建一个ol.style.Style对象即可&#xff0c;WebGLPoints则不…

【第三方登录】Google邮箱

登录谷歌邮箱开发者 https://console.developers.google.com/ 先创建项目 我们用的web应用 设置回调 核心主要&#xff1a; 1.创建应用 2.创建客户端ID 3.设置域名和重定向URL 4.对外公开&#xff0c;这样所有的gmail邮箱 都能参与测试PHP代码实现 引入第三方包 h…

软件著作权有哪些作用 好处

随着信息技术的迅猛发展&#xff0c;软件产业已成为全球经济增长的重要引擎。在这个背景下&#xff0c;软件著作权的重要性日益凸显。软件著作权&#xff0c;是指软件的开发者或者其他权利人依据有关著作权法律的规定&#xff0c;对于软件作品所享有的各项专有权利。那么&#…

【应用笔记】LAT1305+使用STM32+TT类型IO的注意事项

1. 概述 在 STM32 系列 MCU 中&#xff0c; 除了一些特殊管脚外&#xff0c;绝大多数管脚都可以分类为 FT (兼容5V 信号)或 TT&#xff08;兼容 3V3 信号&#xff09;类型的 IO&#xff0c;由于 MCU 内部设计的不同&#xff0c; TT IO 相比 5V IO 有更多的限制&#xff0c;下面…