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

在这里插入图片描述
今天没有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)

四、完结撒❀

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

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

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

相关文章

1、Java虚拟机学习-类的生命周期-加载阶段-以及怎样查看方法区中的对象和堆中对象的关联以及静态变量存在什么地方

类的生命周期 其中连接又可以分为3个小阶段 一、加载阶段 1、加载阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。 渠道: 2、类加载器在加载完类之后&#xff0c;Java虚拟机会将字节码中的信息保存在内存的方法区中。 方法区是虚拟…

HarmonyOS NEXT应用开发—投票动效实现案例

介绍 本示例介绍使用绘制组件中的Polygon组件配合使用显式动画以及borderRadius实现投票pk组件。 效果预览图 使用说明 加载完成后会有一个胶囊块被切割成两个等大的图形来作为投票的两个选项&#xff0c;中间由PK两字分隔开点击左边选项&#xff0c;两个图形会随着选择人数…

Http 超文本传输协议基本概念学习摘录

目录 HTTP协议 超文本传输协议 HyperText超文本 HTML超文本标记语言 HTTP协议原理 请求发送 服务器处理 响应发送 连接关闭或保持 HTTP协议版本 HTTP/0.9 HTTP/1.0 HTTP/1.1 HTTP/2 HTTP/3 HTTP请求方法 GET POST PUT DELETE HEAD OPTIONS HTTP请求头字…

MQTT学习从零到实战:二

本次基于MQTT实现的服务器之一&#xff1a;EMQX 协议版本&#xff1a;5.0 文档路径&#xff1a;快速开始 | EMQX 5.0 文档 MQTT协议服务器搭建 本次使用的服务器是EMQX。 下载地址&#xff1a;立即开始 | EMQX 从中我们也可以看出&#xff0c;企业版支持数据持久化&#xf…

springboot+template模板语法+SQL如何从零开始创建并运行一个实例

目录 一、创建springboot项目 二、启动程序测试一下&#xff0c;右上角点击运行&#xff1a; 三、代码编写 1、先在entity里写一个实体类&#xff0c;User&#xff1a; 2、写一个mapper接口&#xff0c;写四个接口&#xff0c;增删改查。&#xff08;我这里后面就以获取所…

蓝桥杯每日一题——棋盘

问题描述 小蓝拥有 n xn 大小的棋盘&#xff0c;一开始棋盘上全都是白子。小蓝进行了 m 次操作&#xff0c;每次操作会将棋盘上某个范围内的所有棋子的颜色取反(也就是白色棋子变为黑色&#xff0c;黑色棋子变为白色)请输出所有操作做完后棋盘上每个棋子的颜色。输入格式 输入的…

3.14_理解专业术语_3.18

分布式电源 风能、太阳能、生物质能等新能源的应用&#xff0c;有很大部分是分散式的&#xff0c;且容量较小。这些分散布置在电力负荷附近的、容量在数千瓦至数十兆瓦之间的、为环境兼容的、节能的发电装置&#xff0c;如燃气轮机、内燃机、小型光伏发电站、燃料电池、风力发电…

Docker知识--01

虚拟化 # 什么是虚拟化 在计算机中&#xff0c;虚拟化&#xff08;英语&#xff1a;Virtualization&#xff09;是一种资源管理技术&#xff0c;是将计算机的各种实体资源&#xff0c;如服务器、网络、内存及存储等&#xff0c;予以抽象、转换后呈现出来&#xff0c;打…

【计算机网络】IP 协议

网络层IP协议 一、认识 IP 地址二、IP 协议报头格式三、网段划分1. 初识子网划分2. 理解子网划分3. 子网掩码4. 特殊的 IP 地址5. IP 地址的数量限制6. 私有 IP 地址和公网 IP 地址7. 理解全球网络&#xff08;1&#xff09;理解公网&#xff08;2&#xff09;理解私网&#xf…

C语言---指针的两个运算符:点和箭头

