当前位置: 首页 > news >正文

数据结构(三)复杂度的深层次剖析

之前发布了数据结构(一),很多同学反响不够清晰,那今天就发一篇对复杂度专题的博客,希望对大家理解复杂度提供一些帮助。

时间复杂度

我们先来一个理解一个复杂度,二分查找的复杂度(之前写过二分查找的专题博客,感兴趣的可以看一看)    CSDNicon-default.png?t=N7T8https://mp.csdn.net/mp_blog/creation/editor/135742310

我们在数据结构(一)中讲解了,但是没有画图,现在为了方便大家的理解现在我重新讲解一下。

我们先把代码拿出来看看

// 计算BinarySearch的时间复杂度?
int BinarySearch(int* a, int n, int x)
{
assert(a);
int begin = 0;
int end = n-1;
// [begin, end]:begin和end是左闭右闭区间,因此有=号
while (begin <= end)
{
int mid = begin + ((end-begin)>>1);
if (a[mid] < x)
begin = mid+1;
else if (a[mid] > x)
end = mid-1;
else
return mid;
}
return -1;
}

这时候大家会好奇该如何计算其复杂度,其实搞清楚原理也比较容易理解。

二分查找的原理就不在过多的讲解了,不懂的小伙伴可以去看看上面的链接。

我们还是老样子画图来为大家演示:

当我们在不断地缩减,直到缩减到只剩下一个值的时候。

那么这就是最坏的一个情况,如果这个值是我们想要找的那个值,那么就找到了,如果不是那么我们输出找不到。

随之而来的疑问就是,我们一共找了多少次呢?

假设我们有N个值,我们每次都缩减一半,那么就是N/2,这是一次。那么我们一共找了多少次呢?

N/2/2/2/2/2/2.............=1 直到我们找到那个数为止。  这是最坏情况,那么我们除了多少个2呢?

不难看出,其实我们找了多少次就除了多少个2。

关键点拨:假设我找了X次,那么我们 就可以得到表达式。

第一步:N/2/2/2/2/2/2/2...............=1

第二步:N=1*2^x  (等式两边同时乘2)

第三步:2^x=N

第四步:化简

基本操作执行最好1次,最坏O(logN)次,时间复杂度为 O(logN) ps:logN在算法分析中表示是底
数为2,对数为N。有些地方会写成logN 。(由于对数在键盘中不好敲出来,所以我们通常省略2)。

补充时间复杂度例题:

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

大家看到这串代码时一定有想骂街的冲动,但是有我在大家不用担心,我来为大家搞定它。

那么开始进入正题:

上面的代码是 N 的阶乘的原码,之前我的博客也写过,感兴趣的小伙伴可以去看看地址就放在这里了-用C语言实现阶乘的相加-CSDN博客文章浏览阅读373次,点赞11次,收藏9次。i=3 ret=1*2*3 此时的ret=6 可以理解为1*2*3。i=2 ret=1*2 此时ret=2 可以理解为1*2。当n=2时ret=1*2 同样把值存在sum中 此时的ret=2。ret开始变化 例如:当for循环运行到i=3时,i=1 ret=1*1 此时ret=1。那么我们有没有其他方案呢,答案是有的我们可以这样在求2的阶乘时直接在1的阶乘上乘2 1*2。关键点拨:ret=ret*n 当n=1时ret=1*1 并把值存在sum中。https://blog.csdn.net/weixin_73496371/article/details/135739915

这里我们就直接开始,我们先思考一个问题,阶乘调用了多少次函数?

老样子画图解释:

我们不断调用FAC从N次到N-1次再到N-2次...........直到0次

我们把它们相加起来就可以得到。

计算分析发现基本操作递归了N次,时间复杂度为O(N)。

我们再来看难度比较大的一道题:

// 计算斐波那契递归Fib的时间复杂度?
long long Fib(size_t N)
{
if(N < 3)
return 1;
return Fib(N-1) + Fib(N-2);
}

斐波那契我们用简单的图片来理解一下

理解起来有点像细胞分化的意思。

那么问题来了,一共有多少次调用呢?有个简易的方法来看一下

 我们观察最左边的数 2^0  2^1  2^2  2^3..........它们实际上是一个等比数列。

我们使用等比数列求和的方式求和.     这就用到了我们的高中知识。

通过计算分析发现基本操作递归了2^N次,时间复杂度为O(2^N)。

接下来为大家详解空间复杂度

空间复杂度

空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度 。
空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。
注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

实例1:

// 计算BubbleSort的空间复杂度?
void BubbleSort(int* a, int n)
{
assert(a);
for (size_t end = n; end > 0; --end)
{
int exchange = 0;
for (size_t i = 1; i < end; ++i)
{
if (a[i-1] > a[i])
{
Swap(&a[i-1], &a[i]);
exchange = 1;
}
}
if (exchange == 0)
break;
}
}

结论:    实例1使用了常数个额外空间,所以空间复杂度为 O(1)

解释:空间复杂度是我们一个算法在运行时额外(由于逻辑的需要)开辟的空间。

上述代码算法(排序过程)额外开辟的有 size_t end     size_t i    exchange它们开辟的空间都是常数,所以使用大O渐进法不难算出空间复杂度。 O(1)

 如果大家对这道题有疑问的话我们再来看一道题,相信你的问题不在是问题了。

实例2:

// 计算Fibonacci的空间复杂度?
// 返回斐波那契数列的前n项
long long* Fibonacci(size_t n)
{
if(n==0)
return NULL;
long long * fibArray = (long long *)malloc((n+1) * sizeof(long long));
fibArray[0] = 0;
fibArray[1] = 1;
for (int i = 2; i <= n ; ++i)
{
fibArray[i] = fibArray[i - 1] + fibArray [i - 2];
}
return fibArray;
}

我们观察在算法的运行中只动态开辟了(n+1)的空间。 ---------malloc((n+1)

那么我们使用大O渐进表示法:

动态开辟了N个空间,空间复杂度为 O(N)。

到这里我想大家对空间复杂度有了全新的理解了吧。

常见复杂度对比

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

复杂度的oj练习 

消失的数字OJ链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode-cn.com/problems/missing-number-lcci

感谢你的观看

后续更新更多数据结构的相关知识

相关文章:

数据结构(三)复杂度的深层次剖析

之前发布了数据结构&#xff08;一&#xff09;&#xff0c;很多同学反响不够清晰&#xff0c;那今天就发一篇对复杂度专题的博客&#xff0c;希望对大家理解复杂度提供一些帮助。 时间复杂度 我们先来一个理解一个复杂度&#xff0c;二分查找的复杂度&#xff08;之前写过二…...

JavaWeb -- HTTP -- WEB服务器TOMCAT

一.HTTP介绍: HTTP(Hyper Text Protocol) 实际上是一种超文本传输的协议,规定了浏览器跟服务器之间的一些数据传输的规则 例如B/S 对于浏览器的请求,以及相应服务器的响应,都必须依靠这种协议,规范,才能够彼此之间相互 理解 HTTP的协议特点: 1.基于TCP协议: 面向连接 更加安全…...

GitHub与Git命令使用笔记

GitHub与Git命令使用笔记 文章目录 GitHub与Git命令使用笔记上传本地的新项目到github1. 创建新的GitHub仓库2. 初始化本地项目目录3. 将本地仓库关联到GitHub4. 推送本地代码到GitHub上传本地项目到GitHub时发生冲突 将默认分支名称从master改为maingit 把远程项目拉到本地&am…...

二叉树的层次遍历经典问题-算法通关村

二叉树的层次遍历经典问题-算法通关村 1 层次遍历简介 广度优先在面试里出现的频率非常高&#xff0c;整体属于简单题。广度优先又叫层次遍历&#xff0c;基本过程如下&#xff1a; 层次遍历就是从根节点开始&#xff0c;先访问根节点下面一层全部元素&#xff0c;再访问之后…...

SQLiteC/C++接口详细介绍sqlite3_stmt类(十二)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;十一&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;十三&#xff09; 48、sqlite3_stmt_isexplain sqlite3_stmt_is…...

大模型时代如何做安全?

现在应该没人怀疑AI时代的到来了吧&#xff0c;在HUB上每天100的新的预训练模型产生&#xff0c;不夸张的说的&#xff0c;现在稍微有点计算机基础的人都可以训练自己的模型了。 说远了&#xff0c;还是说说那些不争气的安全厂商吧。为啥只说安全厂商&#xff1f;因为国内还是…...

新型储能是什么,储能系统解决方案现状及趋势详细说明

新型储能是指新兴的能够存储电能并在需要时释放的储能技术。其中主要包括光伏储能和商业储能。 光伏储能是指通过光伏电池将太阳能转化为电能&#xff0c;并将其存储起来以供后续使用。光伏储能系统一般由太阳能电池板、储能装置和逆变器组成。光伏储能可以将白天产生的电能存…...

掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)

在Go语言中&#xff0c;字典通常指的是map类型&#xff0c;它是一种用于存储键值对的数据结构。字典在Go中非常常见&#xff0c;是一种高效的数据结构&#xff0c;用于快速查找和检索数据。 字典的详细使用方法 创建字典 可以使用make函数来创建字典&#xff0c;并指定键值对…...

