数据结构一:绪论

news2024/11/18 16:33:32

一、绪论

数据结构是计算机科学中的一门基础课程,研究数据的存储、组织和管理方法,以及在这些数据上进行各种操作的算法和技术。掌握数据结构和算法是编程中非常重要的基础,对于实现高效、可靠的程序至关重要。常见的数据结构包括数组、链表、栈、队列、树和图等。理解不同数据结构的特点和适用场景,并选择合适的数据结构,再应用相应的算法来解决问题,是我们在实际编程中所需要掌握的技能。
在这里插入图片描述

1、 数据结构的基本概念

数据元素是指构成数据的基本单位,它可以是数字、字符、字符串、结构体等,数据元素之间可以存在不同的关系,如有序关系、无序关系、父子关系等。
数据项是指数据元素中的数据成员,例如:学生记录就是一个数据元素,它由学号、姓名、性别等数据项祖成
数据对象是具有相同性质数据元素的集合,是数据的一个子集。如整数数据对象。
数据类型是值的集合和定义在此集合上的一组操作的总称。
抽象数据类型是指一种数据类型的抽象描述,它包含了数据元素的逻辑结构、数据元素之间的关系以及对这些数据元素进行操作的一组操作集合。抽象数据类型不考虑具体的实现方式,而是关注数据类型的抽象描述,它的实现可以采用不同的数据结构。可以定义一个完整的数据结构。
在这里插入图片描述

2、数据结构三要素

数据结构是指数据元素之间的关系,包括数据的逻辑结构、数据的存储结构和数据的运算。其中,数据的逻辑结构是指数据元素之间的逻辑关系,包括线性结构(栈、队列、数组、串)、非线性结构(树形结构、图状结构、集合)。数据的存储结构是指数据在计算机内部的存储方式,包括数据的表示和关系的表示。数据的运算是指对数据进行操作和处理的方法,包括查找、排序、插入、删除等操作。
逻辑结构是独立于存储结构的,可以通过不同的存储结构来实现。

在这里插入图片描述

3、算法和算法评价

在这里插入图片描述

算法是指解决问题的一系列步骤。具有5个特性
输入:0或至少1个输入(可以理解为入参)。
输出:至少一个。
有穷性:算法通过有限步骤解决问题,不会死循环。
确定性:算法解决每个步骤有特定的作用;通常算法只有一条执行路径,相同输入出现一个结果;无歧义。
可行性:每一步骤通过有限步骤执行。

好的算法应考虑以下4个目标:
正确性:正确求解问题
可读性:便于人们理解
健壮性:对非法数据有良好的处理
高效率与低存储量:算法在执行时间和所需存储空间方面的效率应尽可能高,能够处理大规模数据和复杂任务。
在这里插入图片描述

时间复杂度是算法执行时间随输入规模的增长而增长的量度,通常用大O记法表示。计算时间复杂度的方法如下:

  1. 关注最高阶项:在计算时间复杂度时,主要关注算法中最高阶项的执行次数。因为最高阶项通常对算法的执行时间具有决定性的影响。其他低阶项和常数项对于大规模输入来说相对较小,可以忽略。

  2. 忽略常数项:在时间复杂度的计算中,通常可以忽略算法中的常数项。因为常数项对于大规模输入的影响较小,而主要关注算法的增长趋势。

  3. 使用大O记法:大O记法是一种表示时间复杂度的常用方法。它表示算法执行时间的增长趋势,而不是精确的执行时间。大O记法将时间复杂度表示为一个函数,用来描述算法执行时间与输入规模之间的关系。常见的时间复杂度包括O(1)、O(log n)、O(n)、O(n log n)、O(n^2)等。

  4. 考虑最坏情况:在计算时间复杂度时,通常考虑算法在最坏情况下的执行时间。因为最坏情况下的时间复杂度提供了对算法性能的保守估计,确保算法在任何情况下都不会超过这个时间限制。

  5. 分析循环和递归:对于循环结构和递归算法,需要分析每次循环或递归调用的执行次数,并将其与输入规模相关联。这样可以得到算法的总体执行次数,从而计算时间复杂度。

  6. 使用算法分析工具和技巧:有许多常用的算法分析工具和技巧可用于计算时间复杂度,例如递推关系、求和公式、主定理等。这些工具和技巧可以帮助简化计算过程并得到更精确的时间复杂度结果。

最坏时间复杂度:最坏情况下算法的时间复杂度
平均时间复杂度:所有输入示例等概率出现的情况下,算法的期望运行时间
最好时间复杂度:最好情况下算法的时间复杂度

需要注意的是,时间复杂度的计算是对算法在最坏情况下的执行时间进行分析。最坏情况下的时间复杂度提供了一种保守的估计,确保算法在任何情况下都能满足时间限制。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
空间复杂度是衡量算法执行所需的额外空间随输入规模增长的量度。它表示算法在运行过程中所需要的额外存储空间,通常包括算法本身使用的空间和辅助数据结构所需的空间。

