数据结构和算法的概念以及时间复杂度空间复杂度详解

news2025/1/12 22:58:10

⭐️ 什么是数据结构?

百度百科给数据结构的定义:

数据结构(Data Structure)是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。

数据结构就是数据在内存中的存储方式。


⭐️ 什么是算法?

百度百科给算法的定义:

计算机算法是以一步接一步的方式来详细描述计算机如何将输入转化为所要求的输出的过程,或者说,算法是对计算机上执行的计算过程的具体描述

算法就是将输入数据转换成输出的结果。

注:数据结构和算法是相辅相成的。

💬 算法特点

  1. 有穷性。 (一个算法应包括有限的操作步骤,而不能是无限的。)
  2. 确定性。 (算法的每一个步骤应该是确定的,而不是模糊的。)
  3. 有零个或多个输入。
  4. 有一个或多个输出。 (没有输出的算法是没有意义的。)
  5. 有效性。 (算法的每一个步骤应当能有效的执行,并得到确定的结果。)

⭐️ 时间复杂度

百度百科时间复杂度的定义:

在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况

算法中的基本操作的执行次数,为算法的时间复杂度。

💬 大O渐进表示法

  1. 用常数 1 取代运行时间中所有加法常数。
  2. 在修改后的运行次数函数中,保留最高次项。
  3. 如果最高次项系数不是 1,则去除这个最高次项的系数。

⭕️例1:

// count的执行次数是多少?
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;
	}
}

推导过程:

  外层循环执行一次内存循环就要执行 N N N 次,外层循环执行 N N N 次,那么内层循环也要执行 N N N次,所以第一个循环是执行的次数是 N 2 N^2 N2。第二个循环循环 2 N 2N 2N 次。第三个循环循环常数次 10 10 10 次。

执行次数: F ( N ) = N 2 + 2 N + 10 F(N) = N^2 + 2N + 10 F(N)=N2+2N+10

  • N = 1000 N = 1000 N=1000    F ( N ) = 1000 ∗ 1000 + 2 ∗ 1000 + 10 = 1002010 F(N) = 1000 * 1000 + 2 * 1000 + 10 = 1002010 F(N)=10001000+21000+10=1002010

实际中计算时间复杂度时,不需要计算精确的执行次数,而只需要大概的执行次数,所以这里用到了大O的渐进表示

从上面 N = 1000 N = 1000 N=1000 的例子中可以看出来,当 N N N 越来越大的时候,或者 N N N 趋于无穷的时候, 2 N 2N 2N 10 10 10就起不到作用了,甚至可以忽略不计

所以 例1 中函数的时间复杂度是 O ( N 2 ) O(N^2) O(N2)

⭕️例2:

// count的执行次数是多少?
void Func2(int N)
{
	int count = 0;
	// 第一个循环
	for (int k = 0; k < 2 * N ; ++ k)
	{
 		++count;
	}
	// 第二个循环
	int M = 10;
	while (M--)
	{
 		++count;
	}
}

推导过程:

第一个循环执行 2 N 2N 2N 次,第二个循环执行常数次 10 10 10 次。

执行次数: F ( N ) = 2 N + 10 F(N) = 2N + 10 F(N)=2N+10。 常数次 10 10 10 2 N 2N 2N 面前可以忽略不计,而里面最高次的系数是 2 2 2 也可以忽略不计。

所以 例2 的时间复杂度是 O ( N ) O(N) O(N)

⭕️例3:

int Func3(int * nums , int numsSize , int target)
{
	for (int i = 0; i < numsSize; i++) {
		if(nums[i] == target) {
			return i;
		}
	}
	return -1;
}

描述代码:Func3 代码是在数组中寻找一个目标值,如果找到目标值,则返回数组当前元素的下标,没有找到返回 -1

我们通过 例1例2 发现了大 O O O 渐进表示法去掉了对结果影响不大的项,简洁的表明了执行的次数。

那么有些算法的时间复杂度存在最好、平均、和最坏的情况。

比如 例3 这段代码:

  • 最好情况: 1 1 1 次找到
  • 最坏情况: N N N 次找到
  • 平均情况: N / 2 N/2 N/2 次找到

但是在实际中一般情况下我们只关注算法的最坏运行情况,所以 例3 的时间复杂度为 O ( N ) O(N) O(N)

⭕️例4:

void Func4(void)
{	
	int count = 0;
	for (int i = 0; i < 100; i++) {
		count++;
	}
}

例4 中的代码循环是固定的常数次 100 100 100 次,像一般常数级别的次数,时间复杂度用 O ( 1 ) O(1) O(1) 表示

