数据结构基础
前言:数据结构是算法的基础,没有数据结构就没有算法。本文开始阐述常见的数据结构,以及各个的特性。由于代码实现过于简单,jdk中大部分都能找到相应代码,另外加了代码这篇文章就太长了,后续考虑用添加附件的方式,贴上代码。另外就是特殊数据结构,例如二叉树的特殊实例,AVL树,红黑树,B树、SB树等等,不在本文阐述详谈,后续整理相关流程图代码后,以单独文章体现。
-------------------------------------------------------------------------------正文开始----------------------------------------------------------------------------------------
一、什么是数据结构
数据结构是数据对象、存在该对象的实例以及组成实例数据元素之间的各种关系,并且这种关系可以通过定义相关的函数来给出。
数据(Data):数据是信息的载体,能够被计算机识别。存储和加工处理。
数据元素(Data Element):数据元素的数据的基本单位,也称之为元素、节点、顶点、记录等。
数据结构(Data Structure): 数据之间的相互关系,即数据的组织形式。
二、数据结构的组成:
逻辑结构(Logical Structure):数据元素之间的逻辑关系
存储结构(Storage Structure):数据元素及其逻辑关系在计算机中存储的表现形式
数据运算:能够对数据施加的操作,常用的有:CRUD和排序
这三个方面是一个有机的整体,缺一不可。任何一个发生变化都将导致一个全新的数据结构出现。
三、数据结构的分类
线性结构按照逻辑结构进行简单分类的话分为线性结构和非线性结构。
线性结构:数据表中各个节点具有线性关系。具体包含内容如下:
1、数据结构是非空集
2、有且只有一个开始节点和一个终端节点
3、所有节点做多只有一个直接前驱节点和一个直接后续节点。
一维数组、线性表、栈、队列和串都是线性结构。
非线性结构:简单的说就是各个节点之间具有多个对应关系。具体包含内容如下:
1、非线性结构是非空集
2、一个节点可能有多个直接前驱结点和直接后继节点。
二维数组、多维数组、广义表、树、图都是非线性结构的。
四、数据结构的存储方式
顺序存储方式:在一块连续的内存存储区域一个接着一个的存放数据,一般采用数组或者结构数组来描述
连接存储方式:也称之为“链式存储结构”,该方式比较灵活,一般在元数据项中增加引用类型来表示节点间的位置关系
索引存储方式:
采用附件索引表的方式来存储节点信息,关键字+地址。关键字理解为唯一标识一个节点的数据项。
细分类为稠密索引和稀疏索引。
稠密索引:就是每个节点都在索引表中有一个索引项,索引的引用地址就是节点的存储位置。
稀疏索引:就是一组节点在索引表中只对应了一个索引项,索引项的地址表示的是一组节点的起始存储位置
散列存储方式:就是根据节点关键字直接计算出该阶段的存储地址。例如hash表
五、常用的数据结构
数组(Array):一种聚合数据类型,是将具有相同数据类型的若干数量的数据有序的组织在一起的有限集合,是最基本的数据结构。
栈(Stack):
一种特殊的线性表,只能在一个表的固定端进行数据节点的插入和删除操作。按照后进先出原则存储数据。栈中没有数据时,称之为空栈。
队列(Queue):
队列和栈类似,也是一种特殊的线性表。和栈不同的是,只允许在表的一端进行插入操作,另一端进行删除操作。先进先出原则存储数据
链表(Linked List):按照链式存储结构进行存储的数据结构,有非连续的特点。每个节点包括数据域和引用域。
树(Tree):典型的非线性结构,包括n个节点的有穷集合。在树结构中有且只有一个根节点,并且其他节点有仅有一个前驱结点,但是可以有n个后续节点的数据结构。
图(Graph):也是非线性结构。数据节点称之为顶点,而边是顶点的有序偶对。
堆(Heap):是一种特殊的树形结构,一般都是二叉堆。特点是根节点的值是所有节点中最小的或者最大的,并且根节点的两个子树也是堆结构。
散列表(Hash):源自于散列函数(Hash Function),思想是如果在结构中存在关键字和T相等的记录,必定在F(T)的存储位置上找到该记录,这样可以不用比较直接取数据。
六、下面具体阐述各个数据结构
(1)线性表
线性表是由n(n≥0)个数据组成的有限序列。元素的个数称之为表的长度。即“把所有数据用一根线儿串起来,再存储到物理空间中”
逻辑特征:
1、有且只有一个开始节点,并且没有这个节点没有前驱节点。有且只有一个后续节点。
2、有且只有一个终结节点,没有直接的后续节点。有且只有一个直接前驱节点。
3、同一线性表,元素数据类型必须一致。每个元素的数据长度必须相同