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

时间复杂度与空间复杂度

  • 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目标检…

AI > 语音识别开源项目列举

名称所属开发机构使用场景优缺点技术特点占有率描述CMU Sphinx卡内基梅隆大学嵌入式设备、服务器应用优点&#xff1a;可用于嵌入式设备和服务器应用。 缺点&#xff1a;准确率相对较低&#xff0c;适用范围有限。- 支持多种语言模型和工具。- 适用于嵌入式设备和服务器应用。中…

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

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

Unity UGUI的EventSystem(事件系统)组件的介绍及使用

Unity UGUI的EventSystem&#xff08;事件系统&#xff09;组件的介绍及使用 1. 什么是EventSystem组件&#xff1f; EventSystem是Unity UGUI中的一个重要组件&#xff0c;用于处理用户输入事件&#xff0c;如点击、拖拽、滚动等。它负责将用户输入事件传递给合适的UI元素&a…

【LeetCode】78.子集

题目 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2],[1…

vue实现@唤起列表功能(借助ElAutocomplete)

实现一个输入组件 myAutoComplete.vue <template><el-autocomplete ref"autoRef" :model-value"state" input"handleInput" :onkeyup"handleKey":fetch-suggestions"querySearch" select"handleSelect" …

Spring动态代理

一、代理 代理&#xff08;Proxy&#xff09;是一种设计模式&#xff0c;提供了对目标对象的另外的访问方式。 代理意义&#xff1a;可以再目标对象代码实现的基础上&#xff0c;增强额外的功能代码。 二、静态代理 静态代理&#xff0c;编译时就已经确定下来了接口代理类被…

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…

15 | 线性回归代码实现

文章目录 线性回归实现Lasso回归和岭回归多项式回归线性回归实现 线性回归是处理一个或者多个自变量和因变量之间的关系,然后进行建模的一种回归分析方法。如果只有一个自变量的情况称为一元线性回归,如果有两个或两个以上的自变量,就称为多元回归。在sklearn中linear_mode…

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

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

WPF实战学习笔记05-首页界面

首页界面 新建文件 添加文件&#xff3b;类型&#xff1a;用户控件&#xff3d; ./Common/Models/TaskBars.cs ./Common/Models/ToDoDto.cs ./Common/Models/MemoDto.cs 新建类 TaskBars.cs using System; using System.Collections.Generic; using System.Linq; using Sy…

【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" ></…