数据结构-绪论
学习目标:
- 认识数据结构的基本内容
学习内容:
- 了解:数据结构的研究内容
- 掌握:数据结构的基本概念和术语
- 了解:数据元素间的结构关系
- 掌握:算法及算法的描述
数据结构的发展:
- 数据结构的发展简史
众所周知,早期的计算机主要应用于科学计算,随着计算机的发展和应用范围的拓展,计算机需要处理的数据量越来越大,数据的类型越来越多,数据结构越来越复杂,计算机的对象从简单的纯数值型数据发展为非数值型和具有一定结构的数据。要求人们对计算机加工处理的对象进行系统的研究,即研究数据的特性、数据之间存在的关系以及如何有效地组织、管理存储数据,从而提高计算机处理数据的效率。数据结构这门学科就是在此背景上逐渐形成和发展起来的。
最早对这一发展做出杰出贡献的是D.E.Kunth教授和C.A.R.Hoare(霍尔)。 D.E.Kunth的《计算机程序设计技巧》和霍尔的《数据结构札记》对数据结构这门学科的发展做出了重要的贡献。 随着计算机科学的飞速发展,到20世纪80年代初期,数据结构的基础研究日臻成熟,成为一门完整的学科。
- 数据结构的研究内容
用计算机解决一个具体的问题时,大致需要经过以下几个步骤:
- 分析问题,确定数据模型。
- 设计相应的算法。
- 编写程序,运行并调试程序,直至得到正确的结果。
寻求数据模型的实质是分析问题,从中提取操作的对象,并找出这些操作对象之间的关系,然后用数学语言加以描述。
有些问题的数据模型可以用具体的代数方程、矩阵等来表示,但更多的实际问题是无法用数学方程来表示的,下面通过几个图加以说明。
图1-1 学生成绩表
上述所示是一个学生成绩表,表中的每一行称为一条记录,并按学号升序排列,它们之间存在“一对一”的关系,是一种线性结构
,它构成了学生成绩表的逻辑结构。
学生成绩表在计算机外存中的存储方式构成该表的存储结构,在该表中查找记录、插入记录、删除记录以及对记录进行排序
等操作又构成了数据的运算。
图1-2 树形结构示意图【组织示意图】
上述所示是某高校组织示意图,其中高校名称是树根,把下设处室看成它的树枝中间结点,把处室下级单位看成树叶,这就构成了树形结构,树形结构通常用来表示结点的分层组织,结点之间是“一对多”的关系,除根结点之外,每个结点有且只有一个父结点
。这种结构也是一种数据结构,其主要操作是遍历、查找、插入或删除
等。
图1-3 七桥图
Euler在1736年访问俄罗斯的哥尼斯堡时,他发现当地的居民正从事一项非常有趣的消遣活动。哥尼斯堡城中有一条名叫普莱格尔的河流,在河上建有七座桥,如图1-3所示。
这项有趣的消遣活动是在星期六做一次走过所有7座桥的散步,每座桥只能经过一次而且起点与终点必须是同一地点。
图1-4 欧拉回路
设4块陆地分别为A、B、C、D,Euler把每一块陆地看成一个点,连接两块陆地的桥以线表示,如图1-4 所示。
后来推论出此种走法是不可能的。他的论点是这样的,除了起点以外,每一次当一个人由一座桥进入一块陆地(或点)时,他同时也由另一座桥离开此点。即每个点如果有进去的边就必须有出来的边,因此每一个陆地与其他陆地连接的桥数必为偶数。7座桥组成的图形中,没有一点含有偶数条数,因此上述的任务时不可能实现的。
和上述问题相似,生活中还有不少的实例,如通信网和公路网都是“多对多”的关系,具有这种关系的结构称为图形结构
。其主要的操作有遍历、求最短路径
等。
类似的还有工资管理系统、棋类对弈问题等。对于这些非数值问题的描述,都是上述的表、树和图之类的数据结构,并且这些数据结构的元素和元素之间都存在着相互关系。
因此,数据结构是一门抽象地研究数据
之间的关系的学科。
数据结构的基本概念和术语:
- 数据
数据是指在计算机科学中能够被计算机输入、存储、处理和输出的一切信息,是计算机处理的信息的某种特定的符号表示形式。包括数字、英文、汉字以及表示图形、声音、光和电的符号等。
- 数据项
图1-1 学生成绩表
数据项是数据的最小单位
,有时也称为域,即数据表中的字段,如图1-1所示。数据项是具有独立含义且不可分割的最小标识单位。
- 数据元素
数据元素是数据的基本单位
,在计算机信息处理中通常作为一个整体来考虑。一个数据元素可以由若干个数据项组成
,数据元素也称为元素、结点、顶点、记录。如图1-1所示。
- 数据对象
数据对象是具有性质相同的数据元素的集合,是数据的一个子集。
例如大写字母字符数据对象是集合C={‘A’,‘B’,‘C’,…,‘Z’};整数数据对象是集合N={0,±1,±2,…}。
- 数据类型
数据类型是一个值的集合和定义在这个值集合上的一组操作的总称。
数据类型中定义了两个集合:值集合和操作集合。
其中值集合定义了该类型数据元素的取值,操作集合定义了该类型数据允许参加的运算。
例如C语言中的int类型,取值范围是[-32768,32767],主要的运算为加、减、乘、除、取模、乘方等。
按数据元素取值的不同特性,高级语言中的数据类型一般都包括两部分:原子类型和结构类型
。
原子类型的值是不可分的
,例如,C语言中的int类型、char类型、float类型。
结构类型是通过若干成分(可以是原子类型或结构类型)构造而成的
。高级语言一般都提供用户自定义结构类型的机制。
- 数据结构
数据结构是带结构的数据元素的集合,描述了一组数据元素及元素间的相互关系。
数据元素间的关系包括3个方面:数据的逻辑结构、存储结构和操作集合。
数据的逻辑结构:
逻辑结构是指数据元素之间的逻辑关系,是用户根据使用需要建立起来的数据组织形式,是独立于计算机的。根据数据元素之间的不同关系,有以下四种基本逻辑结构。
- 线性结构
图1-5(a)线性结构
其中的数据元素之间是“一对一”的关系
。在线性结构中,有且仅有一个开始结点和一个终端结点,除了开始结点和终端结点,其余结点都有且仅有一个直接前驱和一个直接后继
,如图1-5(a)所示。
- 树形结构或层次结构
图1-5(b) 树形结构
其中的数据元素之间存在着“一对多”的关系
。比如,部门之间的隶属关系、人类社会的父子关系、上下级关系等。在树形结构中,除根结点之外,每个结点都有唯一的直接前驱,所有的结点都可以有0个或多个直接后继
,如图1-5(b)所示。
- 图形结构或网状结构
图1-5(c)图形结构
其中的数据元素之间存在着“多对多”的关系
。在图状结构中,每个结点都可以有多个直接前驱和多个直接后继
,如图1-5(c)所示。
- 集合结构
图1-5(d)集合结构
数据元素间除了“同属于一个集合”的关系外,无任何其他关系
。由于集合关系非常松散,因此可以用其他的结构代替,如图1-5(d)所示。
数据的逻辑结构可概括为两大类:线性结构和非线性结构
。
线性结构包括线性表、栈、队列、字符串、数组、广义表;
非线性结构包括树、二叉树和图。
一个数据结构的逻辑结构G可以用二元组来表示:G=(D,R)
其中:D是数据元素的集合,R是D上所有数据元素之间关系的集合(表示各元素的前驱、后继关系)。R关系中圆括号表示双向,尖括号表示单向
。
【例1-1】一种数据结构Graph=(D,R),其中:
r中的(A,B)表示顶点A到顶点B之间的边是双向的,上述的结构关系如图1-6所示。
图1-6 图形结构
数据的存储结构:
数据的存储结构又称物理结构
,是数据的逻辑结构在计算机存储器中的存储形式(或称映像)。对机器语言来说,这种存储形式是具体的,高级语言可以借助它的数据类型来描述存储形式的具体细节。依据数据元素在计算机中的表示,主要有以下4种不同的存储结构。
- 顺序存储结构
是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,可以用一维数组描述。
- 链式存储结构
是借助指示元素存储地址的指针来表示数据元素之间的逻辑关系。可用指针类型描述,数据元素不一定存在地址的存储单元,存储处理的灵活性较大。
- 索引存储
是在原有存储数据结构的基础上,附加建立一个索引表,索引表中的每一项都由关键字和地址组成。采取索引存储结构的主要作用是提高数据的检索速度。
- 散列存储
是通过构造散列函数来确定数据存储地址或查找地址。
算法和算法的描述:
算法和数据结构的关系紧密,任何一个算法的设计都取决于选定的数据的逻辑结构,而算法的实现则依赖于数据所采用的数据结构。
- 什么是算法
算法的概念:算法是为了解决某类问题而规定的一个有限长的操作序列,是对解题过程的准确而完整的描述。
算法的特性:
- 输入:
一个算法必须有0个或多个输入
,这些输入取自于特定的对象集合。可以使用输入语句由外部提供,也可以使用赋值语句在算法内给定。 - 确定性:算法的每一步都应确切地、无歧义地定义。对于需要执行地动作都应严格地、清晰地规定。
- 有穷性:一个算法无论在什么情况下都应在执行有穷步后结束。
- 可行性:一个算法是可执行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。
- 输出:
一个算法应有一个或多个输出
,输出的量是算法计算的结果。
算法和程序的区别:
- 算法设计的要求
通常设计一个好的算法应考虑达到如下目标:
- 算法的描述
算法可以用流程图、自然语言、计算机程序语言或其他语言来描述
,但描述必须精确地说明计算过程。
为了便于理解和掌握算法的思想和实质,采用类C语言进行算法描述。类C语言实际上是对C语言的一种简化,保留了C语言的精华,忽略了C语言语法规则中的一些细节,这样描述出的算法清晰、直观、便于阅读和分析。
算法是以函数形式描述,描述如下:
类型标识符函数名(形式参数表)
/*算法说明*/
{语句序列}
算法说明是不可缺少的部分,是对算法的功能、数据存储结构、形式参数的含义等的说明。
- 算法效率的评价
对于一个给定的问题求解,往往可以设计出若干个算法。如何评价这些算法的优劣呢?一个正确的算法效率通常用时间复杂度与空间复杂度来评价。
- 时间复杂度
一个算法的执行时间等于其所有语句执行时间的总和,而任一语句的执行时间为该语句的执行次数与该语句执行一次所需时间的乘积
。当算法转换成程序之后,每条语句的执行时间取决于机器的硬件速度、指令类型及编译的代码质量,而这些是很难确定的。因此,将算法中基本操作重复执行的次数作为算法执行时间的量度。
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作:T(n)=O(f(n))
。
它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度。时间复杂度不是精确的执行次数,而是估算的数量级,它主要体现的是随着问题规模n的增大,算法执行时间的变化趋势。
【例1-2】有下列3条语句
(a)x=0 //执行了一次,时间复杂度为O(1)
(b)for(i=1;i<=n;i++)x=x+1 //语句 x=x+1 执行了n次,时间复杂度为O(n)
(c)for(i=1;i<=n;i++)
for(j=1;j<=n;j++)x=x+i*j //赋值语句要执行n^2次,时间复杂度为O(n^2)
不同的数量级的时间复杂度增长率是不同的,当问题规模n越大时,其关系如下:
O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)
- 空间复杂度
一个程序的空间复杂度是指程序运行从开始到结束所需要的存储空间
。包括算法本身所占用的存储空间、输入/输出数据占用的存储空间以及算法在运行过程中的工作单元和实现算法所需辅助空间。类似于算法的时间复杂度,算法所需存储空间的量度记作:S(n)=O(f(n))
。
其中n为问题的规模。在进行空间复杂度分析时,若输入数据所占空间只取决于问题本身,和算法无关,则只需要分析除输入和程序之外的额外空间,否则应同时考虑本身所需空间。
相关文章:

