数据结构介绍与时间、空间复杂度

news2024/11/19 9:20:01

数据结构介绍

  1. 什么是数据结构?
  2. 什么是算法?
  3. 数据结构和算法的重要性

数据结构定义

数据结构是计算机科学中研究数据组织、存储和管理的一门学科。数据结构描述了数据对象之间的关系,以及对数据对象进行操作的方法和规则。

常见的数据结构

数组(Array):连续存储相同类型的数据元素。 链表(Linked
List):通过指针链接的节点组成,每个节点包含数据和指向下一个节点的指针。 栈(Stack):遵循后进先出(LIFO)原则的数据结构。
队列(Queue):遵循先进先出(FIFO)原则的数据结构。 树(Tree):由节点和边组成的层次结构,如二叉树、二叉搜索树等。
图(Graph):由节点和边组成的非线性数据结构,用于表示对象之间的关系。 哈希表(Hash
Table):使用哈希函数将键映射到存储位置的数据结构。 堆(Heap):特殊的树形数据结构,具有优先级队列的特性。
集合(Set):存储唯一元素的无序集合。 字典(Dictionary):存储键-值对的数据结构,也被称为映射或关联数组。

每种数据结构都有其特定的用途和适用场景。选择合适的数据结构可以提高算法的效率和性能。在实际应用中,通常会根据问题的需求选择合适的数据结构进行数据的组织和管理。

算法定义

算法是一组解决问题步骤的有限序列,它是为解决一个或多个计算问题而设计的明确指令集。简单来说,算法就是解决问题的方法和步骤。

算法由若干基本操作组成,包括数学运算、比较、赋值、条件分支和循环等,可以用自然语言、流程图、伪代码或编程语言来描述。

算法的设计和分析是计算机科学中的重要问题。有效的算法可以使问题的解决更为高效、精确和可靠。算法的时间复杂度和空间复杂度是评估算法效率和性能的主要指标,通常使用大 O 表示法来表示。

除了计算、搜索、排序和存储等常见的算法领域,还有许多其他领域,如人工智能、机器学习、图像处理和自然语言处理等,都使用了不同类型的算法来解决不同类型的问题。

总之,算法是计算机科学中不可或缺的组成部分,它们已经在各行各业中得到了广泛的应用。

算法特性

算法的特性包括以下几个方面:

有限性:任何一个算法都必须在有限的时间内停止。也就是说,算法的执行时间必须是有限的,否则算法就不能被执行。

确定性:算法的每个步骤必须被精确定义。也就是说,给定一个输入,程序每一次运行的结果是一样的。

可行性:算法必须可以在计算机或其他计算设备上实现。也就是说,算法中用到的所有操作都可以被计算机执行。

输入:算法必须有零个或多个输入,这些输入是要为问题提供解决方案的数据。

输出:算法必须有一个或多个输出,这些输出是算法为解决问题创建的解决方案。

可读性:算法必须易于理解和实现,可读性是评估算法质量的重要标准之一。

高效性:算法的执行结果必须是准确的,同时也要在可接受的时间内获得结果。算法的时间复杂度和空间复杂度通常用于评估算法的效率。

总之,算法是计算机科学中非常重要的概念和实践,对于计算机科学专业的学生和从事计算机编程工作的人员来说,掌握算法的设计和分析是非常必要的。

数据结构的重要性

数据结构和算法是计算机科学中最基础和最重要的两个领域。它们的作用体现在以下几个方面:

提高程序效率和性能:数据结构和算法可以有效地提高程序的效率和性能,使程序更加快速、可靠和节省资源。对于大量处理数据和计算密集型任务的程序,优秀的数据结构和算法非常重要。

最优解决方案:数据结构和算法是解决计算机科学中一系列问题的关键工具,例如搜索、排序、图形处理、人工智能和机器学习等各个领域。通过使用最优算法和数据结构,可以得到最优解决方案,从而提高计算机程序的效率和准确性。

简化复杂问题:许多计算机科学问题都是很复杂的,但是如果正确地应用数据结构和算法,可以使这些复杂问题变得更加简单。通过抽象和组织问题,使用正确的算法和数据结构,可以将问题简化为较小的子问题,从而更容易地解决问题。

促进创新:数据结构和算法的不断发展推动了计算机科学领域的创新,为各种领域提供了新的技术和工具。例如,人工智能、机器学习和大数据等领域的发展都离不开优秀的数据结构和算法的支持。

增强竞争力:掌握数据结构和算法对于计算机科学专业的学生和从事编程工作的人员来说非常重要,这是增强个人竞争力和就业竞争力的基础。人才市场对于掌握数据结构和算法方面的专业人才的需求量日益增大。

因此,学习和掌握数据结构和算法,对于计算机科学相关领域的学生和从业人员来说都非常重要,这是进入计算机行业、提高个人技能水平的基础。

时间复杂度

1.算法效率
2.时间复杂度

