对于数据结构和算法相关方面认知大概是在大学里,当时在学这门课时和大多数同学一样根本不知所措,根本没有察觉到这门课程对于后续工作中的影响,一直到工作多年的我其实到现在才开始体会到数据结构和算法的重要性
其实在这个信息时代也就是数据时代,各行各业每天都会产生着各种各样的数据,而数据结构其实就是用来囊括数据和数据之间的关系的,在信息时代如何让计算机为我们提供更好的服务,对于数据的处理尤为重要,这里我们说的数据结构其实就是计算机存储、组织数据的方式,而对于数据与数据之间的关系我们可以抽象出下图几种情况:
从图中我们可以看出四种关系:
- 数据与数据无任何关系
- 数据与数据一对一关系
- 数据与数据一对多关系
- 数据与数据多对多关系
世间万事万物都可以根据以上关系来进行划分关系,这里我们引出一个世界上著名的理论六度分离理论
而这个理论其实只是说明一个很重要的概念:任何两位素不相识的人之间,通过一定的联系方式,总能够产生必然联系或关系;其实这就跟我们上面所提出的数据与数据之前通过数据结构抽象后能够形成特定关系,这里我们引出这么多只是说明我们在计算机领域的逻辑上层也是通过此种抽象方式从而形成计算机中所需的对应的数据结构
下面是对于日常软件开发中我们可能碰到的或者需要知道的常用的数据结构及其特性的汇总。
数据结构 | 结构 | 特性 | 分类 | 实现(java) |
---|---|---|---|---|
数组 | 线性结构 | 支持随机访问 扩容需进行数据迁移 | N/A | ArrayList、Vector动态数组 |
链表 | 线性结构 | 不支持随机访问 支持动态扩容 | 单链表、双向链表、循环链表、双向循环链表 | LinkedList |
队列 | 线性结构 | 先进先出 | 普通队列、双端队列 | 基于数组的ArrayDeque双端队列 基于链表的ConcurrentLinkedDeque双端队列 |
栈 | 线性结构 | 先进后出 | 基于数组顺序栈、基于链表链式栈 | Stack |
跳表 | 非线性结构 | 基于多级索引的链表 | N/A | ConcurrentSkipListMap |
散列表 | 非线性结构 | 基于散列(哈希)函数 散列冲突(链表法和开放寻址法) | 无序散列表、有序散列表 | HashMap、LinkedHashMap |
树 | 非线性结构 | 一对多父子级关系 只有一个根节点 | 二叉树:完全二叉树、满二叉树、二分查找树、红黑树、trie树 多叉树:B树、B+树 堆:大堆顶、小堆顶 | TreeMap、1.8后HashMap链表中转红黑树 |
图 | 非线性结构 | 多对多关系(顶点和顶点之间) | 无向图、有向图、有向带权图 | N/A |
上面列出的一系列数据结构我们都可以映射到之前列举的数据和数据之前的四种关系上例如:
- 散列表的数据可以达到没有任何关系
- 数据/链表/队列/栈中数据具有一对一的关系(我的前面和后面)
- 树中父节点和子节点一对多关系
- 图中顶点和顶点多对多关系
这一篇幅列所列举的只是我们日常开发中最常见的一些数据结构,通过这些对应的数据结构我们可以通过各类算法来满足对应的业务场景,在后面的文章我们再针对常用的一些算法进行梳理