【数据结构】---时间复杂度与空间复杂度

时间复杂度与空间复杂度

  • 1.📉 时间复杂度
    • 📌1.1 时间复杂度的概念
    • 1.2 大O的渐进表示法
  • 🏰空间复杂度
  • 📃例题分析
    • 1.案例(常数阶)
    • 2.案例(线性阶)
    • 3.案例:(平方阶)
    • 4.案例(平方阶)
    • 5.案例(对数阶)
    • 6.案例(递归调用)
  • ❗️总结:

在这里插入图片描述

1.📉 时间复杂度

📌1.1 时间复杂度的概念

· 时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知 道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法 的时间复杂度

1.2 大O的渐进表示法

O符号(Big O notation):是用于描述函数渐进行为的数学符号。

🔸推导大O阶方法:
1、O(1)用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中, 只保留最高阶项
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。
🔹常见时间复杂度:( 复杂度由小到大

常数阶O(1)
线性阶O(n)
对数阶O(logn)
nlogn阶O(nlogn)
平方阶O(n^2)
立方阶O(n^3)
指数阶O(2^n)

🔸大O阶的三种情况:
最坏情况:任意输入规模的最大运行次数(上界)
平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最小运行次数(下界)
:我们一般都取最坏的情况作为这个算法的时间复杂度。

🏰空间复杂度

·空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度 。
·空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。
·空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。

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

📃例题分析

1.案例(常数阶)

int fun(int n)
{int i = 0;int cnt = 0;for( i; i<100;i++){cnt++;}return cnt;
}

此时时间复杂度为O(1),这里的1不是指一次,而是常数次,该循环执行了100次,不管n多大,他都执行100次,所以是O(1)常数阶。

2.案例(线性阶)

分析下面代码复杂度

// 计算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);
}

这里的时间复杂度是O(M+N);
因为我们并不知道M和N谁大,所以我们不能舍弃任何一个。
假如:M无穷大,那么时间复杂度为O(M);反之亦然。

3.案例:(平方阶)

分析下面代码的时间复杂度

int fun(int n)
{int cnt = 0;for(int i = 0;i < n;i++){for(int j = 0; j<n; j++){cnt++; }}//两层循环,每次循环n次,因此为n*nfor(int k = 0; k<n; k++){++cnt;}//一层循环,循环n次for(int l = 0;l<10;l++){++cnt;}//一层循环,循环10次return cnt;
}