算法效率

如何衡量一个算法的好坏呢?

比如对于以下斐波那契数列:

long long Fib(int N)
{
	if(N < 3)
		return 1;
	return Fib(N-1) + Fib(N-2);
}

我们可以知道这样用递归的方式实现斐波那契数列十分的简单,但是一旦数值稍微大了起来,就会因为递归开辟了许多函数空间,超过某一定值就会导致栈区溢出,对于该代码函数的实现和释放其实十分像古代帝位传承(嫡长子继承制)。
在这里插入图片描述
上面可以抽象成以递归方式实现的斐波那契数列,作者个人觉得还是十分像古代帝位的传承

斐波那契数列的递归实现方式非常简洁,但简洁一定好吗?那该如何衡量其好与坏呢?

算法的复杂度

算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。
时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。

时间复杂度

时间复杂度的概念

时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。

即:找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度。

// 请计算一下Func1中++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;
	}
printf("%d\n", count);
}

可以很简单的知道fun1中++count被执行了:n^2+2*n+10次。
实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法。

大O的渐进表示法

大O符号(Big O notation):是用于描述函数渐进行为的数学符号。
推导大O阶方法:

1、用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

使用大O的渐进表示法以后,Func1的时间复杂度为:

N = 10 F(N) = 100
N = 100 F(N) = 10000
N = 1000 F(N) = 1000000

通过上面我们会发现大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。
另外有些算法的时间复杂度存在最好、平均和最坏情况:

最坏情况:任意输入规模的最大运行次数(上界)
平均情况:任意输入规模的期望运行次数
最好情况: 任意输入规模的最小运行次数(下界)

例如:在一个长度为N数组中搜索一个数据x

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

在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)。

所以,Func1的时间复杂度为:O(n^2)。

空间复杂度

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

常见复杂度表

在这里插入图片描述
在这里插入图片描述
本篇内容到此为止,带大家简单认识了数据结构以及数据结构中时间、空间复杂度的理解,谢谢大家。

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

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

相关文章

解决node项目一个极度困难的捕获异常却无法读取异常信息的问题

这个项目是集成了第三方NeteaseCloudMusicApi项目的接口代码&#xff0c;我没有直接使用它的接口&#xff0c;因为需要再跑一个npm run开个端口&#xff0c;感觉很麻烦。 所以下定决心&#xff0c;使用拆分代码的方式&#xff0c;硬生生将这个api项目的部分api接口代码集成到了…

JavaScript变量和作用域简介

目录 变量 var let const 作用域 全局作用域 局部作用域 总结 JavaScript是一种广泛应用于网页开发的脚本语言。在JavaScript中&#xff0c;变量和作用域是非常重要的概念&#xff0c;它们决定了代码中数据的存储和访问方式。本文将介绍JavaScript中的变量和作用域&…

如何使用Abaqus进行摩擦生热仿真

Abaqus除了可以对结构进行强度分析&#xff0c;同样也有强大的固体传热分析功能&#xff0c;下面通过一个简单的实例演示Abaqus的双向热固耦合分析。 因为本案例涉及物体表面辐射&#xff0c;因此需要定义绝对零度和输入史蒂夫-波兹曼常数&#xff0c;如下&#xff1a; 本次分…

ESP8266,手机与电脑之间的TCP通讯

电脑端运行通讯猫调试助手,作为服务端: 电脑端 电脑的IP地址是: 192.168.2.232 手机与电脑之间的TCP通讯 手机端运行网络调试精灵,作为客户端: 手机端 如果从手机端点击"发送"按钮,则也会将"ghhh东方红广场"几个字发送到电脑上(服务端). ESP8266作为客户…

接口自动化测试框架搭建完整版

1、基本目录的搭建 report&#xff1a;静态输出目录(报告或者日志) data&#xff1a;静态输入目录(可以存放Excel数据&#xff0c;被读取的一些数据) utils&#xff1a;实用方法层(这里存放的是项目的公共方法&#xff0c;一般拿到别的项目可以直接使用&#xff0c;列如&…

【列存储学习总结】

在 OpenGauss 中&#xff0c;列存储是一种高效的数据存储方式&#xff0c;它在处理分析查询和数据仓库工作负载时具有很高的性能优势。列存储将表中的数据按列存储在磁盘上&#xff0c;而不是按行存储&#xff0c;这样可以极大地提高数据读取和分析操作的效率。当涉及大量数据的…

护眼灯买哪种好? 推荐五款儿童护眼台灯

台灯如何选择&#xff0c;随着人们生活水平的提高及科技的不断进步&#xff0c;台灯的品质也得到了极大的提高&#xff0c;在生活中很多时候都需要使用台灯&#xff0c;但是市面上的台灯那么多&#xff0c;台灯如何选择。本次小编为大家推荐五款好用的护眼灯。 1.书客护眼台灯L…

