Ch1 绪论 (1) | 数据结构

714 阅读5分钟

第 1 章 绪论

2022.9.5

这是数据结构第一次课,介绍了绪论的前两节内容,即引言和数据结构相关的基本概念和术语

1.1 引言

数据结构是什么?

"Algorithms + Data Structure = Programs"

-- Niklaus Wirth

  • 程序 = 算法 + 数据结构(出自 Niklaus Wirth,PASCAL 之父,图灵奖得主)

数据结构与算法相辅相成,共同组成程序:

  • 数据结构关注数据在计算机中如何有效地组织起来。
  • 算法关注数据如何经过运算解决问题

数据在计算机中的表示、存储和操作

冯·诺依曼体系结构是现代计算机的基础,计算机由控制器、运算器、存储器、输入设备、输出设备五部分组成:

_Users_20418_AppData_Roaming_Typora_typora-user-images_image-20220905215846484.png

按照与 CPU 的接近程度,存储器分为内存储器外存储器,简称内存与外存:

Pasted image 20220905220159.png

CPU 与内存之间由地址总线和数据总线连接:

Pasted image 20220905220726.png

操作系统为每一个进程提供了一个假象,好像每个进程都在独占地使用主存。每个进程看到的存储器都是一致的,称之为虚拟地址空间。

  • 32 位系统虚拟地址空间为 4GB
  • 如地址 0x00CC0000 就是一个 8 位 16 进制数

Pasted image 20220905220950.png

例如 Linux 进程内存地址空间:

Pasted image 20220905221156.png

  • Text segment :代码段(储存程序的二进制机器码)
  • Data segment :初始化的全局变量、静态变量等
  • BSS segment :未初始化的全局变量和静态变量
  • Stack :函数调用时,局部变量、参数值和返回值
  • Heap :运行时内存分配,如 malloc 函数分配的内存

接下来老师在 CLion 中用单步调试演示了内存中数据存储的方式和指针类型的操作。


1.2 基本概念和术语

基本术语

数据(data):信息的载体,被计算机识别、存储和加工处理的对象。

数据元素(data element):数据的基本单位,是数据集合中的一个个体,一个数据元素可由若干个数据项组成。

数据项(data item):具有独立含义的标识单位,是数据不可分割的最小单位。

数据对象(data object):性质相同的数据元素的集合,是数据的一个子集。(某种数据类型元素的集合)

数据对象可以是有限的,也可以是无限的。

例:整数的数据对象是无限的;英文字符类型的数据对象是有限的

数据结构(data structure):相互之间存在着一种或多种特定关系的数据元素的集合。

结构(structure):数据元素之间的关系,可以看作是从具体问题抽象出来的数学模型,与计算机无关,与数据的存储无关,也叫做逻辑结构


逻辑结构

逻辑结构可用一个二元组表示:

Data_Structure=(D,S){\rm Data\_Structure} = (D, S)

DD :数据元素的有穷集合SS :D 上关系的有穷集合

Pasted image 20220905224153.png

根据数据元素间关系的不同特性,数据的逻辑结构常分为以下四类:

Pasted image 20220905225105.png

  • 集合结构(数据元素同属于一个集合
  • 线性结构(数据元素之间存在一对一关系)
  • 树形结构(数据元素之间存在一对多关系)
  • 图形结构(数据元素之间存在多对多关系)

存储结构

存储结构(物理结构)是指数据结构在计算机中的映像表示。

数据元素的映像

  • 每个数据元素的映像称为结点(node)
  • 每个数据项的映射称为数据域(data field)

关系的映像

最常用的是两种基本方法:

  • 顺序:以相对的存储位置表示关系(逻辑相邻即为物理相邻)
  • 链式:以附加信息(指针)表示关系(逻辑相邻但一般不物理相邻)

数据存储的两种常用结构

顺序存储:数据元素依次放在连续的存储单元中

例如:数组

链式存储:在存储结点中增加若干指针域,记录后继或者相关结点的地址(指针)

例如:链表


运算(操作)

运算(操作)是在数据逻辑结构上定义的一组数据被使用的方式,其具体实现要在存储结构上进行。

几种常用的运算:

  • 建立数据结构
  • 清除数据结构
  • 插入数据元素
  • 删除数据元素
  • 排序
  • 检索*
  • 更新
  • 判空和判满*
  • 求长*

带 * 操作为引用型操作,即数据值不发生变化;
其他为加工型操作

Pasted image 20220905230655.png


抽象数据类型

数据类型(data type):最早在程序设计语言中表示变量所具有的数据种类,是一个值的集合和定义在这个值上的一组操作的总称。

例1 在 C 语言中,数据类型分为基本类型和构造类型

基本类型:整型、浮点型、字符型
构造类型:数组、结构、联合、指针、枚举、自定义

例2 在 Python 语言中除布尔、整数、浮点外还有字符串、列表、元组、字典等类型

抽象数据类型 ADT(Abstract Data Type)

抽象数据类型是数据类型概念的引申,指一个数学模型以及在其上定义的操作集合,与计算机无关。实际上就是对该数据结构的定义。因为它定义了一个数据的逻辑结构以及在此结构上的一组算法。

抽象数据类型可以用三元组表示:

(D,S,P)(D,S,P)

DD :数据对象;SS :D 上的关系集;PP :D 的基本操作集

抽象数据类型的描述方法

ADT 抽象数据类型名 {
    数据对象:<数据对象的定义>
    数据关系:<数据关系的定义>
    基本操作:<基本操作的定义>
}ADT 抽象数据类型名

其中基本操作的定义格式为:

基本操作名(参数表)
  初始条件:<初始条件描述>
  操作结果:<操作结果描述>

基本操作有两种参数:

  • 赋值参数 只为操作提供输入值
  • 引用参数 除可提供输入值外,还将返回该参数值在操作后的变化结果

初始条件 描述了操作执行之前数据结构和参数应满足的条件,若不满足,则操作失败,并返回相应出错信息

操作结果 说明了操作正常完成之后,数据皆否的变化状况和应返回的结果

下一节