【数据结构】初探时间与空间复杂度:算法评估与优化的基础

news2024/12/22 20:25:53

🚩纸上得来终觉浅, 绝知此事要躬行。
🌟主页:June-Frost
🚀专栏:数据结构

🔥该文章主要了解算法的时间复杂度与空间复杂度等相关知识。

目录:

  • 🌏 时间复杂度
    • 🔭 一些例子
  • 🌎 空间复杂度
  • ❤️ 结语

📗时间复杂度和空间复杂度是计算机科学中用来评估算法效率的两个重要概念。它们分别描述了算法在执行时间和额外内存使用方面的需求,帮助我们了解算法在处理输入数据时所需的资源。在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。

🌏 时间复杂度

 在计算机科学中,算法的时间复杂度是一个函数,用于度量算法执行时间的指标。因为一个算法所花费的时间与其中语句的执行次数成正比例,所以可以认为在算法中的基本操作的执行次数,为算法的时间复杂度
 计算时间复杂度时,其实并不一定要计算精确的执行次数,只需要大概执行次数即可。

✨表示方式为大O的渐进表示法,记作T(n) = O(f(n)),其中T(n)表示算法执行时间,f(n)表示问题规模n的函数。具体来说,当n趋近于无穷大时,算法执行时间的增长趋势与f(n)的增长趋势相同的最高阶项即为该算法的时间复杂度。
✨推导方式:

  • 用常数1取代运行时间中的所有加法常数。
  • 运行次数函数中,只保留最高阶项。
  • 只关注数量级,而忽略常数因子,即去掉系数。

🔭 一些例子

void exampleAlgorithm(int N)
{
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			printf("This is O(n^2) operation.\n");
		}
	}

	for (int k = 0; k < 2 * N; k++)
	{
		printf("This is O(n) operation.\n");
	}

	for (int M = 5; M > 0; M--)
	{
		printf("This is O(1) operation.\n");
	}

}

 这个例子的函数表达式为 F(N) = N2 +2*N + 5,随着N的不断增加,N2 对最终结果具有决定性的作用,所以N2就是它的量级,运用大O的渐进表示法就可以表示为O(N2) 。

void exampleAlgorithm(int N)
{

	for (int k = 0; k < 2 * N; k++)
	{
		printf("This is O(n) operation.\n");
	}

	for (int M = 5; M > 0; M--)
	{
		printf("This is O(1) operation.\n");
	}

}

 如果没有了嵌套,这个函数的表达式就变成了 F(N) = 2*N + 5,这样随着N的增加,有决定性效果的就是2 * N,但是为了简化复杂度的表示,并突出算法随输入数据规模增长的趋势,又因为系数对于这种增长趋势的影响较小,所以一般需要去除系数,时间复杂度为O(N) 。

void exampleAlgorithm()
{

	for (int M = 1000; M > 0; M--)
	{
		printf("This is O(1) operation.\n");
	}

}

 如果只有常数阶,那么就可以直接表示为O(1) 。

⚠注意:

📙通过上面这些例子,我们会发现大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数,但是有些算法的时间复杂度存在最好、平均和最坏情况,在实际中一般关注的是算法的最坏运行情况。

④冒泡排序:

void bubble_sort(int* arr, int sz)
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int flag = 1; //标记
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				flag = 0;
				int temp = 0;
				temp = arr[j + 1];
				arr[j + 1] = arr[j];
				arr[j] = temp;
			}
		}
		if (flag == 1)//如果等于1表示数组数据已经有序
		{
			break;
		}
	}
}

 对于冒泡排序,最好的情况就是本身有序,只需遍历比较一遍数组即可,这时的时间复杂度为O(N),最坏的情况就是逆序,排好第一个数据需要比较N-1次,排好第二个数据需要比较N-2次,…,排好倒数第二个数据需要比较1次,最后一个数据不需要比较,将次数相加就是 [N*(N-1)] / 2,量级为N2,时间复杂度就是O(N2),最终的时间复杂度需要取最坏情况,即O(N2)。

⑤二分查找

int BinarySearch(int* arr, int sz, int k)
{
	int left = 0;
	int right = sz - 1;
	while (left <= right)
	{
		int mid = (right + left) / 2;
		if (arr[mid] < k)
		{
			left = mid + 1;//调整范围
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;//调整范围
		}
		else
		{
			return mid;
		}
	}
	return -1;
}

📘最好的情况是第一次查找就找到了,为O(1)。
📙最坏的情况为数据在边缘或者数组中没有要查找的数据:
在这里插入图片描述
 一般将 log2N 简写为logN ,所以时间复杂度为 O(logN)。

⑥ 阶乘

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

 调用函数需要创建栈帧,传入参数后,会调用Factorial(N) ,再调用Factorial(N-1),不断调用,直到调用到Factorial(0),共调用了N+1次,每次调用的时间复杂度为O(1),所以最终的时间复杂度为O(N) 。

