【数据结构】时间复杂度和空间复杂度解析

news2024/12/23 20:21:26

 

数据结构前言:

1. 什么是数据结构

打个比方来说不同的数据就相当于不同的书籍,我们经常在图书馆可以看到不同类别的书籍会被整理放在书架上方便查看存放,数据结构就是一种计算机存储管理数据的方式。

2. 什么是算法

算法就是一系列的计算步骤,将我们输入的需要计算的数据转化成输出的结果
 

算法的时间复杂度和空间复杂度:
 

1. 为什么要计算算法的时间复杂度和空间复杂度
 

时间复杂度和空间复杂度可以反应一个算法的好坏,好的算法执行能力强,快;差的算法执行能力弱,慢。比如我们打开一个应用的界面,你一打开就进入了首页,还有种情况你打开等了半天还是在封面广告界面,我相信大多数用户都喜欢前者,算法也是如此,好算法计算机1ms就执行出结果,坏的算法往往执行半天,程序一直在跑,甚至于可能失败。

所以我们需要一些理论来衡量算法的优劣,时间复杂度和空间复杂度由此诞生。选择好的算法,往往在思考算法的过程中也可以锻炼我们的思维能力。

时间复杂度: 

时间复杂度表面看起来好像跟时间有关,但其实不是计算算法跑了多少时间的,因为我们知道不同的电脑计算能力,跑程序有强弱之分,一个好的算法在老古董电脑上跑也需要很长的时间,所以为了防止这样的情况误差发生,我们的时间复杂度计算的是一个算法执行了多少次命令操作!

如:

int main()
{
	int a =0;
	printf("%d", a);
	return 0;
}

从进入主函数内部我们总共执行了3次指令,我们称这样的时间复杂度为 O(1); -> 后面会解释为啥不是 O(3)


为了方便我们判断,我们只选取最大的执行项数,N^2, 以阶级区分,为什么怎么做呢?,首先我们先了解有多少种时间复杂度:

因为目前计算机的计算速度基本上都是以亿为单位的,当计算的数量上去之后,一些细枝末节就不予考虑了

拿 F(N) = N^2 + 2*N + 10 举例

当N=10时,     F(N) =100+30
当N=100时,   F(N) =10000+210
当N=1000时, F(N) =1000000+2010

我们称这种取舍的表示符号O() 为大O的渐进表示法

时间复杂度计算的是最坏的情况,这样可以保证我们的效率最坏也就是那样,知道预期的结果。

// 大家可以根据以下代码测试cpu性能
// 计算出自己计算机的计算能力

int main()
{
	long long int x = 0;

	int begin1 = clock();
	int n = 10000;
	for (int i = 0; i < n; ++i)
	{
		for (int i = 0; i < n; ++i)
		{
			++x;
		}
	}
	int end1 = clock();

	printf("%lld\n", x);
	printf("%d\n", end1 - begin1);
	return 0;
}

下面我们来个题目分析: 

题目一:

 

 题目二: 

答案:O(N) ->  2*N+10

题目三: 

void Func1(int N)
{
	int count = 0;
	for (int i = 0; i < N; ++i)
	{
		for (int j = 0; j < N; ++j)
		{
			++count;
		}
	}
	for (int k = 0; k < 2 * N; ++k)
	{
		++count;
	}
	int M = 10;
	while (M--)
	{
		++count;
	}
    printf("%d\n", count);
}

 答案:O(N^2) -> N^2+2*N+10

 题目四:

// 计算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) 

题目五: 

// 计算Func4的时间复杂度?
void Func4(int N)
{
	int count = 0;
	for (int k = 0; k < 100; ++k)
	{
		++count;
	}
	printf("%d\n", count);
}

答案: O(1)  ->100

题目六: 

// 计算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;
	}
}

 答案:O(N^2)  -> N*(N+1)/2

空间复杂度: 

同理空间复杂度也不是去真的算空间的大小,而是计算创建了的变量个数。其他方面同理于时间复杂度。


题目一:

