我将采用“迂回”的方式来回答题主的问题。
先来说说数据类型和抽象数据类型,先看下面3个例子。
例1,如果我给你一个整数你会获得哪些信息?
主要可以得到如下信息:
该整数应该是$-\infty, \ldots, -1, -2, 0, 1, 2, \ldots +\infty$中的一个
可对该整数进行加、减、乘、除、取模、开方等操作
该整数与另一整数的关系
具有相同性质
属于同一个集合 $\left(-\infty, +\infty\right)$的关系
例2,如果我给你一个C语句int num;(32位机器)你能获得哪些信息?
主要可以得到如下信息
可对num赋予$\left[-2^{31},2^{31} -1\right]$中的任意值
可对num执行加、减、乘、除、取模、开方等操作
num与其他int num2;的关系
具有相同性质
同属一于$\left[-2^{31},2^{31} -1\right]$这个集合
例3,如果我给你一个队列你会获得哪些信息?
主要可以得到如下信息
队列中可以存放某一种数据集(整数、实数、字符、等等)
队列支持入队(enqueue)、出队(dequeue)、判空(isEmpty)、队列长度(size/length)等操作
队列中的数据元素A与数据元素B(假定A先入队、B后入队)的关系
首先,A、B来自同属一个数据集
其次,A在B之前
先进入队列的数据元素一定在后进入队列的数据元素的前面
一对一关系
最后,A先于B出队
先进入队列的数据元素一定比后进入队列的数据元素先离开队列
也就是常说的先进先出FIFO
理解了上面的内容,我们来看看教课书上的一些定义。
数据类型的定义(Data Type):
一个数据类型定义了
数据对象(整数范围内的所有数),也可说成一组值或值的集合或一组元素的集合等
数据对象上可进行的操作集(加、减、乘、除、取模、开方)
数据对象中的每个数据元素之间的关系
同属一个集合
一对一
一对多
多对多
解释
数据对象:是性质相同的数据元素的集合,是数据的子集
数据对象:可以类比成整数集合
数据元素:可以类比成我给你的那个整数,与其他整数具有相同的性质
是数据的子集:计算机中的数据还有声音、图像等其他数据对象
抽象数据类型(Abstract Data Type, ADT)
与数据类型一样需要定义数据对象、操作集、及数据对象中各个数据元素之间的关系。
与数据类型的唯一的区别是其对“数据对象”的定义是泛化的可以是任意你想要的类型
如例2中的int就是一个数据类型
其数据对象只能是$\left[-2^{31},2^{31} -1\right]$中的任意值
而列3中的队列其实是抽象数据类型
其数据对象是泛化的某一种数据集
什么是数据结构?
业界并无明确定义,算法导论中给出如下定义:
A data structure is a way to store and organize data in order to facilitate
access and modifications.
个人比较喜欢的定义是:数据结构是基于某一编程语言对抽象数据类型进行【高效】的实现。
通常所说线性表、队列、栈等其实说的是抽象数据类型,只给出相应的定义但不涉及具体的实现。
什么是逻辑结构?
数据结构这门主要就是教你干三件事:
将现实世界中的事物以计算机能够理解的方式(符号化、离散化)存储到计算机中
编程语言教会你符号化
离散数学教会你离散化
同时存储事物之间的逻辑关系
高效地实现相应的操作
所谓逻辑结构指的是现实世界中事物间的逻辑关系。
因现实世界中的事物集已经被存储到了计算机中,所以就给其起了个泛化了的名字叫数据对象
所以课本上的定义是逻辑结构:是指数据对象中的数据元素之间的相互关系
现实世界中的某一事物集 => 数据对象
某一事物集合中的某一事物 => 数据元素
什么是物理结构/存储结构?
了解了逻辑结构,再来说说物理结构/存储结构。
课本中的定义:
物理结构:是指数据的逻辑结构在计算机中的存储形式
翻译过来就是事物A与事物B的逻辑关系,在计算机中是如何表示的
得益于抽象,我们在编程时常常将内存看成是一片连续的存储单元(一个大数组)
存储结构:描述的是如何用存储单元之间的物理关系来表示现实世界中事物间的逻辑关系
如果事物A与事物B是一对一关系,或优先关系即A优先于B
用两个连续的存储单元来存储事物A和事物B即可
优先可以通过规定先读取哪个存储单元或存储单元编号的大小来表示
如果事物A与事物B、事物C是一对多关系
可以使用三个连续的存储单元也可以用不连续的
如果用不连续的存储单元,则存储事物A的存储单元需要记录存储B、C的存储单元的地址
如果用连续的存储单元,可以根据存储单元编号的算术运输结构来表示
二叉树根节点A,在数组的0地指处
左子树根节点B,在数组的1地址处
右子树根节点C,在数组的2地址处
全文完
$$