⑦ 斐波那契数

long long Fibonacci(size_t N)
{
	if (N <= 2)
		return 1;

	return Fibonacci(N - 1) + Fibonacci(N - 2);
}



 将 20 一直加到 2(n-2) ,算法的量级为2n,虽然实际上右边的分支会缺少一部分,但是不会影响到这个量级。


🌎 空间复杂度

 空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度算的是变量的个数,计算规则基本跟实践复杂度类似,也使用大O渐进表示法。

⚠注意:

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

① 冒泡排序

 冒泡排序属于原地排序,在排序过程中并没有使用额外的空间来帮助排序,那些用来循环的变量,可以看作常数阶,所以冒泡排序的空间复杂度为O(1) 。

②阶乘

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

 阶乘可以看作额外开辟了N个栈帧,每个栈帧空间内部没有额外创建空间,即每个栈帧空间为O(1),最终的空间复杂度为O(N) 。

③斐波那契数

long long Fibonacci(size_t N)
{
	if (N <= 2)
		return 1;

	return Fibonacci(N - 1) + Fibonacci(N - 2);
}


 栈帧空间是可以复用的,所以通常用计算算法所占用的内存空间的最大值来评估算法的空间复杂度,只需要知道在递归中会最大开辟多少栈帧空间就可以进行计算,这个算法最多开辟栈帧数量的量级为N,每个栈帧空间为O(1),所以最终的空间复杂度为O(N)。


❤️ 结语

 文章到这里就结束了,如果对你有帮助,你的点赞将会是我的最大动力,如果大家有什么问题或者不同的见解,欢迎大家的留言~

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

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

相关文章

基于自私羊群优化的BP神经网络(分类应用) - 附代码

基于自私羊群优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于自私羊群优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.自私羊群优化BP神经网络3.1 BP神经网络参数设置3.2 自私羊群算法应用 4.测试结果…

苹果手机怎么备份所有数据?2023年iPhone 15数据备份常用的3种方法!

当苹果手机需要进行刷机、恢复出厂设置、降级iOS系统等操作时&#xff0c;我们需要将自己的iPhone数据提前进行备份。 特别是在苹果发布新iOS系统时&#xff0c;总有一些小伙伴因为升降级系统&#xff0c;而导致了重要数据的丢失。 iPhone中储存着重要的照片、通讯录、文件等数…

STM32--人体红外感应开关

本文主要介绍基于STM32F103C8T6和人体红外感应开关实现的控制算法 简介 人体红外模块选用HC-SR501人体红外传感器&#xff0c;人体红外感应的主要器件为人体热释电红外传感器。人体都有恒定的体温&#xff0c;一般在36~37度&#xff0c;所以会发出特定波长的红外线&#xff0…

windows系统服务管理命令sc

sc可以用于管理系统服务、计划任务、系统日志等方面&#xff0c;是不可或缺的神器。 基本用法 在命令提示符下输入sc命令&#xff0c;然后按回车键。 上图展示的是sc命令的使用方法&#xff0c;支持哪些参数实现哪些功能 要查看系统所有服务列表&#xff0c;包括它们是否正在…

基于入侵杂草优化的BP神经网络(分类应用) - 附代码

基于入侵杂草优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于入侵杂草优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.入侵杂草优化BP神经网络3.1 BP神经网络参数设置3.2 入侵杂草算法应用 4.测试结果…

Mac版快速切换工具:One Switch中文 for mac

One Switch是一款功能强大、体验极简的Mac菜单栏工具&#xff0c;适合需要频繁切换系统设置和启动应用程序的用户使用。通过它&#xff0c;用户可以更方便地完成日常操作&#xff0c;提高工作效率。 快速访问工具&#xff1a;One Switch提供了一个便捷的菜单栏图标&#xff0c;…

1700*C. Number of Ways(贪心前缀和)

Problem - 466C - Codeforces Number of Ways - 洛谷 解析&#xff1a; 首先判断所有数总和是否能被三整除。 之后遍历前缀和数组&#xff0c;如果某个位置的前缀和等于sum/3&#xff0c;则记录。 某个位置前缀和等于sum/3*2则记录答案。 注意由于分成三份&#xff0c;所以同…

出去重复的列值(关键词:distinct)

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法格式: select distinct 列名 from 表名; 案例&#xff1a;查询emp表中&#xff0c;员工的职位&#xff08;job&#xff09;&#xff0c;并去重…

第八章 排序 五、快速排序

目录 一、算法思想 二、例子 三、代码实现 四、验证 五、算法效率分析 1、时间复杂度 ​编辑 2、空间复杂度 3、小结 4、优化思路 5、稳定性 六、总结 一、算法思想 首先&#xff0c;选取一个数作为序列的基准数&#xff0c;分别定义序列的第一个数和最后一个数为l…