目录 点&#xff08;.&#xff09;运算符箭头&#xff08;->&#xff09;运算符需要注意实际例子 C语言中的指针是一种特殊的变量&#xff0c;它存储了一个内存地址。点&#xff08;.&#xff09;和箭头&#xff08;->&#xff09;是用于访问结构体和联合体成员的运算符。…

[LeetBook]【学习日记】排序算法——归并排序

主要思想 归并排序是一种分治算法&#xff0c;其排序过程包括分和治分是指将要排序的序列一分为二、二分为四&#xff0c;直到单个序列中只有一个数治是指在分完后&#xff0c;将每两个元素重新组合&#xff0c;四合为二、二合为一&#xff0c;最终完成排序 图片作者&#xf…

SkiaSharp使用SKCanvas.DrawText绘制2D文本时部分字符渲染位置异常。

Skia是一个开源的 2D 图形库&#xff0c;支持多种平台和语言&#xff0c;可以用于绘制各种图形和效果&#xff0c;SkiaSharp是其.Net版本。 在绘制文本时&#xff0c;一般做法是&#xff1a; private void SkContainer_PaintSurface(object? sender, SkiaSharp.Views.Deskto…

Linux系统安装宝塔面板结合内网穿透实现公网登录本地面板——“cpolar内网穿透”

文章目录 一、使用官网一键安装命令安装宝塔二、简单配置宝塔&#xff0c;内网穿透三、使用固定公网地址访问宝塔 宝塔面板作为建站运维工具&#xff0c;适合新手&#xff0c;简单好用。当我们在家里/公司搭建了宝塔&#xff0c;没有公网IP&#xff0c;但是想要在外也可以访问内…

Midjourney 和 Dall-E 的优劣势比较

Midjourney 和 Dall-E 的优劣势比较 Midjourney 和 Dall-E 都是强大的 AI 绘画工具&#xff0c;可以根据文本描述生成图像。 它们都使用深度学习模型来理解文本并将其转换为图像。 但是&#xff0c;它们在功能、可用性和成本方面存在一些差异。 Midjourney 优势: 可以生成更…

攻防世界新手模式例题(Web)

PHP2 首先我们查看页面&#xff0c;查看前端代码 发现均没有什么有效信息&#xff0c;由题目可知&#xff0c;此问题与php相关&#xff0c;于是我们可以看一下他的index.php文件 查看时用?index.phps 补充知识&#xff1a;phps文件就是php的源代码文件&#xff0c;通常用于…

算法之位运算

常见的位运算操作: 首先先熟悉一下常见的位运算操作: 1. 基础位运算 左移<<, 右移>>, 按位与&, 按位或|, 按位异或^, 按位取反~ 注意: 异或其实是一种无进位相加. 2. 给定一个 n, 确定它的二进制表示中第x位是 0 还是 1 n & (1<<x) 或者 (n>…

消费者组大观:5种状态,1场分布式奇迹

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 消费者组大观&#xff1a;5种状态&#xff0c;1场分布式奇迹 前言EmptyDead状态处理 Dead 状态的策略&#xff1a;防范和恢复&#xff1a; PreparingRebalance处理 "PreparingRebalance" 状…

【Leetcode-102.二叉树的层序遍历】

题目详情&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示例…

Linux软件管理(1)

软件管理 下载 wget Linux wget是一个下载文件的工具&#xff0c;它用在命令行下。 wget工具体积小但功能完善&#xff0c;它支持断点下载功能&#xff0c;同时支持FTP和HTTP下载方式&#xff0c;支持代理服务器和设置起来方便简单。 1.语法 wget [选项]……[URL]…… 2、…

React - 实现菜单栏滚动

简介 本文将会基于react实现滚动菜单栏功能。 技术实现 实现效果 点击菜单&#xff0c;内容区域会自动滚动到对应卡片。内容区域滑动&#xff0c;指定菜单栏会被选中。 ScrollMenu.js import {useRef, useState} from "react"; import ./ScrollMenu.css;export co…