注:O(1)代表是常数次,并不是一次的意思。

在这里插入图片描述


⭐️ 空间复杂度

空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。空间复杂度算的是变量的个数。也使用大 O O O渐进表示法

像冒泡排序、选择排序…这些算法的空间复杂度是 O ( 1 ) O(1) O(1),因为这些算法只用了常数个变量。而一般的递归算法空间复杂度就是 O ( N ) O(N) O(N),每次递归函数都要开辟 N N N个栈帧,每个栈帧使用了常数个空间。

⭕️例5:

void Func5(int nums , int numsSize) {
	int * temp = (int*)malloc(sizeof(int) * numsSize);
	int end = numsSize - 1;
	for (int i = 0; i < numsSize; i++) {
		temp[i] = nums[end--];
	}
	for (int i = 0; i < numsSize; i++) {
		printf("%d " , temp[i]);
	}
}

例5 的代码动态的开辟了 numsSize 个空间,所以空间复杂度是 O ( N ) O(N) O(N)

注:空间复杂度还是要根据实际情况讨论,有些情况空间是会先创建再销毁重复利用空间的。

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

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

相关文章

基于高精度三维机器视觉的新能源汽车锂电池表面缺陷检测

​Part.1 行业背景 ​随着新能源汽车在全球范围内成为焦点发展领域&#xff0c;企业对电池质量控制和检测的要求也变得更加严格。在机器视觉行业迅速发展的背景下&#xff0c;市场上提供了功能强大且种类齐全的3D相机系列&#xff0c;可以满足锂电池从电芯到模组各个工艺和工位…

IAM风险CTF挑战赛

wiz启动了一个名为“The Big IAM Challenge”云安全CTF挑战赛。旨在让白帽子识别和利用 IAM错误配置&#xff0c;并从现实场景中学习&#xff0c;从而更好的认识和了解IAM相关的风险。比赛包括6个场景&#xff0c;每个场景都专注于各种AWS服务中常见的IAM配置错误。 Challenge…

【Docker】云原生利用Docker确保环境安全、部署的安全性、安全问题的主要表现和新兴技术产生的详细讲解

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…

Vue键盘事件

1.Vue中常用的按键别名&#xff1a; 回车enter 删除delete&#xff08;捕获“删除”和“退格”键&#xff09; 推出esc 空格space 换行tab&#xff08;特殊&#xff0c;必须配合keydown使用&#xff09; 上up 下down 左left 右right 2.Vue未提供别名的按键&#xff0c;可以使用…

Arduino驱动BH1750模块实现光照强度采集

Arduino驱动BH1750模块实现光照强度采集 简介特征电气参数接线程序结果 简介 BH1750FVI是一个用于I2 C总线接口的数字环境光传感器IC。该IC最适合于获取调节手机液晶显示屏和键盘背光功率的环境光数据。在高分辨率下探测大范围是可能的。(1 - 65535 lx )。BH1750FVI可以应用于…

Matlab 回归分析与预测