Flutter-仿携程首页类型切换

效果 唠叨 闲来无事&#xff0c;不小心下载了携程app&#xff0c;还幻想可以去旅游一番&#xff0c;奈何自己运气不好&#xff0c;自从高考时第一次吹空调导致自己拉肚子考试&#xff0c;物理&#xff0c;数学考了一半就交卷&#xff0c;英语2B铅笔除了问题&#xff0c;导致原…...

C语言 自定义类型:结构体

目录 前言 一、结构体类型 1.1 结构体的声明 1.2 结构体变量的创建和初始化 1.3 结构体的特殊声明 1.4 结构体的自引用 二、结构体的对齐 2.1 对齐规则 2.2 内存对齐的原因 2.3 修改默认对齐数 2.4 结构体传参 三、结构体实现位段 3.1 位段的内存分配 3.2 段的跨平…...

计算机网络拓扑结构

目录 <网络拓扑结构概念> <典型的拓扑结构介绍> 第一种&#xff0c;总线型网络拓扑结构 第二种&#xff0c;星型网络拓扑结构 第三种&#xff0c;树型网络拓扑结构 第四种&#xff0c;环型网络拓扑结构 第五种&#xff0c;网状型网络拓扑结构 第六种&#…...

FPGA通过I2C控制AT24C64

文章目录 前言一、代码设计框图二、IIC_drive模块设计2.1、模块接口&#xff1a;2.2、代码功能描述&#xff1a;2.3、IIC协议实现过程&#xff1a; 三、EEPROM_ctrl模块设计3.1、模块接口&#xff1a;3.2、代码功能描述 四、EEPROM_drive模块五、iic_top模块 前言 继上一篇FPG…...

134. 加油站(力扣LeetCode)

文章目录 134. 加油站题目描述暴力枚举&#xff08;超时&#xff09;代码一代码二&#xff08;优化&#xff09; 贪心算法方法一方法二 134. 加油站 题目描述 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&…...

XSKY 智能存储,助力“数据要素 X”先进制造

3 月 21-22 日&#xff0c;主题为“突破 智行”的 IMC2024 第七届中国智造数字科技峰会在重庆召开。作为在先进制造领域拥有领先存储解决方案以及众多应用实践的企业&#xff0c;星辰天合受邀参加了此次峰会并荣获大会颁发的“最佳存储解决方案奖”。同时&#xff0c;星辰天合先…...

数据挖掘与分析学习笔记

一、Numpy NumPy&#xff08;Numerical Python&#xff09;是一种开源的Python库&#xff0c;专注于数值计算和处理多维数组。它是Python数据科学和机器学习生态系统的基础工具包之一&#xff0c;因为它高效地实现了向量化计算&#xff0c;并提供了对大型多维数组和矩阵的支持…...

linux docker镜像初始化

linux docker镜像初始化 简介 有的镜像内部使用的linux系统特别精简&#xff0c;许多常用命令无法安装&#xff0c;导致排查问题较为困难。 可以使用cat /etc/os-release查看容器使用的linux版本&#xff0c;再进行一些常用操作的初始化。 Debian # 设置镜像源 RUN rm -f /…...

专业140+总分410+南京大学851信号与系统考研经验南大电子信息与通信集成,电通,真题,大纲,参考书。

今年分数出来还是有点小激动&#xff0c;专业851信号与系统140&#xff08;感谢Jenny老师辅导和全程悉心指导&#xff0c;答疑&#xff09;&#xff0c;总分410&#xff0c;梦想的南大离自己越来越近&#xff0c;马上即将复试&#xff0c;心中慌的一p&#xff0c;闲暇之余&…...

. ./ bash dash source 这五种执行shell脚本方式 区别

实际上,., ./, bash, dash, source 是五种不同的方式来执行 shell 脚本,它们之间有一些区别。 .(点号)或 source 命令:这两个命令是等价的,它们都是 Bash shell 内置的命令。它们用于在当前 shell 环境中执行脚本。当使用 . script.sh 或 source script.sh 命令来执行脚本…...

【React 】React 性能优化的手段有哪些?

1. 是什么 React凭借virtual DOM和diff算法拥有高效的性能&#xff0c;但是某些情况下&#xff0c;性能明显可以进一步提高 在前面文章中&#xff0c;我们了解到类组件通过调用setState方法&#xff0c;就会导致render ,父组件一旦发生render渲染&#xff0c;子组件一定也会执…...

3.22网络编程小项目

