一、什么是数据结构

        数据作为计算机加工处理的对象,在计算机中如何表示、存储是计算机科学研究的主要内容之一,更是计算机技术需要解决的问题之一。要使计算机能够更有效地进行这些非数值性处理,就必须弄清楚这些操作对象的特点,在计算机中的表示方式以及各个操作的具体实现手段。这些就是数据结构研究的主要内容。

        数据结构是计算机中对数据的一种存储和组织方式,同时也泛指相互之间存在一种或多种特定关系的数据的集合。数据结构是计算机艺术的一种体现,合理的数据结构能够提高算法的执行效率,还可以提高数据的存储效率。

        “数据结构是抽象数据类型ADT的物理实现。”这是Clifford A.Shaffer在其《数据结构与算法分析》一书中定义的。其中抽象数据类型的英文全称为Abstract DataType,简称为ADT。


数据结构与算法分析英语 数据结构与算法分析clifford_队列

《数据结构(C语言版)》严蔚敏_吴伟民,一书中描述的数据结构的地位

二、基本概念

        在绝大多数教材里面都是包含如下几点:

        数据(Data):数据是信息的载体,其能够被计算机识别、存储和加工处理,是计算机程序加工的“原材料”。数据包括的类型非常广,如基本的整数、字符、字符串、实数等,此外,图像和声音等也都可以认为是一种数据。

        数据元素(Data Element):数据元素是数据的基本单位,也称为元素、结点、顶点、记录等。一般来说,一个数据元素可以由若干数据项组成,数据项是具有独立含义的最小标识单位。数据项也可称为字段、域、属性等。

        数据结构(Data Structure):数据结构指的是数据之间的相互关系,即数据的组织形式。这就是本章所要讨论的主要内容。


数据结构与算法分析英语 数据结构与算法分析clifford_链表_02

4类基本结构

三、数据结构的内容

        数据的逻辑结构(Logical Structure):即数据元素(Data Element)之间的逻辑关系。数据的逻辑结构是从逻辑关系上描述数据的,与数据在计算机中如何存储无关,也就是独立于计算机的抽象概念。从数学分析的角度来看,数据的逻辑结构可以看作从具体问题抽象出来的数学模型。

        数据的存储结构(Storage Structure):即数据元素(Data Element)及其逻辑关系在计算机存储器中的表示形式。数据的存储结构依赖于计算机语言,是逻辑结构用计算机语言的实现。一般来说,只有在高级语言的层次上才会讨论存储结构,在低级的机器语言中,存储结构是具体的。

        数据的运算:即能够对数据施加的操作。数据的运算的基础为数据的逻辑结构,每种逻辑结构都可以归纳为一个运算的集合。在数据结构范畴内,最常用的运算包括检索、插入、删除、更新、排序等。

四、数据结构的分类

        线性结构,线性结构就是表中各个结点具有线性关系。如果从数据结构的语言来描述的话,线性结构应该包括如下内容:

        线性结构是非空集;

        线性结构有且仅有一个开始结点和一个终端结点;

        线性结构所有结点最多只有一个直接前趋结点和一个直接后继结点。前面提到的线性表就是典型的线性结构,还有栈、队列和串等都是线性结构。

        非线性结构,非线性结构就是表中各个结点之间具有多个对应关系。如果从数据结构的语言来描述,非线性结构应该包括如下内容:

        非线性结构是非空集;

        非线性结构的一个结点可能有多个直接前趋结点和直接后继结点。

        在实际应用中,数组、广义表、树结构和图结构等数据结构都是非线性结构。

五、数据结构的几种存储方式

        顺序存储方式,顺序存储方式就是在一块连续的存储区域一个接着一个地存放数据。顺序存储方式把逻辑上相邻的结点存储在物理位置上相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。顺序存储方式也称为顺序存储结构(Sequential Storage Structure),一般采用数组或者结构数组来描述。线性存储方式主要用于线性逻辑结构的数据存放,而对于图和树等非线性逻辑结构则不适用。

        链接存储方式,链接存储方式比较灵活,其不要求逻辑上相邻的结点在物理位置上相邻,结点间的逻辑关系由附加的引用字段表示。一个结点的引用字段往往指向下一个结点的存放位置。链接存储方式也称为链式存储结构(Linked Storage Structure),一般在原数据项中增加引用类型来表示结点之间的位置关系。

        索引存储方式,索引存储方式是采用附加的索引表的方式来存储结点信息的一种存储方式。索引表由若干索引项组成。索引存储方式中索引项的一般形式为:(关键字、地址)。其中,关键字是能够唯一标识一个结点的数据项。索引存储方式还可以细分为如下两类。

        稠密索引(Dense Index):这种方式中每个结点在索引表中都有一个索引项,其中,索引项的地址指示结点所在的存储位置;

        稀疏索引(Spare Index):这种方式中一组结点在索引表中只对应一个索引项。其中,索引项的地址指示一组结点的起始存储位置。

        散列存储方式

        散列存储方式是根据结点的关键字直接计算出该结点的存储地址的一种存储方式。