// 计算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;
	}
}

 答案:题目一使用了常数个额外空间,所以空间复杂度为 O(1)

题目二:

// 计算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个空间,空间复杂度为 O(N)

题目三: 

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

 答案:题目三递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间。空间复杂度为O(N)

 其他关于数据结构的题目分析:

以下的图片内容我小编平时写一些算法题目的思考,大家可以选取看取: 

 

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

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

相关文章

蓝桥杯练习系统(算法训练)ALGO-953 混合积

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 众所周知&#xff0c;人人都在学习线性代数&#xff0c;既然都学过&#xff0c;那么解决本题应该很方便。   宇宙大战中&…

上位机图像处理和嵌入式模块部署(树莓派4b和pyqt5界面开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在大部分linux程序开发中&#xff0c;一般是没有界面的。不过不排除有些场合&#xff0c;是需要用界面进行数据交互、调参使用的。这种情况下一般就…

JavaScript+B/S版云LIS系统源码ASP.NET CORE 3.1 MVC云LIS系统如何实现样本追踪的预警功能?医院云LIS检验系统源码

JavaScriptB/S版云LIS系统源码ASP.NET CORE 3.1 MVC云LIS系统如何实现样本追踪的预警功能&#xff1f;医院云LIS检验系统源码 实验室信息管理系统&#xff08;Trasen Laboratory Information Management System&#xff09;是一套专业的医疗实验室信息管理软件&#xff0c;包含…

远程链接linux

远程连接 ssh 远程登录操作&#xff0c;ssh会对用用户进行身份信息的验证&#xff0c;会对两台主机之间发通信数据进行加密 安装 ssh 远程登录的服务端 yum install -y openssh-server启动 ssh 服务 systemctl start ssh.service 关闭 ssh 服务 systemctl stop ssh.service …

伦敦金的交易时间段都适合投资吗?

是所有的交易时间段都适合投资。首先&#xff0c;让我们了解伦敦金的交易时间。伦敦金市场的交易时间分为两个主要时段&#xff1a;亚洲盘和欧美盘。亚洲盘通常在北京时间早晨6点至下午5点半左右&#xff0c;而欧美盘则从北京时间晚上8点半开始&#xff0c;一直到次日早晨4点半…

tomcat篇-windows 运行tomcat的startup.bat时,终端打印的中文显示为乱码

当运行Tomcat的startup.bat时&#xff0c;如果终端中中文显示为乱码&#xff0c;这通常是因为Tomcat使用的日志输出编码与Windows命令行默认的编码不匹配。针对这一问题&#xff0c;你可以尝试以下步骤来解决&#xff1a; 1、执行startup.bat&#xff0c;在输出的窗口右击&…

HCIP第二节

OSPF&#xff1a;开放式最短路径协议&#xff08;属于IGP-内部网关路由协议&#xff09; 一。OSPF的数据包类型 3层报头 协议号89 1.Hello&#xff1a;周期收发&#xff0c;用于邻居发现&#xff0c;关系建立&#xff0c;周期保活-10s/30s&#xff08;路由之间相互认识&#…

如何搭建本地的 NPM 私有仓库 Nexus

NPM 本地私有仓库&#xff0c;是在本地搭建NPM私有仓库&#xff0c;对公司级别的组件库进行管理。在日常开发中&#xff0c;经常会遇到抽象公共组件的场景&#xff0c;在项目内部进行公用。新的项目开始时&#xff0c;也会拷贝一份创建一个新的项目&#xff0c;这样做不易于管理…

Day23.一刷数据结构算法(C语言版) 39组合总和;40组合总和II;131分割回文串

一、39组合总和 本题是集合里元素可以用无数次&#xff0c;那么和组合问题的差别&#xff0c;其实仅在于对startIndex上的控制 题目链接&#xff1a;组合总和 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;带你学透回溯算法-组合总和 &#xff08;39.组合总和&#xff…

react核心知识

1. 对 React 的理解、特性 React 是靠数据驱动视图改变的一种框架&#xff0c;它的核心驱动方法就是用其提供的 setState 方法设置 state 中的数据从而驱动存放在内存中的虚拟 DOM 树的更新 更新方法就是通过 React 的 Diff 算法比较旧虚拟 DOM 树和新虚拟 DOM 树之间的 Chan…

界面组件DevExpress Blazor UI v23.2 - 网格、工具栏功能全新升级

DevExpress Blazor UI组件使用了C#为Blazor Server和Blazor WebAssembly创建高影响力的用户体验&#xff0c;这个UI自建库提供了一套全面的原生Blazor UI组件&#xff08;包括Pivot Grid、调度程序、图表、数据编辑器和报表等&#xff09;。 DevExpress Blazor控件目前已经升级…

创新指南|如何通过用户研究打造更好的人工智能产品

每个人都对人工智能感到兴奋&#xff0c;但对错过机会 (FOMO) 的恐惧正在驱使公司将人工智能嵌入到每个产品功能中。这可能会导致以技术为中心的方法&#xff0c;从而掩盖产品开发的基本目标&#xff1a;创建真正解决用户问题并满足他们需求的解决方案。本文将介绍通过用户研究…

找不到msvcr100.dll怎么办,轻松解决msvcr100.dll丢失的5种方法

在我们日常与电脑相伴的工作与学习过程中&#xff0c;偶尔会遇到一些让人措手不及的软件运行问题。其中之一就是“msvcr100.dll丢失”。这个错误通常会导致某些程序无法正常运行。为了解决这个问题&#xff0c;本文将介绍5种常见的解决方法&#xff0c;帮助大家快速恢复程序的正…

Intelij Idea Push失败,出现git Authentication failed(验证失败)

目录 1、出现问题的原因 2、解决之法 1、出现问题的原因 能出现这种问题&#xff0c;最主要的原因是链接对上了&#xff0c;但用户验证失败了&#xff0c;即登录失败。 因为服务器转移或者换了git项目链接&#xff0c;导致你忘记了用户名密码&#xff0c;随意输入之后&…

Golang | Leetcode Golang题解之第58题最后一个单词的长度

题目&#xff1a; 题解&#xff1a; func lengthOfLastWord(s string) (ans int) {index : len(s) - 1for s[index] {index--}for index > 0 && s[index] ! {ansindex--}return }

【Docker】docker部署lnmp和搭建wordpress网站

环境准备 docker&#xff1a;192.168.67.30 虚拟机&#xff1a;4核4G systemctl stop firewalld systemctl disable firewalld setenforce 0 安装docker #安装依赖包 yum -y install yum-utils device-mapper-persistent-data lvm2 #设置阿里云镜像 yum-config-manager --add…

Recruit App

招聘类APP小程序

调教AI给我写了一个KD树的算法

我不擅长C&#xff0c;但是目前需要用C写一个KD树的算法。首先我有一份点云数据&#xff0c;需要找给定坐标范围0.1mm内的所有点。 于是我开始问AI&#xff0c;他一开始给的答案&#xff0c;完全是错误的&#xff0c;但是我一步步给出反馈&#xff0c;告诉他的问题&#xff0c;…

机器学习-06-聚类算法总结

聚类总结 1.聚类 机器学习 任务 聚类 无label的 分类 label是离散的 回归 label是连续的 2.聚类算法-kmeans 划分聚类 思想&#xff1a; D中选取k个作为初始质心 repeat 计算所有点与质心的距离&#xff0c;分到近的质心簇 更新簇之间的质心 until 质心不改 不足&#xff…

TCP协议为什么使用三次握手进行连接?

回答: TCP协议使用三次握手来建立一个可靠的连接&#xff0c;确保两端的通信设备都准备好进行数据传输。这个过程涉及三个步骤&#xff1a; SYN&#xff1a;客户端发送一个SYN&#xff08;同步序列编号&#xff09;包到服务器&#xff0c;以开始新的连接。SYN-ACK&#xff1a;…