数据结构——介绍
什么是数据结构
在《数据结构,算法及应用》一书中有这样的解释“数据结构是数据对象,存在与该对象的实例以及组成实例的数据元素之间的各种关系,并且这种关系可以通过定义相关的函数来给出。”他将数据对象定义为一个实例或值的集合。
上面这种说发比较难以理解,我们可以简单的理解为数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。(百度百科https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1450?fr=aladdin)
数据结构包含三方面的内容:数据的逻辑结构,数据的存储结构,数据的运算。
- 数据的逻辑结构即数据元素之间的逻辑关系,是一种独立于计算机的抽象概念。例如一组元素中按顺序排列的这种前后关系。
- 数据的存储结构即数据元素以及其逻辑关系在计算机存储器中的表现形式。是一种具体的概念,真实的存储表现。例如数据结构中的每个数据元素都按照顺序依此存储在一片连续的存储单元中。
- 数据的运算即能够对数据施加的操作。例如增删改查和排序。
数据结构的这三个方面是一个有机的整体,缺一不可。数据的逻辑结构,存储结构及运算任何一个发生变化都将导致一个全新的数据结构出现。
数据结构的的逻辑关系
数据结构的结点之间的逻辑关系可以分为以下两类:
1. 线性结构
简单的理解,线性结构就是各个结点具有线性关系(一个有序数据元素的集合)。线性结构应该包括如下内容:
- 线性结构是非空集
- 线性结构有且仅有一个开始结点和结束结点
- 线性结构中每个结点最多可以有一个直接前驱结点,同时最多可以有一个直接后驱结点。
典型的线性结构有:栈,队列
2. 非线性结构
非线性结构就是各个结点之间具有多个对应关系。非线性结构应该包括如下内容:
- 非线性结构是非空集
- 非线性结构的一个结点可能有多个直接前驱结点和直接后驱结点。
典型的非线性结构有:广义表,树结构,图结构
数据结构的存储方式
数据的存储结构是数据结构的一个重要内容,在计算机中,数据的存储结构采用如下四种方法来实现:
1.顺序存储方式
顺序存储方式就是在一块连续的存储区域一个接着一个的存放数据。顺序存储方式把逻辑上相邻的两个结点存储在物理地址相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来提现。该存储方式主要用于线性逻辑结构的数据存放,而对于图和树等非线性逻辑结构则不适用。
2.链式存储方式
链式存储方式比较灵活,它不要求逻辑上相邻的结点在物理存储上的位置相邻。结点间的逻辑关系通过结点附带的引用字段来表示。一个结点的引用字段往往指向下一个结点的存储位置。
3.索引存储方式
索引存储方式是采用附加的索引表的方式来存储结点信息。索引表由若干索引项组成,索引项的的一般形式为(关键字和数据元素存储地址)。其中关键字是能够唯一标识一个结点的数据项。就像新华字典一样。
按照索引表中索引项所对应的结点的数量,索引存储方式还可以细分为稠密索引和稀疏索引
- 稠密索引(Dense Index):每个结点在索引表中对应一个索引项,其中索引项中的地址指向结点的存储位置
- 稀疏索引(Spare Index):索引表中的一个索引项对应一组结点,索引项中的地址指向这一组结点的起始存储位置。
4.散列存储方式
散列存储方式是根据结点的关键字直接计算出该结点的存储地址的一种存储方式。
常用的数据结构
1.数组(Array)
数组是一种聚合数据类型,是将具有相同数据类型的若干元素有序组织在一起的集合。数组可以说是最基本的数据结构。一个数组可以分解成多个数组元素,按照数据元素的类型的不同,数组类型可以分为整型数组,字符型数组,浮点型数组,对象型数组。数组还可以分为一维数组,二维数组和多为数组等形式。
2.栈(Stack)
栈是一种特殊的线性表,其只能在表的一个固定端进行数据结点的插入和删除操作。栈按照先进后出的原则来存储数据,也就是说先入栈的被压入了栈底,最后入栈的则在栈顶,读出数据时从栈顶开始逐个读出。栈中没有数据时称为空栈。
3.队列(Queue)
队列和栈类似,也是一种特殊的线性表。和栈不同的是 队列只允许在表的一端进行插入操作,而在另一端进行删除操作。一般来说进行插入操作的是队尾,进行删除操作的是队首,也就是说队列是按照先进先出的原则进行数据存储。队列中没有数据的时候称为空队列。
4.链表(LinkedList)
链表是一种按照链式存储结构存储数据元素的数据结构,这种存储结构在物理上具有非连续的存储区域的特点。链表由一系列的数据结点构成,每个数据结点包括数据域和引用域两部分,其中引用域存储了逻辑关系上下一个结点的存储地址。链表中数据元素的逻辑关系是通过链表中的引用链次序来实现的。
5.树(Tree)
树是典型的非线性结构,是包含n个数据结点的有穷集合。在树结构中有且仅有一个跟结点,跟结点没有前驱结点但有0个或多个后继结点,在树结构中其他结点有且仅有一个前驱结点,但有0个或多个后继节点。
6.图(Graph)
图是另外一种典型的非线性结构,在图结构中数据结点一般称为顶点,而边是顶点的有序偶对,如果两个顶点之间存在一条边,那么就表示这两个顶点具有相邻关系。
7.堆(Heap)
堆是一种特殊的树结构,一般讨论的堆都是二叉堆。堆的特点是跟结点的值是所有结点中最小的或者最大的,并且根节点的两个子树也是一个堆结构。
8.散列表(Hash)
散列表一般指哈希表,是根据关键码值直接进行访问的数据结构。也就是说它通过关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
本内容均来自《Java常用算法手册》