空间复杂度的表示通常也使用大O记法,用来衡量额外空间的增长趋势。与时间复杂度类似.计算算法的空间复杂度涉及到评估算法在执行过程中所需的额外空间资源。以下是一些常用的方法和指导原则来求解算法的空间复杂度:

  1. 确定变量和数据结构的空间消耗:分析算法中使用的变量和数据结构,并确定它们在内存中的空间消耗。例如,对于数组,需要考虑数组的长度乘以每个元素所占用的空间;对于链表,需要考虑每个节点的空间消耗以及额外的指针等。

  2. 考虑递归调用的空间:如果算法包含递归调用,需要考虑递归调用过程中所使用的栈空间。递归算法的空间复杂度通常与递归深度有关。

  3. 考虑额外的辅助空间:除了变量和数据结构之外,有些算法可能需要额外的辅助空间来存储临时结果或执行某些操作。例如,归并排序中使用的临时数组,或者深度优先搜索中使用的栈。

  4. 分析空间的使用情况:对于迭代算法,可以逐步分析算法执行过程中的空间使用情况。可以跟踪每个操作的空间消耗,并计算总体的空间复杂度。

  5. 根据空间的增长趋势估算复杂度:根据算法中所使用的空间资源的增长趋势,使用大O记法来表示空间复杂度。例如,如果算法的额外空间消耗与输入规模呈线性关系,则可以表示为O(n);如果空间消耗与输入规模的平方呈正比,则可以表示为O(n^2)。

需要注意的是,空间复杂度的计算通常是对算法在最坏情况下的空间使用进行分析。最坏情况下的空间复杂度提供了一种保守的估计,确保算法在任何情况下都不会超过这个空间限制。

总而言之,计算空间复杂度需要分析算法中所使用的变量、数据结构和额外空间,并根据其使用情况和增长趋势来估算空间复杂度。这样可以帮助我们评估算法的空间资源消耗,选择合适的算法,并进行性能优化。

当一个算法在执行过程中只使用常数级别的额外空间,并且不需要依赖于输入规模的增长,我们称其为原地工作(In-place)算法
原地工作算法的优点在于它们能够节省额外的空间资源,并且在处理大规模数据时更具效率。原地工作算法通常通过在输入数据上进行原地修改和重排,而不是创建额外的数据结构来存储中间结果。

一些常见的原地工作算法包括:

  1. 原地排序算法:例如快速排序和堆排序。这些算法通过在原始数据中交换元素的位置来实现排序,而不需要额外的数组来存储中间结果。
  2. 链表操作算法:在链表中进行插入、删除和翻转等操作时,可以只使用常数级别的额外指针来修改节点的链接,而不需要额外的空间。
  3. 数组操作算法:例如数组反转、去重、移除元素等操作,可以在原始数组上进行原地修改,而不需要额外的数组来存储中间结果。
  4. 搜索算法:某些搜索算法,如深度优先搜索(DFS)和广度优先搜索(BFS),可以通过修改节点的状态来避免额外的空间开销。

在设计原地工作算法时,需要仔细考虑如何利用输入数据本身的特性,合理安排修改操作的顺序,以确保算法的正确性和效率。

在这里插入图片描述

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

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

相关文章

雅思口语考试时长多少分钟?

雅思口语考试是单独考的,对于第一次考雅思的同学来说,了解雅思考试的时长才能更好的备考雅思,那么雅思口语考试时长多久呢? 一、雅思口语考试时长 雅思口语考试时长一般为11-14分钟 第一段约4-5分钟,会面问候一番&am…

java项目之高校信息资源共享平台(ssm+mysql+jsp)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的高校信息资源共享平台。技术交流和部署相关看文末! 开发环境: 后端: 开发语言:Java 框架&…

DynaSLAM 2018论文翻译

Dynaslam:动态场景下的跟踪、建图和图像修复 摘要-场景刚性假设是SLAM算法的典型特征。这种强假设限制了大多数视觉SLAM系统在人口稠密的现实环境中的使用,而这些环境是服务机器人或自动驾驶汽车等几个相关应用的目标。 在本文中,我们提出了一个基于ORB…

学习react,复制了一个C站Civitai

苦肝两个多月,终于复制了一个C站,也就是现在最热门的AI绘画社区Civitai。 来看看效果图吧! 技术栈介绍 我还是一个菜鸡,所以不像c站那样用了各种技术。 目前只是为了展示数据,我的Civitai简单技术栈如下 前端&…

Java17:IO流

一:File类: 1.File类的理解: 1.File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹) 2.File类声明在java.io包下 3.File类中涉及到关于文件或文件目录的创建,删除,重命名…

