当前位置: 首页 > news >正文

数据结构基本概念和术语

前言

数据结构的研究内容

通常,用计算机解决一个问题的步骤:首先具体问题抽象为数学模型,然后设计算法,最后编程、调试、运行。

具体问题抽象为数学模型的实质:分析问题、提取操作对象、找出操作对象之间的关系、用数学语言描述。这其中的操作对象和操作对象之间的关系就是数据结构

随着计算机应用领域的扩展,计算机被越来越多地用于非数值计算,比如学生信息录入修改等。

举例1:

操作对象:每位学生的信息(学号、姓名、性别、籍贯、专业...)

操作算法:查询、插入、修改、删除等。

操作对象之间的关系:线性关系 

数据结构:线性数据结构、线性表。

举例2:

操作对象:人机对弈,由当前格局派生新的格局

计算机的操作对象:各种棋局状态,即描述棋盘的格局信息

计算机的算法:走棋,即选择一种策略使棋局状态发生变化(由一个格局派生出另一个格局)

操作对象之间的关系:非线性关系

数据结构:树

举例3:

文件系统的系统结构图:磁盘根目录下有很多子目录及文件,每个子目录又可以包含多个子目录及文件,但每个子目录只有一个父目录,依次类推;

本问题是一种典型的树形结构问题,数据与数据之间成一对多的关系,是一种典型的非线性结构--树形结构。

举例4:

地理信息处理:地图导航--求最短路径(最快路径)

问题:找到图中两点之间的最短路径或最经济路径。

操作对象:各地点及路的信息。

计算机算法:设置信号灯,求出各个可同时通行的路的集合。

对象之间的关系:非线性关系,网状结构

综上所述,这些问题的共性是都无法用数学的公式或方程来描述,是一些“非数值计算”的程序设计问题。

描述非数值计算问题的数学模型不是数学方程,而是诸如表、树和图之类的具有逻辑关系的数据。

数据结构是一门研究非数值计算的程序设计中计算机的操作对象以及它们之间的关系操作的学科。

 

基本概念和术语

1.数据(Data)

能输入计算机且被计算机处理的各种符号的集合,叫做数据。是信息的载体,是对客观事物符号化的表示,能够被计算机识别、存储和加工。

包括两类:

数值型的数据:整数、实数等;

非数值型的数据:文字、图像、图形、声音等。

2.数据元素(Data Element)

是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。如学生表里的一条学生信息(包括姓名、学号等)。

也简称为元素,或称为记录、结点或顶点。

3.数据项(Data Item)

构成数据元素的不可分割的最小单位。如上述学生表里一条学生信息里的姓名、学号都是数据项。

4.数据对象(Data Object)

是性质相同的数据元素的集合,是数据的一个子集。

例如整数数据对象是集合N={0,+-1,+-2,...}

(1)数据、数据元素、数据项三者之间的关系:

数据 > 数据元素 > 数据项

例:学生表 > 学生记录  > 学号、姓名...

(2)数据元素与数据对象的区别:

数据元素:组成数据的基本单位。与数据的关系:是集合的个体

数据对象:性质相同的数据元素的集合。与数据的关系:是集合的子集(如学生表里所有女生是一个数据对象)

5.数据结构(Data Structure)

数据元素不是孤立存在的,它们之间存在着某种关系,数据元素相互之间的关系称为结构(Structure),是指相互之间存在一种或多种特定关系的数据元素集合,或者说,数据结构是带结构的数据元素的集合

数据结构包括以下三种方面的内容:

(1)数据元素之间的逻辑关系,也称为逻辑结构

(2)数据元素及其关系在计算机内存中的表示(又称为映像),称为数据的物理结构或数据的存储结构

(3)数据的运算和实现,即对数据元素可以施加的操作以及这些操作在相应的存储结构上的实现

逻辑结构:描述数据元素之间的逻辑关系,与数据的存储无关,独立于计算机,是从具体问题抽象出来的数学模型。

物理结构(存储结构):数据元素及其关系在计算机存储器中的结构(存储方式),是数据结构在计算机中的表示

逻辑结构与存储结构的关系:

存储结构是逻辑关系的映像与元素本身的映像。

逻辑结构是数据结构的抽象,存储结构是数据结构的实现。

两者综合起来就建立了数据元素之间的结构关系。

6.逻辑结构的种类

划分方法一:

(1)线性结构(1:1):有且近有一个开始和一个终端结点,并且所有结点都最多只有一个直接前驱和一个直接后继。例如:线性表、栈、队列、串

(2)非线性结构(1:n或n:n):一个结点可能有多个直接前驱和直接后继。例如:树、图

划分方法二:四类基本逻辑结构

(1)集合结构:结构中的数据元素之间除了同属于一个集合的关系外,无任何其他关系。

