之所以写这个专栏,一来希望自己通过不断地写作,在夯实数据结构知识的同时,也希望自己写的东西能够让其他人有所收获;二来希望自己的知识体系形成网络化的整体结构,而不是零散的碎片结构。
今天我们聊聊数据结构的基础知识,开始之前我们先思考以下几个问题:
-
什么是数据结构? -
数据结构到底学些什么东西?
说起数据结构,我想很多人会想到数组和链表。其实不然,这两种只不过是顺序结构和链式结构的两种表示,类似的还有队列,堆和栈等。对于数据结构这个概念并没有官方的明确定义,翻阅各种教材可以找到各种各样的说法,按照严蔚敏的教材中给的定义,数据结构(data structure)是相互之间存在一种或多种特定关系的数据元素的集合。按照我个人的理解,数据结构即为满足特定需求的数据表示方式,常见的有以下几种数据结构。
可以说数据结构是数据的表示方式,那么什么是数据呢?数据是对客观事物的符号表示,在计算机科学中是指所有能够输入到计算机中并被计算机程序处理的符号的总称。数据元素作为数据的基本单位,在计算机中程序中可以被单独处理,例如,海底捞的叫号系统,每一个取号信息可以被认为是一个数据元素,一个数据元素中又包含若干个数据项,同样以海底捞叫号系统为例,每个取号信息作为一个数据元素,其中又包括了手机号码,用餐人数等等。这些信息都被认为是一个数据项。而所有的叫号信息我们称之为数据对象(数据对象:数据相同的数据元素的集合,是数据的一个子集),具体如下图所示。
我们在计算机中操作数据的时候,需要给变量定义特定的数据类型,一定的数据类型决定了该数据所能够执行的操作的集合。例如,在C语言中,int 型的数据决定了,它可以进行+,-,*,/运算,而指针类型可以执行+,-运算,却不能执行乘法运算。因此我们可以得出数据类型的基本概念即,一个值的集合以及在这个值集上可执行的操作的总称,按照值的不同特性,我们又可以将其分成两类,一类是非结构的原子类型,即高级程序设计语言中的基本数据类型。另一类是结构类型,结构类型由基本数据类型或结构组成的非原子类型,具体如下所示。
// 原子类型
int a = 0;
float *b = 1.0;
char c = "";
bool result = false; // 结构体类型
typedef struct Person {
char *name;
int age;
int gender;
}
前面提到数据结构(data structure)是相互之间存在一种或多种特定关系的数据元素的集合,这里我们又可以将其分为,逻辑结构和物理结构两种类型。逻辑结构描述的是数据元素之间的逻辑关系,与计算机的实现无关,物理结构(存储结构)描述的是数据元素在计算机中的表示,如下所示。
数据结构在我们日常生活中随处可见,例如在食堂打饭的你站在长长的队伍中间,这就是一个典型的线性数据结构。应用到计算机程序中就是一个队列的,海底捞叫号系统等待被叫号的你就是如此。
当你在使用微信搜索附近的人寻找爱的时候,就使用了图这个数据结构来描述人与人之间的网络关系。
[1] 数据结构:C语言版 . 严蔚敏等 . 北京:清华大学出版社,2007
[2] 数据结构考研复习指导:王道论坛 . 电子工业出版社
|