统计分析 回归分析与预测 数理统计—回归分析 回归分析类型 回归分析目的 一元线性回归 多元线性回归的案例 %{ [B,BINT,R,RINT,STATS] regress(Y,X) [B,BINT,R,RINT,STATS] regress(Y,X,ALPHA) 参数解释&#xff1a;B&#xff1a; 回归系数&#xff0c;是个向量&…

小程序官方tabbar和自定义tabbar

uniapp官方tabbar&#xff1a; 打开项目中的 pages.json 文件。 在 JSON 对象中添加一个名为 tabBar 的字段&#xff0c;并设置其值为一个对象。 在 tabBar 对象中&#xff0c;配置 color 和 selectedColor 字段来定义 TabBar 的默认颜色和选中项的颜色。示例&#xff1a; …

功放IC 2018和功放IC HX8358A的区别

概述&#xff1a; 2018功放IC&#xff0c;目前在市面的情况是品牌多、杂&#xff0c;芯片的工作电压和喇叭输出功率不统一。经常出现低电压芯片用在高电压的产品上面&#xff0c;导致芯片容易损坏&#xff0c;给用户带来一定的麻烦。但它的销售量可能已超过8002的功放芯片了&am…

6.19、JAVA IO流 File 字节流 字符流

IO简介 1 流Stream 在学习IO流之前,我们首先需要学习的概念就是Stream流 为了方便理解,我们可以把数据的读写操作抽象成数据在"管道"中流动,但需注意: 1.流只能单方向流动 2.输入流用来读取 → in 3.输出流用来写出 → out 4.数据只能从头到尾顺序的读写一次 所以以…

Python 基本数据类型(六)

文章目录 每日一句正能量Tuple&#xff08;元组&#xff09;结语 每日一句正能量 一生要做的几件事情一管理好自己的身体。二管理好自己的情绪&#xff0c;正面思维。三服务好自己的家庭&#xff0c;让家人生活幸福。四做好本职工作&#xff0c;做一两件特别完美&#xff0c;石…

剑指 Offer 51: 数组中的逆序对

这道题归根结底就是一个归并问题&#xff0c;逆序对本质上就是比较大小&#xff0c;如果两边作为一个整体比较过那么就可以排序合并&#xff08;因为这个过程每一步都计算了count的值&#xff0c;所以合并起来是可以的&#xff09;。 下面的k应该是mid1&#xff08;从中间的右…

智“绘“城市:智慧环卫可视化运营管理系统

前言 随着我国城镇化的不断推进&#xff0c;城市的规模、数量不断增加&#xff0c;城市的人口数量也快速增长&#xff0c;造成的城镇生活垃圾、建筑垃圾也随之增长&#xff0c;这造成人们对环卫服务的需求增加。而与此同时&#xff0c;随着经济社会的快速发展&#xff0c;人们…

ChatGLM-6B微调p tuning v2和lora对比

官方项目地址&#xff1a;https://github.com/THUDM/ChatGLM-6B 参考本人之前的博客下载ChatGLM-6B模型&#xff1a; https://blog.csdn.net/Acecai01/article/details/131221676 设备 一张3090Ti&#xff0c; 24G显卡 实验目的 通过微调的方法&#xff0c;训练ChatGLM-6B模…

【AUTOSAR】BMS开发实际项目讲解(二十七)----电池管理系统高压上下电管理

高压上下电管理 关联的系统需求 Sys_Req_3201、Sys_Req_3202、Sys_Req_3203、Sys_Req_3204、Sys_Req_3205、Sys_Req_3206、Sys_Req_3207、Sys_Req_3208、Sys_Req_3209; 功能实现描述 高压上下电管理基于下图所示高压拓扑开发 图继电器高压拓扑图 高压上电管理 高压上电管理需…

华为bgp跨跳建立邻居后产生黑洞路由用mpls ldp解决方法

捉包发现R2在处理1.1.1.1到5.5.5.5走的是标签转发 R1: dis current-configuration [V200R003C00] snmp-agent local-engineid 800007DB03000000000000 snmp-agent clock timezone China-Standard-Time minus 08:00:00 portal local-server load flash:/portalpage.zip drop i…

Jenkins2.3.46安装

一、安装和安装Jenkins 0.前提 因jenkins从2.357版本开始不再支持java8 2、jenkins与java版本对应查看&#xff0c;与jenkins下载&#xff1a;Redhat Jenkins Packages 3、打算使用java8&#xff0c;所以选择安装2.346.3-1.1 4、安装jenkins之前&#xff0c;安装好java8并…

Day_58-59 NB 算法

目录 Day_58符号型数据的 NB 算法 一. 关于NB算法的介绍 1. 条件概率 2. 独立性假设 3. 以上式子的分析 4. Laplacian 平滑 5. 问题的回顾 二. 代码实现 1. 代码的符号说明 2. 构造函数和基础函数 3. 计算结果的分布情况 4. 核心代码 5. 分类 三. 符号型数据的运行结果 Da…

使用vtk创建设置了面的颜色的立方体

引言 该示例为官网上的例子。创建了一个每个面被设置相同颜色的立方体。 示例 开发环境 使用QtCreator4.11.2,Qt5.14.2。使用的vtk9.2的库及其头文件。创建空项目。 示例代码 其pro文件中的内容&#xff1a; QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT w…

利用jmeter测试java请求

jmeter和loadrunner一样包含了测试脚本开发、测试执行、以及测试结果统计三个部分。只是jmeter没有脚本开发工具&#xff0c;因此测试java请求的脚本选择在eclipse中进行。 首先介绍如何用eclipse编写接口性能测试脚本。 针对"Java请求"类型的测试&#xff0c;需要…

折半查找包含程序

折半查找又称二分查找&#xff0c;它仅适用于有序的顺序表 以下面的例子来讲解折半查找的过程 元素710131619293233374143数组位置012345678910 第一步&#xff1a;先确定查找元素&#xff0c;以14为例子&#xff1b;low和high分别是指向表的上界和下界&#xff1b;最开是low…