仙境传说RO:添加自定义道具

仙境传说RO:添加自定义道具 大家好,我是艾西今天和大家聊一下仙境传说RO怎么添加自定义道具。在我们开服时加入一些道具模组等往往会让我们的服务器更有特色以及消费点,那么让我们直接进入正题开始操作:(此处我们讲的…

k8s集群安装Istio过程记录及问题总结

目录 一、介绍二、部署Helm三、部署Istio部署官方示例 Bookinfo 四、部署KaliBug 记录部署Bookinfo demo失败 一、介绍 这篇文章记录一下k8s集群安装Helm、Istio 和 Kiali,方便学习相关概念。 前提需要k8s集群: 可参考:Arm64架构(MacBookPr…

cmake流程控制--循环

目录 for循环 普通方式 demo cmake3.17中添加了一种特殊的形式,可以在一次循环多个列表,其形式如下: demo 类似python语言的for循环 demo while循环 demo cmake跳出循环(break)和继续下次循环(continue) demo block()和endblock()命令定义的块内也是允许break()和c…

Windows下 Hexdump查看hex文件

链接 : https://www.di-mgt.com.au/hexdump-for-windows.html C:\hexdump-2.0.2 下载解压,以管理员权限拷贝至C:\Windows 便可使用查看命令

蓝牙定位系统|蓝牙网关定位和蓝牙Beacon定位的区别有哪些?

作为室外定位向室内环境的延伸,为了解决室外定位导航“最后一公里”的问题,室内定位领域的科技公司和研究机构也做出了很多的努力。目前市场主流的是基于蓝牙网关、蓝牙Beacon的室内定位方案,经常会有客户问到,这两种方案有什么区…

STL好难(7):优先级队列(priority_queue)与仿函数

目录 1.优先级队列的介绍: 2.priority_queue的函数接口 3.仿函数(函数对象)的简单理解 4.priority_queue的模拟实现: 1.优先级队列的介绍: 点击查看priority_queue的文档介绍 1. 优先队列是一种容器适配器&#x…

默认成员函数

前文提要 本文全文以日期类为例 先简单写一个日期类 class Data{ public:private:int _year;int _month;int _day; };且补充一个小知识 数据类型的划分 内置类型:是编程语言提供的基本数据类型,例如整数、浮点数、字符、布尔值 自定义类型&#xff1…

FreeRTOS实时操作系统(十二)事件标志组

系列文章目录 文章目录 系列文章目录事件标志组事件标志组API函数实验测试 事件标志组 事件标志位:用一个位来表示事件是否可以发生。 事件标志组是一组事件标志位的集合 特点: 1.每一个位表示一个事件(高8位不是) 2.每一位事件…

Java的异常Exception

异常 1、异常概述与异常体系结构 1.1、异常概述 异常:在Java语言中,将程序执行中发生的不正常情况称为“异常”(开发过程中的语法错误和逻辑错误不是异常) Java程序在执行过程中所发生的异常事件可分为两类: Erro…

装饰器模式:通过剖析Java IO类库源码学习装饰器模式

我们通过剖析Java IO类的设计思想,再学习一种新的结构型模式,装饰器模式。它的代码结构跟桥接模式非常相似,不过,要解决的问题却大不相同。 Java IO类库非常庞大和复杂,有几十个类,负责IO数据的读取…

Appium: Windows系统桌面应用自动化测试(三) 【脚本操作】

Appium: Windows系统桌面应用自动化测试 【脚本操作】 一、常用操作1、添加被测程序1.1示例一:通过程序路径指定应用程序,例如指定写字板程序路径。1.2示例二:通过程序ID指定应用程序,例如指定计算器ID。1.3 应用程序ID&#xff0…

芯片工程师求职题目之验证篇(2)

1. 事件驱动的仿真器和和基于周期的仿真器有什么区别? 事件驱动的仿真器顾名思义就是根据事件(event)触发仿真进行的,在进入一个周期中,它会获取每个事件并通过设计传播求值,直到达到稳定状态的条件,接着进入下一个周…

Android:安卓开发采用Volley网络框架+MySQL数据库,实现从服务器获取数据并展示完成记单词APP

一、功能与要求 实现功能:设计一个记单词APP。服务器采用Tomcat,数据库采用Mysql。实现用户的注册登录功能以及单词的增删改查。 指标要求:实现UI布局;将系统数据保存到Mysql数据库中,并采用Volley网络框架实现从服务…

【机器学习核心总结】什么是随机森林

什么是随机森林 森林里有很多树,随机森林里有很多决策树。 随机森林是决策树的升级版,随机指的是树的生长过程。世上没有两片相同的树叶,随机森林中的树也各不相同。在构建决策树时,我们会从训练数据中有放回的随机选取一部分样本…