我们列出计算时间的复杂度的表达式:n*n +n +10。但是我们能写成O(N*N+N+10吗?我们知道,对于时间复杂度我们不需算出精确的数字,只需要算出这个算法属于什么量级即可,我们又如何知道它属于哪个量级呢?即,我们将字母取无穷大,例如本题中字母为n,n取无穷大,而十对于n取无穷大后没有影响,因此10可以舍去,原表达式化为nn+n,再转化为n(n+1),由于n为无穷大,因此-1也是没有影响的,原式就变成了O(N*N)=O(N^2)
📌 在这里我们使用大O渐近表示法,只是一种量级的估算,而不是准确的值。

4.案例(平方阶)

分析冒泡排序的时间复杂度

void bubblesort(int* a,int n)
{assert(a);
for(int end = n; end>0; end--){int exchange = 0;for(int i = 1; i<end; i++){if(a[i-1]>a[i]){swap(&a[i],&a[i-1]);exchange = 1;}}if(exchange==0)break;}
}

在这个冒泡排序中,我们需要将无序数组转化为有序数组的一种算法,它并不是简单的双层嵌套循环,很容易想到它的循环次数是一个等差数列,第一次循环n-1次,第二次n-2次…一直到1.因此为n-1+n-2+n-3…+1 =·n*(n-1)/2,使用大O表示,去掉影响不大的项,简化为: 时间复杂度为O(N*N)

5.案例(对数阶)

二分查找

int binary(int n, int a[], int k) 
{int left = 0, right = n - 1;while(l <= r) {mid = (l + r)/2;if(a[mid] == k) return mid;else if(a[mid] < k)right = mid + 1;elseleft = mid + 1;}return -1;
}

eft和right指数组最左边和最右边的下标.每次将这个数组砍一半,求出mid中间下标. 由于是升序排列,如果中间下标代表的数大于给定的数k,那么k必定在中间下标的左边. 那么就将mid+1的值赋给right,反之则将mid+1的值赋给left,每次将数组砍一半直到找到数k为止.
也就是每次除二。2^n=N -> n=logN;

6.案例(递归调用)

斐波那契函数

long long Fac(size_t N)
{if(N == 0)return 1;return Fac(N-1)*N;
}

推到知道,这个函数会不停的向下调用,呈金字塔型,虽然运算量非常大,但是我们在算时间复杂度时要关注代码的思想,而不是看它的次数等。 递归函数的时间复杂度是多次用的次数的累加
空间复杂度:根据调用的次数,每次都会占用栈上的空间,所以间复杂度为O(N);

❗️总结:

不管是算时间复杂度,还是空间复杂度。我们都要根据代码的思想,探求程序运行的过程,来思考复杂度。不能片面的根据数量,次数的多少来算。

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

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

相关文章

css元素定位:通过元素的标签或者元素的id、class属性定位

前言 大部分人在使用selenium定位元素时&#xff0c;用的是xpath元素定位方式&#xff0c;因为xpath元素定位方式基本能解决定位的需求。xpath元素定位方式更直观&#xff0c;更好理解一些。 css元素定位方式往往被忽略掉了&#xff0c;其实css元素定位方式也有它的价值&…

【数据库 - 用户权限管理】(简略)

目录 一、概述 二、用户权限类型 1.ALL PRIVILEGES 2.CREATE 3.DROP 4.SELECT 5.INSERT 6.UPDATE 7.DELETE 8.INDEX 9.ALTER 10.CREATE VIEW和CREATE ROUTINE 11.SHUTDOWN 12GRANT OPTION 三、语句格式 1.用户赋权 2.权限删除 3.用户删除 一、概述 数据库用…

Redis多级缓存

文章目录 多级缓存背景JVM进程缓存Caffeine案例分析安装MySQL导入SQL Lua语法变量与循环数据类型声明变量循环 函数与条件控制函数条件控制 实现多级缓存安装OpenResty安装opm工具目录结构配置Nginx的环境变量运行启动 快速入门反向代理流程OpenResty监听请求编写item.lua 请求…

基于深度学习的高精度交通信号灯检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度交通信号灯检测识别可用于日常生活中检测与定位交通信号灯目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的交通信号灯目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检…

站在读者角度:10个技巧写出有价值的文章

站在读者的角度&#xff0c;以下是10个写出有价值的文章的技巧&#xff1a; 1.确定你的目标读者&#xff1a;在开始写作之前&#xff0c;确定你的目标读者是谁&#xff0c;这有助于你更好地针对他们的需求和兴趣来写作。 2.了解你的读者&#xff1a;通过调查、研究和互动&…

LeetCode每日一题-接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表…

Spring中事务失效的8中场景

1. 数据库引擎不支持事务 这里以 MySQL为例&#xff0c;MyISAM引擎是不支持事务操作的&#xff0c;一般要支持事务都会使用InnoDB引擎&#xff0c;根据MySQL 的官方文档说明&#xff0c;从MySQL 5.5.5 开始的默认存储引擎是 InnoDB&#xff0c;之前默认的都是 MyISAM&#xff…

Python in VS Code 2023年7月发布|Mypy 扩展预览版与调试扩展、Pylance 本地化及其他

排版&#xff1a;Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展将于 2023 年 7 月发布&#xff01; 此版本包括以下更新&#xff1a; Mypy 扩展预览版预览版中的调试扩展Pylance 本地化使用 Pylance 的第三方库的索引持久性即将弃用 Python 3.7 支…

分享5款有点冷门的实用派软件

​ 分享5款冷门但值得下载的Windows软件&#xff0c;个个都是实用&#xff0c;你可能一个都没见过&#xff0c;但是 我觉得你用过之后可能就再也离不开了。 系统监控——XMeters ​ XMeters是一个系统监控软件&#xff0c;可以让你在任务栏上显示各种系统信息&#xff0c;如C…

C# List 详解三

目录 11.Equals(Object) 12.Exists(Predicate) 13.Find(Predicate) 14.FindAll(Predicate) 15.FindIndex(Int32, Int32, Predicate) 16.FindIndex(Int32, Predicate) 17.FindIndex(Predicate) C# List 详解一 1.Add(T)&#xff0c;2.AddRa…

探秘MySQL底层架构:设计与实现流程

前言 Mysql&#xff0c;作为一款优秀而广泛使用的数据库管理系统&#xff0c;对于众多Java工程师来说&#xff0c;几乎是日常开发中必不可少的一环。无论是存储海量数据&#xff0c;还是高效地检索和管理数据&#xff0c;Mysql都扮演着重要的角色。然而&#xff0c;除了使用My…

【JAVA】 String 方法附件

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 文章目录 String 方法 String 方法 char charAt(int index)返回指定索引处的 char 值。int compareTo(Object o) 把这个字符串和另一个对象比较。 int compareTo(String anotherString)按…

基于Jquery EasyUI JSZip FileSaver的简单使用

一、前言 在前端的项目开发中 &#xff0c;下载文件压缩包是很重要的一个环节&#xff0c;那么怎么下载多个文件并压缩成ZIP下载呢&#xff1f; 二、使用步骤 1、引用库 <script type"text/javascript" src"~/Scripts/comm/jszip.min.js" ></…

C# WPF项目创建(基于VS 2019介绍)

1.打开VS&#xff0c;选择《创建新项目》 2.选择《WPF应用》&#xff0c;这里设计两个有.NET Framework框架和.NET core 框架&#xff0c;如图所示&#xff1a; 区别&#xff1a; .NET Framework 框架只能在windows下使用 .NET core 框架支持linux 下运行 3. 项目名称根据需…

【C++】入门 --- 缺省参数函数重载

文章目录 &#x1f96e;一、缺省参数&#x1f355;1、基本概念&#x1f355;2、缺省参数的分类&#x1f6a9;全缺省参数&#x1f6a9;半缺省参数&#x1f6a9;缺省参数实用案例 &#x1f96e;二、函数重载&#x1f355;1、函数重载概念1️⃣参数类型不同2️⃣参数个数不同3️⃣…

Canal安装部署与测试

文章目录 第一章 Canal概述1.1 简介1.2 工作原理1.2.1 MySQL主备复制原理1.2.2 canal 工作原理 1.3 重要版本更新说明1.4 多语言 第二章 Canal安装部署2.1 准备2.2 canal安装 第三章 Canal和Kafka整合测试注意事项 第一章 Canal概述 Github地址&#xff1a;https://github.com…

使用goldengate 迁移Oracle到postgresql

环境&#xff1a; --源端&#xff1a; IP&#xff1a;10.0.4.16 hostname&#xff1a;tencent Oracle数据库版本&#xff1a;12.2.0.1.0 ogg for oracle版本&#xff1a;19.1.0.0.4 SID&#xff1a;orcl --目标端&#xff1a; IP&#xff1a;10.0.4.16 hostname&#…

ES6基础知识三:对象新增了哪些扩展?

一、属性的简写 ES6中&#xff0c;当对象键名与对应值名相等的时候&#xff0c;可以进行简写 const baz {foo:foo}// 等同于 const baz {foo}方法也能够进行简写 const o {method() {return "Hello!";} };// 等同于const o {method: function() {return "…

【MATLAB绘图】

MATLAB绘图函数&#xff1a;Plot函数详解 介绍 MATLAB是一种常用的科学计算和数据可视化工具&#xff0c;它提供了强大的绘图函数&#xff0c;使用户能够创建各种类型的图表和图形。 基本语法 plot函数的基本语法如下&#xff1a; plot(x, y)其中&#xff0c;x和y是长度相…

第八次CCF计算机软件能力认证

第一题&#xff1a;最大波动 小明正在利用股票的波动程度来研究股票。 小明拿到了一只股票每天收盘时的价格&#xff0c;他想知道&#xff0c;这只股票连续几天的最大波动值是多少&#xff0c;即在这几天中某天收盘价格与前一天收盘价格之差的绝对值最大是多少。 输入格式 输入…