时间复杂度与空间复杂度(小白向)

🤖💻👨‍💻👩‍💻🌟🚀

🤖🌟 欢迎降临张有志的未来科技实验室🤖🌟

专栏:数据结构

👨‍💻👩‍💻 先赞后看,已成习惯👨‍💻👩‍💻

👨‍💻👩‍💻 创作不易,多多支持👨‍💻👩‍💻

🚀 启动创新引擎,揭秘C语言的密码🚀

目录

大O表示法

时间复杂度

打印数组

二分查找

空间复杂度

常数空间复杂度 O(1) 示例:交换两个变量的值

线性空间复杂度 O(n) 示例:数组复制

对数空间复杂度 O(log n) 示例:斐波那契数列(递归版)

优化策略


大O表示法


        大O表示法的字母O是函数的增长率,也被称为函数的阶数,即字母O代表Order(阶数)。用大O符号描述函数通常只提供函数增长率的一个上界

常见的有:O(1),O(n),O(n²) ,O(nlogn),O(logn)。

时间复杂度


        时间复杂度和空间复杂度是计算机科学中用于评估算法效率的重要指标。这两个概念可以帮助我们了解算法在时间和空间方面的需求,从而优化算法以提高其性能。

        时间复杂度:也称为时间复杂度和时间频度,是一个用于描述算法执行时间随输入规模增长而增长的量级。具体来说,时间复杂度是一个函数,它定性描述一个算法的运行时间。

计算时间复杂度的方法如下

  1. 确定算法中的基本操作。
  2. 计算基本操作执行的次数。
  3. 确定时间复杂度的表示方式。

打印数组

#include <stdio.h>void print(int* arr, int size)
{for (int i = 0; i < 2*size; i++)printf("%d ", arr[i]);
}int main()
{return 0;
}

  函数实现了打印数组的功能,用函数表示上述函数的运行次数就是 y = 2*x,时间复杂度O(n)。

思考:为什么运行2*size次,但时间复杂度不是O(2N)而是O(N) ?

答:目前大多数家用计算机的CPU运算速度大约为每秒50亿次计算,计算10次和20次区别不大。我们可以将 n 看做 无穷大(∞),2*n 与 n 没有区别,所以我们索性看做O(n)

二分查找