一款功能强大的视频编辑软件会声会影2024中文破解版安装教程教程含会声会影2024注册机下载

会声会影2023中文破解版是一款功能强大的视频编辑软件、大型视频制作软件、专业视频剪辑软件。会声会影专业视频编辑处理软件&#xff0c;可以用于剪辑合并视频&#xff0c;制作视频&#xff0c;屏幕录制&#xff0c;光盘制作&#xff0c;视频后期编辑、添加特效、字幕和配音等…

关于亚马逊 CodeWhisperer 的使用体验

Amazon CodeWhisperer 是亚⻢逊出品的一款基于机器学习的 AI 编程助手&#xff0c;可实时提供代码建议。现在已正式可用&#xff0c;面向个人提供免费服务&#xff0c;通过在各种流行的IDE里集成 CodeWhisperer&#xff08;包括我们常用的 JetBrains 产品包及 Vscode 工具集&am…

Java实现快递管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 快递类型模块2.3 快递区域模块2.4 快递货架模块2.5 快递档案模块 三、界面展示3.1 登录注册3.2 快递类型3.3 快递区域3.4 快递货架3.5 快递档案3.6 系统基础模块 四、免责说明 一、摘要 1.1 项目介绍 …

node 第十三天 express初见

express概念 Fast, unopinionated, minimalist web framework for Node.js 快速、独立、极简的 Node.js Web 框架。 express相当于前端的jquery, 在不更改不侵入原生node的基础上封装了大量易用且实用的服务端api, express框架的封装原理就是前面第十天我们自己封装的简易服务器…

BI是什么?想要了解BI需要从哪些方面入手?

企业为了执行数字化战略&#xff0c;实行数字化转型&#xff0c;实现数据价值&#xff0c;除了需要相关数字化技术及理念、人才等&#xff0c;还需要借助数字化相关应用&#xff0c;例如商业世界中广受企业欢迎的ERP、OA、CRM等业务信息系统&#xff0c;以及上升势头非常迅猛的…

设计模式(2)-创建型模式

1&#xff0c;创建型模式 4.1 单例设计模式 单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类&#xff0c;该类负责创建自己…

c语言中各类指针的总结

1、数组指针 在c语言中&#xff0c;指针常被用于应用数组&#xff0c;或者作为数组的元素。顾名思义&#xff0c;指向数组的指针常被简称为数组指针。值得注意的是&#xff0c;数组指针指向的数组是数组名&#xff0c;也是其数值中首元素的地址。 我们定义数组指针的方式如下…

26 行为型模式-命令模式

1 命令模式介绍 2 命令模式原理 3 命令模式实现 模拟酒店后厨的出餐流程,来对命令模式进行一个演示,命令模式角色的角色与案例中角色的对应关系如下: 服务员: 即调用者角色,由她来发起命令. 厨师: 接收者,真正执行命令的对象. 订单: 命令中包含订单 /*** 订单类**/ public cl…

深入浅出排序算法之堆排序

目录 1. 算法介绍 2. 执行流程⭐⭐⭐⭐⭐✔ 3. 代码实现 4. 性能分析 1. 算法介绍 堆是一种数据结构&#xff0c;可以把堆看成一棵完全二叉树&#xff0c;这棵完全二叉树满足&#xff1a;任何一个非叶结点的值都不大于(或不小于)其左右孩子结点的值。若父亲大孩子小&#x…

Azure - 机器学习实战:快速训练、部署模型

本文将指导你探索 Azure 机器学习服务的主要功能。在这里&#xff0c;你将学习如何创建、注册并发布模型。此教程旨在让你深入了解 Azure 机器学习的基础知识和常用操作。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验…

按照正规的软件开发流程,项目原型评审是全程对着页面评审吗

项目原型评审是软件开发过程中的一步&#xff0c;它的目的是确保设计和需求的一致性&#xff0c;以及提供一个可视化的界面供所有相关方进行沟通和理解。评审过程中&#xff0c;可能会涉及到多个方面&#xff1a; 用户界面&#xff08;UI&#xff09;&#xff1a;确保UI设计满足…

2023第51届(郑州)全国文房四宝艺术博览会将于11月10日在郑州启幕

由中国文房四宝协会、《中国文房四宝》杂志社主办的2023第51届全国房四宝艺术博览会暨首届中国书房艺术空间展即将于11月10-13日在郑州国际会展中心盛大启幕。 这是首次文房四宝企业精英携千款优质产品&#xff0c;进入中原文化胜地集体亮相。这是一次书香郑州与中国文房的相遇…

北太天元安装教程 及使用方法

北太天元是面向科学计算与工程计算的国产通用型科学计算软件。提供科学计算、可视化、交互式程序设计&#xff0c;具备丰富的底层数学函数库&#xff0c;支持数值计算、数据分析、数据可视化、数据优化、算法开发等工作&#xff0c;并通过SDK与API接口&#xff0c;扩展支持各类…