基于UDP的网络聊天室 项目需求&#xff1a; 如果有用户登录&#xff0c;其他用户可以收到这个人的登录信息如果有人发送信息&#xff0c;其他用户可以收到这个人的群聊信息如果有人下线&#xff0c;其他用户可以收到这个人的下线信息服务器可以发送系统信息 服务器 #includ…...

三步掌握Ofd2Pdf:OFD转PDF的高效实用指南

三步掌握Ofd2Pdf&#xff1a;OFD转PDF的高效实用指南 【免费下载链接】Ofd2Pdf Convert OFD files to PDF files. 项目地址: https://gitcode.com/gh_mirrors/ofd/Ofd2Pdf Ofd2Pdf是一款专业的开源工具&#xff0c;专为将OFD格式电子文档转换为PDF格式而设计。无论您需要…...

Xenos深度解析:Windows DLL注入技术的全面实战指南

Xenos深度解析&#xff1a;Windows DLL注入技术的全面实战指南 【免费下载链接】Xenos Windows dll injector 项目地址: https://gitcode.com/gh_mirrors/xe/Xenos 在Windows系统开发和安全研究领域&#xff0c;DLL注入技术一直扮演着至关重要的角色。Xenos作为一款基于…...

SecGPT-14B效果展示:对Splunk SPL查询语句进行安全语义解释与优化建议

SecGPT-14B效果展示&#xff1a;对Splunk SPL查询语句进行安全语义解释与优化建议 1. 引言&#xff1a;当安全分析遇上智能助手 想象一下这个场景&#xff1a;作为一名安全分析师&#xff0c;你正面对海量的日志数据&#xff0c;需要快速编写Splunk SPL查询语句来追踪一次潜在…...

Youtu-Parsing开源文档解析模型详解:像素级定位+RAG就绪JSON/Markdown输出

Youtu-Parsing开源文档解析模型详解&#xff1a;像素级定位RAG就绪JSON/Markdown输出 你是不是经常遇到这样的烦恼&#xff1f;拿到一份扫描的PDF合同&#xff0c;想把里面的表格数据提取出来&#xff0c;结果复制粘贴后格式全乱了&#xff1b;或者收到一张带公式的学术论文截…...

OpenClaw+Qwen3.5-9B组合优势:3个不可替代的使用场景

OpenClawQwen3.5-9B组合优势&#xff1a;3个不可替代的使用场景 1. 为什么选择OpenClawQwen3.5-9B组合 去年夏天&#xff0c;当我第一次尝试用Python脚本自动化处理医疗研究数据时&#xff0c;遇到了一个尴尬的问题&#xff1a;要么忍受公有云API的数据隐私风险&#xff0c;要…...

10分钟搞懂 RAG:大模型如何边检索边生成答案

幻觉&#xff08;Hallucination&#xff09;很多人第一次用大模型时&#xff0c;都会有一种感觉&#xff1a;它好像什么都懂&#xff0c;什么都能答。但真把它放到实际场景里&#xff0c;很快就会发现问题没有那么简单。比如你去问公司的报销规则、某个项目的最新文档内容&…...

前端-Node.js

1. 什么是Node.jsNode.js是一个跨平台JavaScript运行环境&#xff0c;使开发者可以搭建服务器端的JavaScript应用程序。作用&#xff1a;使用Node.js编写服务端程序。编写数据接口&#xff0c;提供网页资源浏览功能等等。前端工程化&#xff1a;为后续学习Vue和React等框架做铺…...

开源组件审计:OpenClaw+SecGPT-14B自动生成SBOM报告

开源组件审计&#xff1a;OpenClawSecGPT-14B自动生成SBOM报告 1. 为什么需要自动化SBOM生成 作为一名长期在开源生态中摸爬滚打的开发者&#xff0c;我经历过太多次"依赖地狱"——某个深夜部署时突然发现项目引用的老旧库存在高危漏洞&#xff0c;或是收到法务部门…...

作业二6位数码管显示

文章目录1.效果图:显示6个91.代码2.效果图&#xff1a;第1、6位显示72.代码3.效果图&#xff1a;6位0到9轮流显示3.代码4.效果图&#xff1a;中间两位0到9轮流显示4.代码5.效果图&#xff08;显示1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff…...

小白必看:cv_resnet18_ocr-detection WebUI界面详解,功能一目了然

小白必看&#xff1a;cv_resnet18_ocr-detection WebUI界面详解&#xff0c;功能一目了然 1. 快速认识cv_resnet18_ocr-detection 如果你正在寻找一个简单好用的文字识别工具&#xff0c;cv_resnet18_ocr-detection绝对值得一试。这个由科哥开发的OCR文字检测模型&#xff0c…...