(2)线性结构:结构中的数据元素之间存在着一对一线性关系

(3)树形结构:结构中的数据元素之间存在着一对多层次关系

(4)图形结构:结构中的数据元素之间存在着多对多任意关系

线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构,顺序存储的线性表叫顺序表,顺序表中的存储元素是连续的,链式存储的线性表叫链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息。

线性结构常见的有:数组、队列、链表和栈

非线性结构常见的有:二维数组,多维数组,广义表,树,图

7.存储结构的种类

四种基本的存储结构:

(1)顺序存储结构:用一组连续的存储单元按照数据元素的顺序依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示。--对应Java的数组。

(2)链式存储结构:用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针(本质就是地址)来表示。Java也是用指针来实现链式存储结构。

(3)索引存储结构:在存储结点信息的时候,还建立附加的索引表。类似于Java的LinkedHashSet集合。索引表中的每一项称为一个索引项,索引项的一般形式是(关键字,地址),关键字是能唯一标识一个结点的那些数据项。若每个结点在索引表中都有一个索引项,则该索引表称之为稠密索引。若一组结点在索引表中只对应一个索引项,则该索引表称之为稀疏索引。

(4)散列存储结构:根据结点的关键字直接计算出该节点的存储地址,HashSet和HashMap。

8.数据类型和抽象数据类型

在使用高级程序设计语言编写程序时,必须对程序中出现的每个变量、常量或表达式,明确说明它们所属的数据类型。如int、char、String等,指针类型、空(void)类型。

一些最基本数据结构可以用数据类型来实现,如数组、字符串等;

而另一些常用的数据结构,如栈、队列、树、图等,不能直接用数据类型来表示。

高级语言中的数据类型明显地或隐含地规定了在程序执行期间变量和表达的所有可能的取值范围,以及在这些数值范围上所允许进行的操作。

数据类型的作用:约束变量或常量的取值范围,约束变量或常量的操作。

数据类型的定义:数据类型是一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称。

数据类型=值的集合+值集合上的一组操作

抽象数据类型:是指一个数学模型以及定义在此数学模型上的一组操作。

由用户定义,从问题抽象出数据模型(逻辑结构)

还包括定义在数据模型上的一组抽象运算(相关操作)

不考虑计算机内的具体存储结构与运算的具体实现算法

抽象数据类型的形式定义:

抽象数据类型可用(D,S,P)三元组表示,其中D是数据对象;S是D上的关系集,P是对D的基本操作集。

一个抽象数据类型的定义格式如下:

ADT 抽象数据类型名{

    数据对象:<数据对象的定义>

    数据关系:<数据关系的定义>

    基本操作:<基本操作的定义>

}ADT 抽象数据类型名

其中数据对象、数据关系定义用伪码描述,基本操作的定义格式为:基本操作名(参数表)、初始条件:<初始条件描述>、操作结果:<操作结果描述>

 

程序 = 数据结构 + 算法

 

参考:青岛大学王卓老师讲课内容

相关文章:

  • 线程状态
  • Object类中wait带参方法和notifyAll方法
  • File类
  • 递归(斐波那契数列、类加、累乘、打印多级目录)
  • FileFilter过滤器
  • LeetCode两数之和
  • 稀疏数组
  • 队列
  • 单链表LinkedList的增删改查
  • 双向链表和环形链表(单向和双向)约瑟夫环实例
  • IO流概述+字节输出流
  • 字节输入流
  • 字符流(字符输入流和字符输出流)
  • IO异常的处理
  • 栈Stack(数组模拟、单链表模拟)
  • JavaScript-如何实现克隆(clone)函数
  • .pyc 想到的一些问题
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • bearychat的java client
  • JS学习笔记——闭包
  • JS字符串转数字方法总结
  • orm2 中文文档 3.1 模型属性
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 大整数乘法-表格法
  • 浮动相关
  • 原生Ajax
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • (06)金属布线——为半导体注入生命的连接
  • (1)虚拟机的安装与使用,linux系统安装
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • .net framework profiles /.net framework 配置
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .Net 高效开发之不可错过的实用工具
  • .net中我喜欢的两种验证码
  • @GlobalLock注解作用与原理解析
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [AIGC] Spring Interceptor 拦截器详解
  • [CSS]盒子模型
  • [EULAR文摘] 脊柱放射学持续进展是否显著影响关节功能
  • [G-CS-MR.PS02] 機巧之形2: Ruler Circle
  • [HEOI2013]ALO
  • [hibernate]基本值类型映射之日期类型
  • [IE编程] 打开/关闭IE8的光标浏览模式(Caret Browsing)
  • [MySQL] 二进制文件
  • [nowCoder] 两个不等长数组求第K大数