数据结构-绪论
学习目标: 认识数据结构的基本内容 学习内容: 了解:数据结构的研究内容掌握:数据结构的基本概念和术语了解:数据元素间的结构关系掌握:算法及算法的描述 数据结构的发展: 数据结构的发展简史 …...

Web开发:web服务器-Nginx的基础介绍(含AI文稿)
目录 一、Nginx的功能: 二、正向代理和反向代理的区别 三、Nginx负载均衡的主要功能 四、nginx安装目录下的各个文件(夹)的作用: 五、常用命令 一、Nginx的功能: 1.反向代理:例如我有三台服务器&#x…...

共享经济背景下校园、办公闲置物品交易平台-计算机毕设Java|springboot实战项目
🍊作者:计算机毕设残哥 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目、 源…...
Linux 服务器上简单配置 minio
Linux 服务器上简单配置 minio 初始化结构目录 mkdir -p /data/minio/bin mkdir -p /data/minio/conf mkdir -p /data/minio/data 下载 minio cd /data/minio/bin curl -O https://dl.min.io/server/minio/release/linux-amd64/minio 添加执行权限 chmod x minio 创建配置文件…...
TypeScript 面试题汇总
引言 TypeScript 是一种由微软开发的开源、跨平台的编程语言,它是 JavaScript 的超集,为 JavaScript 添加了静态类型系统和其他高级功能。随着 TypeScript 在前端开发领域的广泛应用,掌握 TypeScript 已经成为很多开发者必备的技能之一。本文…...
杰卡德系数
杰卡德系数(Jaccard Index 或 Jaccard Similarity Coefficient) 杰卡德系数是一种用于衡量两个集合相似度的重要指标。 从数学定义上来看,如前面所述,杰卡德系数计算公式为: J ( A , B ) ∣ A ∩ B ∣ ∣ A ∪ B ∣…...