int binarySearchWithLoop(int arr[], int n, int x) {int left = 0;int right = n - 1;while (left <= right) {int mid = left + (right - left) / 2;// 如果x是中间元素if (arr[mid] == x)return mid;// 如果x小于中间元素,只在左半部分继续寻找if (arr[mid] > x)right = mid - 1;else// 如果x大于中间元素,只在右半部分继续寻找left = mid + 1;}// 如果x不在数组中return -1;
}

经典的二分查找,left right每一次循环直走一步,用函数表达就是n=2^k,k表示运行的次数,由此我们可以得到 𝑘=log2​n。时间复杂度为O(logN),这里省略底数与上文同理。

空间复杂度


当我们理解时间复杂度后,学习空间复杂度变得容易许多。

概念:用于描述执行算法所需的内存空间。空间复杂度主要取决于算法在执行过程中所使用的额外空间

常数空间复杂度 O(1) 示例:交换两个变量的值

void swap(int* a, int* b) {int temp = *a;*a = *b;*b = temp;
}

额外空间只有temp一个变量,所以空间复杂度为O(1)。

线性空间复杂度 O(n) 示例:数组复制

void copyArray(int src[], int dest[], int n) {for(int i = 0; i < n; i++) {dest[i] = src[i];}
}

该函数复制一个长度为n的数组到另一个数组中,需要额外的数组dest[]用于存储结果,因此其空间复杂度为O(n)。

对数空间复杂度 O(log n) 示例:斐波那契数列(递归版)

int binarySearch(int arr[], int l, int r, int x) {while (l <= r) {int m = l + (r - l) / 2;if (arr[m] == x)return m;if (arr[m] < x)l = m + 1;elser = m - 1;}return -1;
}

二分查找中,虽然没有显式的对数级的额外空间,但递归调用栈的深度为O(log n),因此在考虑递归空间时,整体的空间复杂度也是O(log n)。


优化策略

  • 时间优化:在C语言编程中,可以通过选择更高效的算法(如快速排序代替冒泡排序)、减少循环层数、利用缓存等手段来降低时间复杂度。

  • 空间优化:尽量复用内存、采用迭代而非递归(减少栈的使用)、合理设置数据结构来减少不必要的空间占用。

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

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

相关文章

你真的会udf提权???数据库权限到系统权限 内网学习 mysql的udf提权操作 ??msf你会用了吗???

我们在已经取得了数据库的账号密码过后&#xff0c;我们要进一步进行提取的操作&#xff0c;我们mysql有4钟提权的操作。 udf提权(最常用的)mof提权启动项提权反弹shell提权操作 怎么获取密码操作&#xff1a; 怎么获取密码&#xff0c;通过sql注入获取这个大家都应该知道了&a…

Python-数据分析组合可视化实例图【附完整源码】

数据分析组合可视化实例图 开篇&#xff1a;应女朋友的要求&#xff0c;于是写下了这篇详细的数据可视化代码及完整注释 一&#xff1a;柱状图、折线图横向组合网格布局 本段代码使用了pyecharts库来创建一个包含多个图表&#xff08;柱状图、折线图&#xff09;和网格布局的…

51单片机第22步_interrupt和using关键字

Keil C51中有一些关键字&#xff0c;一定要牢记&#xff0c;它和其它CPU不一样&#xff0c;所以需要记住interrupt和using关键字&#xff0c;以及它后面所跟的数字在程序中的意义。 单独提出来讲&#xff0c;我也和大家一样记不住&#xff0c;那些数字的意义太少&#xff0c;不…

第一周:李宏毅机器学习笔记

第一周学习周报 摘要一、机器学习基础理论1. 什么是机器学习&#xff1f;2. 机器学习“寻找”的函数有哪些类型&#xff1f;3. 机器学习中机器如何“寻找”函数&#xff1f;三步走3.1 第一步&#xff1a;设定函数的未知量&#xff08;Function with Unknown Parameters&#xf…

【高考志愿】冶金工程

目录 一、专业简介 1.1 专业定义 1.2 主要课程 1.3 培养目标 二、就业方向与就业前景 三、报考注意 四、行业发展趋势与前景 五、个人特质与职业规划 六、冶金工程专业排名 一、专业简介 1.1 专业定义 冶金工程&#xff0c;这是一门古老而又充满活力的普通高等学校本…

Vue3 按钮根据屏幕宽度展示折叠按钮

文章目录 一、组件封装二、使用三、最终效果(参考)四、参考 一、组件封装 ButtonFold.vue 1、获取父组件的元素&#xff0c;根据元素创建动态插槽 2、插槽中插入父元素标签。默认效果和初始状态相同。 3、当屏幕宽度缩小时&#xff0c;部分按钮通过 dropdown 的方式展示出来&a…

Sqlmap中文使用手册 - 各个参数介绍(持续更新)

目录 1. 指定输出级别2. 指定目标2.1 直接连接数据库2.2 指定目标URL2.3 从代理日志中解析目标2.4 从远程站点地图文件(.xml)中解析目标2.5 从文本中解析目标2.6 从文件加载HTTP请求2.7 将google搜索结果作为攻击目标2.8 从配置INI文件获取目标 3. 请求3.1 指定HTTP方法3.2 指定…

线程安全的懒加载单例模式

一、什么是单例模式 单例模式是一种设计模式&#xff0c;它确保某个类只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。这种模式在多种编程语言中都有实现&#xff0c;包括Java和C。单例模式的实现可以采取饿汉式或懒汉式两种方式。饿汉式是在类加载时就创建了…

springboot使用测试类报空指针异常

检查了Service注解&#xff0c;还有Autowired注解&#xff0c;还有其他注解&#xff0c;后面放心没能解决问题&#xff0c;最后使用RunWith(SpringRunner.class)解决了问题&#xff01;&#xff01; 真的是✓8了&#xff0c;烦死了这个✓8报错&#xff01;

VSCode连接远程服务器,并用Docker环境开发和调试

1. 连接服务器操作步骤 1.1 在本机安装SSH 由于我们是使用 SSH 连接远程服务器&#xff0c;因此 Windows 需要支持 SSH。可以通过安装 Git 来获取 SSH 功能&#xff0c;如何验证? 使用 Win R &#xff0c;输入 cmd 打开控制窗口&#xff0c;直接输入 ssh&#xff0c;如下提…

C语言 | Leetcode C语言题解之第200题岛屿数量

题目&#xff1a; 题解&#xff1a; void cleanLand(char** grid, int gridSize, int ColSize,int row,int column) {if(grid[row][column] 1){//不等于1则清零grid[row][column] 0;}else{//不等于1则返回return ;}int newRow;int newColumn;//上if(row ! 0) //还能上{ne…

每天五分钟计算机视觉:人体姿势识别

本文重点 人体姿势识别是计算机视觉领域的一个重要研究方向,旨在通过图像或视频数据自动检测并识别出人体的各种姿势和动作。随着深度学习技术的快速发展,基于神经网络的方法在这一领域取得了显著进展。神经网络,特别是卷积神经网络(CNN)和循环神经网络(RNN),因其强大…

基于YOLOv9的PCB板缺陷检测

数据集 PCB缺陷检测&#xff0c;我们直接采用北京大学智能机器人开放实验室数据提供的数据集&#xff0c; 共六类缺陷 漏孔、鼠咬、开路、短路、杂散、杂铜 已经对数据进行了数据增强处理&#xff0c;同时按照YOLO格式配置好&#xff0c;数据内容如下 模型训练 ​ 采用YOLO…

idea乱码问题解决

乱码问题产生的根本原因 数据的编码和解码使用的不是同一个字符集 使用了不支持某个语言文字的字符集 Tomcat控制台乱码 在tomcat10.1.7这个版本中,修改 tomcat/conf/logging.properties中,所有的UTF-8为GBK即可 sout乱码问题,设置JVM加载.class文件时使用UTF-8字符集 设置虚…

Kafka 集群 Topic、消息大小、节点格式上限管控原理

Kafka 集群 Topic、消息大小、节点格式上限管控原理 kafka 集群对创建topic的数量有限制吗,发送的消息内容大小有限制吗,kafka集群节点的个数有限制吗, 如何来合理的设置topic的分区数量和副本数量?Kafka 集群在创建 Topic 的数量、发送的消息内容大小、集群节点的个数方面…

RedisAtomicInteger并发案例

&#x1f370; 个人主页:__Aurora__ &#x1f35e;文章有不合理的地方请各位大佬指正。 &#x1f349;文章不定期持续更新&#xff0c;如果我的文章对你有帮助➡️ 关注&#x1f64f;&#x1f3fb; 点赞&#x1f44d; 收藏⭐️ RedisAtomicInteger 提供了对整数的原子性操作&a…

【SkiaSharp绘图12】SKCanvas方法详解(一)清空、裁切区域设置、连接矩阵、注释、弧与扇形、图集、九宫格绘图、圆

文章目录 SKCanvas 方法Clear 清空ClipPath/ClipRect/ClipRegion/ClipRoundRect 设置裁切区域Concat 连接矩阵DrawAnnotation绘制注释DrawArc绘制椭圆弧、扇形DrawAtlas绘制图集(一个图像、多个区域、多个缩放、一次绘制&#xff09;DrawBitmap绘制图像DrawBitmapNinePatch九宫…

防火墙部署基本方法

防火墙部署基本方法 防火墙部署是确保网络安全的重要步骤&#xff0c;通过合理的部署和配置防火墙&#xff0c;可以有效地保护网络资源&#xff0c;防止未经授权的访问和网络攻击。以下是防火墙部署的基本方法&#xff0c;包括部署步骤、配置建议和常见的部署拓扑。 一、部署…

深度学习评价指标:Precision, Recall, F1-score, mIOU, 和 mDice

在深度学习和机器学习中&#xff0c;评价模型性能是至关重要的一环。本文将详细讲解一些常见的评价指标&#xff0c;包括精确率&#xff08;Precision&#xff09;、召回率&#xff08;Recall&#xff09;、F1-score、平均交并比&#xff08;mIOU&#xff09;和平均Dice系数&am…

Adobe Magento OR Commerce电子商务系统 XXE漏洞复现(CVE-2024-34102)

0x01 产品简介 Magento最初是一个开源的电子商务平台,后来被Adobe公司收购,并更名为Adobe Commerce,是一个功能丰富、灵活且可扩展的电子商务解决方案。Adobe Commerce提供了强大的定制能力,允许商家根据自己的业务需求进行灵活调整。通过人工智能和机器学习技术,为B2B和…