Go Gin Gorm Casbin权限管理实现 - 1. Casbin概念介绍以及库使用

1. 核心概念 核心配置中含两部分模型配置以及策略配置&#xff0c;给出两个示范配置&#xff0c;在此基础上对实际请求进行分析。 1.1 Model 模型文件&#xff0c;存储了请求定义(request_definition)&#xff0c;策略定义(policy_definition)&#xff0c;匹配规则(matchers)&a…

黑豹程序员-架构师学习路线图-百科:AJAX

文章目录 1、什么是AJAX2、发展历史3、工作原理4、一句话概括 1、什么是AJAX Ajax即Asynchronous&#xff08;呃森可乐思&#xff09; Javascript And XML&#xff08;异步JavaScript和XML&#xff09; 在 2005年被Jesse James Garrett&#xff08;杰西詹姆斯加勒特&#xff09…

Yolov5 ONNX导出报错: export failure: Unsupported ONNX opset version: 17

目录 1.问题描述 1.1 报错1 &#xff1a; 1.2 报错 2 2.解决方案 介绍 ONNX&#xff08;Open Neural Network Exchange&#xff09;是一个用于机器学习模型的开放式标准&#xff0c;它旨在使不同的深度学习框架能够将训练好的模型在不同平台上无缝运行。它是由Microsoft和F…

第二课 前缀和、差分、双指针扫描

文章目录 第二课 前缀和、差分、双指针扫描lc1.两数之和--简单题目描述代码展示 lc11.盛最多水的容器--中等题目描述代码展示 lc15.三数之和--中等题目描述代码展示 lc42.接雨水--困难题目描述代码展示 lc53.最大子数组和--中等题目描述代码展示 第二课 前缀和、差分、双指针扫…

基于goravel的CMS,企业官网通用golang后台管理系统

2023年9月11日10:47:00 仓库地址&#xff1a; https://gitee.com/open-php/zx-goravel-website 框架介绍 Goravel SCUI 后端开发组件 go 1.20 Goravel 1.13 数据库 sql(使用最新日期文件) goravel\doc\sql_bak mysql 8.0 前端开发组件 scui 1.6.9 node v14.21.3 效果图…

凉鞋的 Unity 笔记 106. 第二轮循环场景视图Sprite Renderer

106. 第二轮循环&场景视图&Sprite Renderer 从这一篇开始&#xff0c;我们开始进行第二轮循环。 这次我们至少能够在游戏运行窗口看到一些东西。 首先还是在场景层次窗口进行编辑&#xff0c;先创建一个 Sprite&#xff0c;操作如下: 创建后&#xff0c;会在 Scene …

【锁的区别】C++线程库和POSIX线程库锁的区别

C线程库和POSIX线程库锁的区别 C线程库代码段的互斥&#xff1a;mutex、recursive_mutex、timed_mutex、recursive_timed_mutex互斥量mutex&#xff1a;直接进行lock()或者unlock()递归互斥锁recursive_mutex&#xff1a;可以多次加锁&#xff0c;意味着加几次锁就需要解几次锁…

华为MateBook13 2021款(WRTD-WFE9)原装出厂Win10系统工厂模式安装包(含F10智能还原)

下载链接&#xff1a;https://pan.baidu.com/s/1yL7jFbklrln0UqWqxQ7fcw?pwd9nm1 系统自带一键智能还原功能、带有指纹、声卡、显卡、网卡等所有驱动、出厂主题壁纸、系统属性华为专属LOGO标志、Office办公软件、华为电脑管家等预装程序 所需要工具&#xff1a;16G或以上的U…

公众号留言插件有哪些?有哪些好用的小程序?

为什么公众号没有留言功能&#xff1f;2018年2月12日&#xff0c;TX新规出台&#xff1a;根据相关规定和平台规则要求&#xff0c;我们暂时调整留言功能开放规则&#xff0c;后续新注册帐号无留言功能。这就意味着2018年2月12日号之后注册的公众号不论个人主体还是组织主体&…

全能视频工具 VideoProc Converter 4K for mac中文

VideoProc 4K提供快速完备的4K影片处理方案&#xff0c;您可以透过这款软体调节输出影片格式和大小。能够有效压缩HD/4K影片体积90%以上&#xff0c;以便更好更快地上传到YouTube&#xff0c;或是通过电子邮件附件发送。业界领先的视讯压缩引擎&#xff0c;让你轻松处理大体积视…

基于可解释性特征矩阵与稀疏采样全局特征组合的人体行为识别

论文还未发表&#xff0c;不细说&#xff0c;欢迎讨论。 Title: A New Solution to Skeleton-Based Human Action Recognition via the combination usage of explainable feature extraction and sparse sampling global features. Abstract: With the development of deep …