微服务实现-sleuth+zipkin分布式链路追踪和nacos配置中心
1. sleuthzipkin分布式链路追踪 在大型系统的微服务化构建中,一个系统被拆分成了许多微服务。这些模块负责不同的功能,组合成系统,最终可以提供丰富的功能。 这种架构中,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软…...
数学中常用的解题方法
文章目录 待定系数法应用示例1. 多项式除法2. 分式化简3. 数列通项公式 总结 递归数列特征方程特征根的求解通项公式的求解示例 错位相减,差分错位相减法差分的应用结合理解 韦达定理二项式定理二项式定理的通项公式二项式系数的性质应用示例 一元二次求解1. 因式分…...
pytorch 1 张量
张量 文章目录 张量torch.Tensor 的 主要属性torch.Tensor 的 其他常用属性和方法叶子张量(Leaf Tensors)定义叶子张量的约定深入理解示例代码总结 中间计算结果与 detach() 方法定义中间计算结果不是叶子节点使用 detach() 方法使中间结果成为叶子张量示…...

音视频开发继续学习
RGA模块 RGA模块定义 RGA模块是RV1126用于2D图像的裁剪、缩放、旋转、镜像、图片叠加等格式转换的模块。比方说:要把一个原分辨率1920 * 1080的视频压缩成1280 * 720的视频,此时就要用到RGA模块了。 RGA模块结构体定义 RGA区域属性结构体 imgType&am…...

