【数据结构】时间复杂度与空间复杂度
目录
时间复杂度
空间复杂度
时间复杂度
算法的时间复杂度并不是指一个代码运行时间的快慢,因为在不同机器上运行的时间肯定不同,因此算法的时间复杂度指的是基本操作的执行次数,他是一个数学意义上的函数。这个函数并不是C语言中那种函数,而是一个数学函数,比如
显然是执行了N方+2N+10次,这个N方假设我们说他是F(N),也就是一个数学函数,那么这个F(N)就是上面这个算法的时间复杂度。但是实际上我们并不一定要计算精确的执行次数,而只需要大概执行次数,因为当N足够大的时候,F(N)的大小主要是由N方决定了,因此我们就可以用N方来近似这个表达式的值。 我们可以使用大O的渐进表示法。
大O渐进表示法的规则如下:
1、用常数1取代运行时间中的所有加法常数。比如要运行一万次是O(1),一亿次也是写作O(1),这是因为CPU的功能很强大,对于我们能写出来的这些常数,在CPU看来都一样,都是瞬间搞定。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。换句话说如果保留的最高阶数系数不是1,通通都写成系数是1,也就是说不管最终决定运算次数的项是2N,3N,1000N,使用大O渐进表示法都写作O(N),如果最后算出来运算次数是2的n-1次方,n-2次方等等,那么时间复杂度是O(2^n)
4.有些算法的时间复杂度存在最好、平均和最坏情况:最坏情况:任意输入规模的最大运行次数(上界)平均情况:任意输入规模的期望运行次数最好情况:任意输入规模的最小运行次数(下界)例如:在一个长度为N数组中搜索一个数据x最好情况:1次找到最坏情况:N次找到平均情况:N/2次找到。在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)
下面来计算一下冒泡排序的时间复杂度
执行的次数也就是for循环一共循环了多少次,可以看到第一次要比较n-1个,第二次要比较n-2个,第n-1次要比较1个,一共执行的次数就是这些全加起来,等差数列求和,因此一共是n(n-1)/2,最高次数是2次方,虽然有系数二分之一,但是要忽略掉,因此他的时间复杂度是O(n方)
注:只是在本例中执行次数就是循环次数,并不是说所有代码的执行次数都是循环次数
计算二分查找的时间复杂度
二分查找的思想就是一次去掉一半,实际上有可能是一次找到了,也有可能是找到剩下最后一个了也没找到,要计算复杂度,我们就要考虑最坏情况,最坏情况就是找到了剩下最后一个元素,这就是最后一次,不管最后剩下的这个元素是不是我们要找的元素,都不会再执行了,假设有n个数,找了x次最后剩下一个了,实际上x就是复杂度,那么x能不能用已知条件表示呢?N除了x个2变成了1,换句话说1乘上x个2也就是2的x次方等于n,x也就是以二为底n的对数,因此二分查找的时间复杂度是以二为底n的对数。
阶乘递归的时间复杂度
第一次调用Fac(N),而Fac(N)又会调用Fac(N-1),以此类推直到Fac(1)调用Fac(0),就开始一直返回了,因此实际基本语句执行了N+1次,时间复杂度是O(N)
把代码稍作修改,这次时间复杂度是多少?
仍然是Fac(N)调用Fac(N-1),Fac(N-1)调用Fac(N-2)以此类推直到Fac(1)调用Fac(0),但是在每次调用之前都有一个循环语句,在Fac(N)里执行了N次,在Fac(N-1)里执行了n-1次......在Fac(1)里执行了1次,因此基本操作一共执行了N(N+1)/2次,所以时间复杂度是O(N方)
计算斐波那契递归的时间复杂度
一生二,二生四,直到调用参数是2或者1的时候才可以返回值,因此右边的会先开始返回值,左边的后返回,最终形状大概是缺一块的三角形
形状类似这样
假设是一个满的三角形,那么最终应该有2的零次方一直加到2的N-2次方,这样一个等比数列求和,结果是2的N-1次方-1,实际上没有什么多项,还应该减去这个灰色的三角形,但是当N足够大的时候,实际上这个灰色三角形非常的小,可以忽略不计,因为复杂度考虑的是量级,是一个大约的数,因此我们就用这个完整三角形形状的个数来表示,因此斐波那契递归的时间复杂度是O(2^N)
空间复杂度
空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度, 空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。
注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。
计算冒泡排序的空间复杂度
在冒泡排序中,为了给传给我们的数组排序而额外创建的变量就只有end,exchange,i等等,也就是常数个,因此冒泡排序的空间复杂度是O(1)
创建了n+1个变量,因此空间复杂度是n+1,写作O(n+1),可能疑问就是这不是开辟了能放n+1个long long类型的空间吗,怎么就开辟变量了,这虽然是个指针,指针变量的名字实际上就相当于一个数组名,申请空间相当于是创建了一个数组,我可以使用[]操作符来访问这块空间的元素,比如fibArray[1]就访问了第二个元素,这不就是创建变量吗?
实际上我们在求空间复杂度的时候没有必要每次都紧扣定义创建的变量个数,一般来说就是关注开辟的空间能放多少个变量。
Fac(N)会调用Fac(N-1)以此类对直到Fac(1)调用Fac(0),一共调用了N+1次,每次里面创建了常数个变量,因此空间复杂度是O(N)
在上面计算过Fib的时间复杂度是O(2^N),也就是说执行了这个量级次基本操作,而每次基本操作创建的变量都是常数个,那是不是说Fib的空间复杂度也是O(2^N)呢?首先说答案:不是。在计算时间复杂度和空间复杂度的时候,我们应该遵循时间是一去不复返的,空间是可以重复利用的。
什么叫空间可以重复利用呢?
首先来说重复利用并不是共用,因为在调用完某个函数的时候,为他申请的栈帧就随之销毁了,何谈共用?
比如有这样一段代码
我们发现这两个变量的地址是相同的,这是因为我们在主函数里面调用了这两个函数,先调用Func1,于是为他开辟了一块栈帧,里面有变量a
Func1调用完成之后,为他开辟的栈帧就被换给了操作系统,俗称栈帧被销毁,然后就开始调用Func2,也要为他开辟一块栈帧,前面通过打印地址我们知道这两个变量的地址是相同的,也就是说为Func2开辟的栈帧也是同一块。这就是空间的重复利用。
再回到Fib函数的空间复杂度计算
假设我们刚上来调用的是Fib(5)
计算这种递归函数的空间复杂度主要就是考虑开辟的栈帧是什么情况,比如我们刚上来调用的是Fib(5),Fib(5)为了得到返回值,就要调用Fib(4)和Fib(3),那问题来了,先后给Fib(4)和Fib(3)开辟栈帧吗?当然不是,先调用的是Fib(4),Fib(4)都还没返回呢,那必然不能调用Fib(3),那就不能为Fib(3)开辟栈帧,而是继续执行Fib(4),而Fib(4)会调用Fib(3)和Fib(2),先调用的是Fib(3),Fib(3)为了得到返回值就会调用Fib(2)和Fib(1),先调用的是Fib(2),此时有返回值了,在返回之后为Fib(2)申请的这快栈帧就可以还给操作系统了,有了返回值Fib(2)就算执行完了,那就可以接着调用Fib(1),从而又要为Fib(1)开辟一块栈帧,这块栈帧和刚才Fib(2)申请的那块是同一块,也能得到一个返回值并把这块栈帧销毁,这样Fib(3)就有值了,就能调用倒数第二行的Fib(2)了,于是为他申请一块栈帧,这快栈帧和刚才调用完Fib(3)被销毁的那块是同一块栈帧,以此类推,最终实际上就只申请了4块栈帧。
于是调用Fib(N)就申请了N-1块栈帧,因为同层的都在重复利用同一块空间,因此Fib的空间复杂度是O(N)。
相关文章:
【数据结构】时间复杂度与空间复杂度
目录 时间复杂度 空间复杂度 时间复杂度 算法的时间复杂度并不是指一个代码运行时间的快慢,因为在不同机器上运行的时间肯定不同,因此算法的时间复杂度指的是基本操作的执行次数,他是一个数学意义上的函数。这个函数并不是C语言中那种函数&…...
分别使用js与jquery写 单击按钮时出现内容 点击删除按钮不会再向下出现
HTML部分 <body><button id"btn">单击我</button><button id"delAll">删除所有事件</button><div id"test"></div> </bady>jQuery代码 <script type"text/JavaScript" src"…...
【Git】Git命令的学习与总结
本文实践于 Learn Git Branching 这个有趣的 Git 学习网站。在该网站,可以使用 show command 命令展示所有可用命令。你也可以直接访问网站的sandbox,自由发挥。 一、本地篇 基础篇 git commit git commit将暂存区(staging areaÿ…...
前端工程化面试题 | 18.精选前端工程化高频面试题
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
大公司的工程师是怎么废掉的...
大家好,我是砖一。 此文作者以嵌入式工程师为基本视角,细说了从初阶到高阶工程师的资质需求,并提示工程师职业道路上的陷阱。可供参考。 一,基础知识 一个嵌入式工程师,很多都是从51单片机或者STM32单片机开始&…...
将yolov8权重文件转为onnx格式并在c#中使用
yolo模型转ONNX 在yolov8中,我们将训练结果的.pt权重文件转换为onnx格式只需要使用ultralytics库中的YOLO类,使用pip安装ultralytics库,然后执行下面python代码 from ultralytics import YOLO# 加载YOLOv8模型 model YOLO("best.pt&q…...
在Spring Boot启动时禁止自动配置数据源相关的组件、@SpringBootApplication
一、SpringBootApplication(exclude {DataSourceAutoConfiguration.class})注解 在Spring Boot启动时禁止自动配置数据源相关的组件。 SpringBootApplication(exclude {DataSourceAutoConfiguration.class})注解的使用案例 这个注解通常应该写在微服务项目的主启动类上&…...
程序人生:不积跬步无以致千里
程序人生 癸卯年冬月,往渭南韩城,拜访司马迁祠。入门攀爬而上,至人有困乏之时,抬头现:高山仰止。归路下山,始现三官洞,遥想西汉时三官洞,出口处刻意再拜别:高山仰止。泪…...
通过二叉树例题深入理解递归问题
目录 引入: 例1:二叉树的前序遍历: 例2: N叉树的前序遍历: 例3:二叉树的最大深度: 例4:二叉树的最小深度 例5:N叉树的最大深度: 例6:左叶子…...
【Android 协程常见用法】
我们这里只讲解一下,协程在Android项目中常见用法,原理知识不在进行说明了。 依赖 lifecycleScope只能在Activity、Fragment中使用,会绑定Activity和Fragment的生命周期。依赖库: implementation androidx.lifecycle:lifecycle…...
python 进程笔记一 (概念+示例代码)
1. 进程的概念 进程是资源分配的最小单位,也是线程的容器,线程(python 线程 (概念示例代码))是CPU调度的基本单位,一个进程包括多个线程。 程序:例如xxx.py是一个程序 进程…...
各中间件数据库默认访问端口总结
说明 在生态丰富的开发环境下,我们常常需要接触很多中间件产品,中间件默认的连接端口以及可视化ui访问端口也时不时的需要用到,这里循序渐进做好登记,以备查阅! 中间件/数据库名称默认端口管理台端口默认账号密码rabbi…...
鲲鹏arm64架构下安装KubeSphere
鲲鹏arm64架构下安装KubeSphere 官方参考文档: https://kubesphere.io/zh/docs/quick-start/minimal-kubesphere-on-k8s/ 在Kubernetes基础上最小化安装 KubeSphere 前提条件 官方参考文档: https://kubesphere.io/zh/docs/installing-on-kubernetes/introduction/prerequi…...
python 函数-02-返回值注释格式
01 函数返回值 1)python中函数可以没有返回值,也可以有通过return的方式 – 【特殊性,区别于java c#等】 2)返回值可以是一个或者多个,多个时通过逗号隔开 – 【特殊性,区别于java c#等】 3)多…...
【前端素材】推荐优质后台管理系统Upcube平台模板(附源码)
一、需求分析 后台管理系统在多个层次上提供了丰富的功能和细致的管理手段,帮助管理员轻松管理和控制系统的各个方面。其灵活性和可扩展性使得后台管理系统成为各种网站、应用程序和系统不可或缺的管理工具。 当我们从多个层次来详细分析后台管理系统时࿰…...
可视化 RAG 数据 — 用于检索增强生成的 EDA
原文地址:Visualize your RAG Data — EDA for Retrieval-Augmented Generation 2024 年 2 月 8 日 Github:https://github.com/Renumics/rag-demo/blob/main/notebooks/visualize_rag_tutorial.ipynb 为探索Spotlight中的数据,我们使用Pa…...
数学建模论文、代码百度网盘链接
1.[2018中国大数据年终总决赛冠军] 金融市场板块划分与轮动规律挖掘与可视化问题 2.[2019第九届MathorCup数模二等奖] 数据驱动的城市轨道交通网络优化策略 3.[2019电工杯一等奖] 露天停车场停车位的优化设计 4.[2019数学中国网络数模一等奖] 基于机器学习的保险业数字化变革…...
mysql 迁移-data目录拷贝方式
背景:从服务器进水坏掉,50多G的数据库要重新做主从,但以导入导出的方式太慢,简直是灾难性的,一夜都没好,只好想到了拷贝mysql数据文件的方式 拷贝的数据文件的前提 1.数据库版本必需一致(可以…...
学习 LangChain 的 Passing data through
学习 LangChain 的 Passing data through 1. Passing data through2. 示例 1. Passing data through RunnablePassthrough 允许不改变或添加额外的键来传递输入。这通常与 RunnableParallel 结合使用,将数据分配给映射中的新键。 RunnablePassthrough() 单独调用&…...
C# OpenVINO PaddleSeg实时人像抠图PP-MattingV2
目录 效果 项目 代码 下载 C# OpenVINO 百度PaddleSeg实时人像抠图PP-MattingV2 效果 项目 代码 using OpenCvSharp; using Sdcb.OpenVINO; using System; using System.Diagnostics; using System.Drawing; using System.Security.Cryptography; using System.Text; us…...
【Android 11】AOSP Settings WIFI随机MAC地址功能
AOSP Settings WIFI随机MAC地址功能 背景 最近客户提出了想要实现随机WIFIMAC地址的功能(我们默认WIFI的MAC地址是固定的)。网上搜到了一篇不错的文章,本次改动也是基于这个来写的。 由于客户指定使用的settings是AOSP的,所以在…...
dmrman备份还原
脱机还原工具-dmrman 前言 根据达梦官网文档整理 一、概述 DMRMAN 命令行设置参数执行又可分为命令行指定脚本、命令行指定语句两种执行方式。 指定语句 $ DMRMAN RMAN>BACKUP DATABASE/dmdata/data/DAMENG/dm.ini;指定脚本 创建一个名为 cmd_file.txt 的文件&#x…...
网页403错误(Spring Security报异常 Encoded password does not look like BCrypt)
这个错误通常表现为"403 Forbidden"或"HTTP Status 403",它指的是访问资源被服务器理解但拒绝授权。换句话说,服务器可以理解你请求看到的页面,但它拒绝给你权限。 也就是说很可能测试给定的参数有问题,后端…...
单细胞多组学整合与对齐的计算方法
Computational Methods for Single-cell Multi-omics Integration and Alignment Bioinformatics-2022-密西根大学 关键词:单细胞;多组学;机器学习;无监督学习;集成 摘要 最近发展起来的生成单细胞基因组数据的技术在生物学领域产生了革命性的影响。多组学测定提…...
33.openeuler OECA认证模拟题16
一 、选择题 1.如何查看系统支持的 shell? A、cat /etc/passwd B、cat /etc/shells C、echo SSHELL D、echo $0 答案 :B 2.下列哪项不是 shell的功能? A 、 用户界面,提供用户与内核交互接口 B 、 命令解释器 C 、提供编译环境 D 、 提供各种管理工具,…...
javaScript数组去重的几种实现方式——适用非引用数据去重
最传统的使用循环遍历 //最传统的使用循环遍历 function getUnique(arr) {let newArr [];for (let i 0; i < arr.length; i) {for (let j i 1; j < arr.length; j) {if (arr[i] arr[j]) {i; //相同丢掉前面的元素}}newArr.push(arr[i]);}return newArr; } 利用Set实…...
Nexus Repository Manager
Nexus Repository Manager https://s01.oss.sonatype.org/#welcome https://mvnrepository.com/-CSDN博客...
Python世界之运算符
一、算术运算符 以下假设变量: a10,b20: 运算符 描述 实例 加 - 两个对象相加 a b 输出结果 30 - 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -10 * 乘 - 两个数相乘或是返回一个被重复若干次的字符串 a * b 输出结…...
蓝桥杯倒计时47天!DFS基础——图的遍历
倒计时47天! 深度优先搜索——DFS 温馨提示:学习dfs之前最好先了解一下递归的思想。 DFS基础——图的遍历 仙境诅咒 问题描述 在一片神秘的仙境中,有N位修仙者,他们各自在仙境中独立修炼,拥有自己独特的修炼之道…...
体验LobeChat搭建私人聊天应用
LobeChat是什么 LobeChat 是开源的高性能聊天机器人框架,支持语音合成、多模态、可扩展的(Function Call)插件系统。支持一键免费部署私人 ChatGPT/LLM 网页应用程序。 地址:https://github.com/lobehub/lobe-chat 为什么要用Lobe…...
做视频网站每部电影都要版权/百度怎么提交收录
GroupBy是个Collector,它是用来进行Stream上的collect操作的。Collect是一个Mutable Reduction。所谓reduction,相当于把集合里的每一个元素依次带入一个函数,最终得到一个值。比如求一组int的和,可以用reduction写作。int sum n…...
大连企业制作网站/宁波网站推广运营公司
在注册谷歌账号时验证手机号码可能会出现 - 此电话号码无法用于进行验证 的情况如下图所示: 出现这种情况很容易解决,下面跟着鬼鬼一起做吧(注册Google账户时要全程开着tz,本教程也不例外): 解决方法&…...
甘肃住房和城乡建设局网站/百度百科推广费用
原地址:http://blog.csdn.net/u012085988/article/details/17531005 资源下载:http://download.csdn.net/detail/u012085988/6770625 (最近csdn貌似出了问题,超链接不能用了,博客写好发布后发现被截短了,这…...
建设网站要什么/在线排名优化
试题编号: 201412-4 试题名称: 最优灌溉 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的…...
建网站要钱吗/投放广告找什么平台
Nacos支持基于Namespace和Group的配置分组管理,以便用户更灵活的根据自己的需要按照环境或者应用、模块等分组管理微服务的大量配置,在配置管理中主要提供了配置历史版本、回滚、订阅者查询等核心管理能力。 配置列表 点击Nacos控制台的配置管理->配…...
做公司+网站建设/最新国际新闻头条今日国际大事件
前言 Access 2007开发指南(修订版)现在,有关Access的好书已经有很多了,我为什么还要写一本呢?这是因为当我在全国各地提供咨询服务时,许多学生都提出下面的看法。现有的Access读本要么针对普通用户群体,要么针对专家级…...