六、数据类型

        原子类型:其值不能进一步分解,一般是程序设计语言自身定义的一些数据类型,如C语言中的整型、字符型、浮点型等。

        固定聚合类型:属于该类型的变量,其值由确定数目的成分按某种结构组成。例如,复数是由两个实数依确定的次序关系构成。

        可变聚合类型:其值可以进一步分解为若干分量,一般是用户自定义的数据类型,如C语言中的结构、数组等。

        后两种统称为结构类型。

        抽象数据类型:

        抽象数据类型(Abstract Type,简称为ADT)。抽象数据类型ADT指的是数据的组织及其相关的操作。ADT可以看作数据的逻辑结构及其在逻辑结构上定义的操作。

        一个抽象数据类型ADT可以定义为如下形式:

数据结构与算法分析英语 数据结构与算法分析clifford_数组_03

         抽象数据类型ADT一般具有如下两个重要特征。

        数据抽象:使用抽象数据类型ADT时,其强调的是实体的本质特征,所能够完成的功能,以及与外部用户的接口。

        数据封装:用于将实体的外部特性和其内部实现细节进行分离,并且对外部用户隐藏其内部实现细节。

七、常用的数据结构

        1)数组(Array)数组是一种聚合数据类型,是将具有相同类型的若干变量有序地组织在一起的集合。数组可以说是最基本的数据结构,在各种编程语言中都有对应。一个数组可以分解为多个数组元素,按照数据元素的类型,数组可以分为整型数组、字符型数组、浮点型数组、对象数组等。数组还可以有一维、二维及多维等表现形式。

        2)栈(Stack)栈是一种特殊的线性表,其只能在一个表的一个固定端进行数据结点的插入和删除操作。栈按照后进先出的原则来存储数据,也就是说,先插入的数据将被压入栈低,最后插入的数据在栈顶,读出数据时,从栈顶开式逐个读出。栈在汇编语言程序中经常用于重要数据的现场保护。栈中没有数据时,称为空栈。

        3)队列(Queue)队列和栈类似,也是一种特殊的线性表。和栈不同的是,队列只允许在表的一端进行插入操作,而在另一端进行删除操作。一般来说,进行插入操作的一端称为队尾,进行删除操作的一端称为队头。队列中没有元素时,称为空队列。

        4)链表(Linked List)链表是一种数据元素按照链式存储结构进行存储的数据结构,这种存储结构在物理上具有非连续的特点。链表由一系列数据结点构成,每个数据节点包括数据域和引用域两部分。其中,引用域保存了数据结构中下一个元素存放的地址。链表结构中数据元素的逻辑顺序是通过链表中的引用链接次序来实现的。

        5)树(Tree)树是典型的非线性结构,其是包括n个结点的有穷集合K。在树结构中,有且仅有一个根结点,该结点没有前驱结点。在树结构中的其他结点都有且仅有一个前驱结点,而且可以有m个后继结点,m≥0。

        6)图(Graph)图是另外一种非线性数据结构。在图结构中,数据结点一般称为顶点,而边是顶点的有序偶对。如果两个顶点之间存在一条边,那么就表示这两个顶点具有相邻关系。

        7)堆(Heap)堆是一种特殊的树型数据结构,一般讨论的堆都是二叉堆。堆的特点是其根结点的值是所有结点中最小的或者最大的,并且根结点的两个子树也是一个堆结构。

        8)散列表(Hash)散列表源自于散列函数(Hash function),其思想是如果在结构中存在关键字和T相等的记录,那么必定在F(T)的存储位置可以找到该记录,这样就可以不用进行比较而直接取得所查记录。