【Datawhale X 魔搭 】AI夏令营第四期大模型方向,Task1:智能编程助手(持续更新)
在一个数据驱动的世界里,人工智能的未来应由每一个愿意学习和探索的人共同塑造和掌握。希望这里是你实现AI梦想的起点。 大模型小白入门:https://linklearner.com/activity/14/11/25 大模型开发工程师能力测试:https://linklearner.com/activ…...

如何判断监控设备是否支持语音对讲
目录 一、大华摄像机 二、海康摄像机 三、宇视摄像机 一、大华摄像机 注意:大华摄像机支持跨网语音对讲,即设备和服务器可以不在同一网络内,大华设备的语音通道填写:34020000001370000001 配置接入示例: 音频输入…...

Grafana+Influxdb(Prometheus)+Apache Jmeter搭建可视化性能测试监控平台
此性能测试监控平台,架构可以是: GrafanaInfluxdbJmeterGrafanaPrometheusJmeter Influxdb和Prometheus在这里都是时序性数据库 在测试环境中,压测数据对存储和持久化的要求不高,所以这里的组件可以都通过docker-compose.yml文件…...

【笔记】MSPM0G3507移植RT-Thread——MSPM0G3507与RT_Thread(二)
一.创建新工程 找到"driverlib\empty"空白工程,CTRLC然后CTRLV复制副本 重命名为G3507_RTT 打开KEIL工程 双击empty.syscfg,然后打开SYSCONFIG 我的不知道为啥没有48pin选项,如果你也一样,可以跟着我做,如果…...

计算机毕业设计 美发管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...

soapui调用接口参数传递嵌套xml,多层CDATA表达形式验证
1.环境信息 开发工具:idea 接口测试工具:soapui 编程语言:java 项目环境:jdk1.8 webservice:jdk自带的jws 处理xml:jdk自带的jaxb 2.涉及代码 package org.example.webdemo;import javax.jws.WebMethod; i…...
GB/T35561-2017d,GB/T38565-2020,ocr解析文本
因系统需要只找到pdf版本,解析一版记录 GB/T35561-2017d 10000 , 自然灾害 10100 , 水旱灾害 10101 , 洪水 10102 , 内涝 10103 , 水库重大险情 10104 , 堤防重大险情 10105 , 凌汛 10106 , 山洪 10107 , 农业干旱 10108 , 城镇缺水 10109 , 生态干旱 10110 , 农村…...

IDEA使用LiveTemplate快速生成方法注释
本文目标:开发人员,在了解利用Live Template动态获取方法输入输出参数、创建日期时间方法的条件下,进行自动生成方法注释,达到自动添加方法注释的程度; 文章目录 1 场景2 要点2.1 新增LiveTemplate模版2.2 模版内容填写…...

慢SQL优化
1、避免使用select * select * 不会走覆盖索引,会出现大量的回表操作,从而导致查询sql的性能很低。 --反例 select * from user where id 1;--正例 select name,age from user where id 1;2、union all 代替 union union:去重后的数据…...

MES生产执行系统源码,支持 SaaS 多租户,技术架构:springboot + vue-element-plus-admin
MES的定义与功能 MES是制造业中一种重要的管理信息系统,用于协调和监控整个生产过程。它通过收集、分析和处理各种生产数据,实现对生产流程的实时跟踪和监控,并为决策者提供准确的数据支持。MES涵盖了工厂运营、计划排程、质量管理、设备维护…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...