MO_or关于八大数据结构的感悟

一、引言

本篇文章,是由于MO_or在复习数组时,突然想到,数组与数据结构之间的关系是怎样的呢?为什么数组具有她的特性呢?
于是为了更好的理解数组,得先对基本数据结构有所掌握。便有了此篇关于数据结构的感悟

注意:本篇文章理论较重且仅为梗概,仅作为入门理解
若需要深入理解其中细节还需结合一定工作经验或实践经验才行

二、数据结构

写在之前的说明:本文依旧借助Data Structure Visualizations(网址在四、参考中附上),以便更简洁高效的理解数据结构。

数据结构.png

2.1 数组

简单介绍:
数组为有序的元素序列,通过下标进行定位,起始下标为0
使用Java语言创建一个长度为30的数组:int[] array = new int[30]; 并添加9个元素
如下图所示(栈的数组实现模型):

数组.png

优点:  
1、按照索引查询元素速度快  
2、按照索引遍历数组方便

缺点:  
1、长度固定后无法扩容  
2、只能存储一种类型的数据  
3、添加,删除的操作慢,因为要移动其他的元素

适用场景:  
频繁查询,对存储空间要求不大,很少增加和删除的情况

2.2 栈

简单介绍:
栈是一种特殊的线性表,从下图可以看出,栈的操作是单向的,进出都在一个入口,所以是先进后出的形式
在Data Structure Visualizations中还可以看到,栈使用数组的实现和使用链表的实现,但其操作始终遵循先进后出的形式

栈.png

适用场景:
常应用于实现递归功能方面的场景,例如斐波那契数列

2.3 队列

简单介绍:
队列和栈可以结合起来一起理解,因为队列也是一种特殊的线性表。
区别在于队列的操作是双向的,即一个入口只负责进,一个出口只负责出,所以是先进先出的形式
同样在Data Structure Visualizations可以看到队列使用数组、链表的实现,其操作也只遵守先进先出的形式

队列.png

适用场景:
在多线程阻塞队列管理中非常适用

2.4 链表

简单介绍:
区别与数组,链表是非连续、非顺序的存储结构
并且链表存储的元素是由两部分组成的,一部分是存储数据的数据域,一部分是指向下一元素的指针域,其逻辑也是由指针域决定的
由于其指针域的存在,所以链表的逻辑结构也更为丰富,有单链表、双链表、循环链表,下图就为单链表(栈的链表实现模型):

栈-链表.png

优点:
1、常见数据结构,不用指定初始容量大小,可以扩展
2、增改删时只需更改前后指针域指向,所以效率快

缺点:
1、由于存在大量指针域,占用空间大
2、查找时需要遍历链表,效率较慢

适用场景:
数据量较小,增改删较多,查询较少的场景

2.5 树

简单介绍:
之所以称之为树,是因为她的数据结构模型就像树的根(所以为什么不叫树根tree root)
树是由 n≥1 个节点组成的具有层次关系的集合,她具有一些特点:
1、没有父节点的称为根节点
2、每个节点有零个或多个节点
3、除根节点,每个节点有且只有一个父节点
4、除根节点,每个字节可分成多个不相交的子树
通常讨论和使用的是二叉树,如下图:

二叉树.png

树有很多种类,在学习MySQL索引底层数据结构时便能了解到更多关于不同树的数据结构,在JDK8开始HashMap底层也有使用到红黑树
若感兴趣可下滑至 四、参考中点击《MO_or关于SQL优化的感悟》进行学习

适用场景:
树具有链表、数组的优点,是两者的优化方案,对大数据量的动态数据提供良好的支持
MySQL索引的底层数据结构就是B+Tree

2.6 散列表

简单介绍:
散列表,也叫哈希表,是根据关键码和值 (key和value) 直接进行访问的数据结构,
通过key和value来映射到集合中的一个位置,这样就可以很快找到集合中的对应元素

hash.png

上图为开散列的数据结构模型,哈希表在Java中是较为常见的,如集合中HashMap,HashTable等

因为哈希表是基于数组衍生的数据结构,所以具备数组的一些特性,查询快、增改删慢
但哈希表涉及很多算法对其缺点可以避免,比如:拉链法、开散列、闭散列、桶式散列等

适用场景:
哈希表的应用场景很多,当然也有很多问题要考虑,比如哈希冲突的问题,如果处理的不好会浪费大量的时间,导致应用崩溃

2.7 堆

堆是一种比较特殊的数据结构,可以被看做一棵树的数组对象,具有以下的性质:
1、堆中某个节点的值总是不大于或不小于其父节点的值;
2、堆总是一棵完全二叉树。

heap.png

适用场景:
因为堆有序的特点,一般用来做数组中的排序,称为堆排序

2.8 图

图是由结点的有穷集合V和边的合E组成,其中,为了与树形结构加以区别
在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系

图.png

图是一种比较复杂的数据结构,在存储数据上有着比较复杂和高效的算法,
分别有邻接矩阵 、邻接表、十字链表、邻接多重表、边集数组等存储结构,这里不做展开,若大家有兴趣可以自己学习深入

三、感悟

当MO_or开始回顾基础时,才真正发现自身知识体系巨大的缺陷,并陷入了不安、焦虑、急功近利的心态
不断的需求答案,不断的思考,不断的反思,才意识到
“闻道有先后,术业有专攻,如是而已”
“吾生也有涯,而知也无涯,以有涯随无涯,殆也”
愿在计算机科学领域不断前行,不骄不躁

四、参考

栈—百度百科
队列—百度百科
Data Structure Visualizations
MO_or关于SQL优化的感悟

五、最后

若有不足,敬请指正。
求知若渴,虚心若愚。

之后MO_or将会追根溯源,去思考、探索、总结关于成为优秀程序员的真正的根。

你可能感兴趣的:(java,数据结构,基础)