对于数据结构这种基础内容,在构建知识体系时要避免自己”再造轮子”,需要站在更高层次整体上去理解它——格局要大一点,不要盯着代码;要了解算法思想、性能及适用场景,用一些工具和别人梳理的结果帮助自己构建知识体系。
学习思路:以”查找”为主线串联知识点
避免孤立地学习知识点,要关联学习。实际应用中我们最常用的是查找和排序操作(管理系统、数据库、操作系统里十分常见),以这条线索可以把各种数据结构串联起来:
- 数组:下标寻址十分迅速,但内存有限、长度有限;无序数组查找最坏要遍历整个数组。二分查找解决了查找复杂度问题,但要求数组有序。数组的死穴是插入、删除操作复杂——在增删查改频繁的场景中不会被优先考虑。
- 链表:由于它的结构特点,被证明根本不适合查找。
- 哈希表:数组和链表的折中,设计依赖散列函数;既受数组长度限制、又受链表查找限制,也不适合超大规模查找。
- 二叉查找树(BST):可能退化成链表,同样不适合查找。
- AVL 树:解决了退化问题,但旋转过程非常麻烦,插入和删除很慢,构建成本高。
- 红黑树:平衡二叉树和 AVL 的折中,是比较合适的方案。集合类中 Map、关联数组的高查询效率,底层就是红黑树。
- 多路查找树:大规模数据存储中实现索引查询的实际背景下,树节点存储元素数量有限,二叉查找树会因树深过大导致磁盘 I/O 过于频繁、查询效率低下。
- B 树:适用于读写相对大的数据块的存储系统(如磁盘),应用在文件系统及部分非关系型数据库索引。
- B+ 树:在 B 树基础上为叶子结点增加链表指针(B 树 + 叶子有序链表),所有关键字都在叶子结点中出现,非叶子结点作为索引;总是到叶子结点才命中。常用于关系型数据库(如 MySQL)和操作系统文件系统。
- B* 树:B+ 树的变体,在非根和非叶子结点再增加指向兄弟的指针,将结点的最低利用率从 1/2 提高到 2/3。
- R 树:用来做空间数据存储的树状结构,例如给地理位置、矩形和多边形这类多维数据建立索引。
- Trie 树:自然语言处理中最常用的数据结构,很多字符串处理任务都会用到。Trie 本身是一种有限状态自动机,模式匹配、正则表达式都与它有关。
知识体系结构
A. 数据结构总览
数据结构是基础中的基础,任何进阶都逃不开这些知识点。
B. 线性结构
理解数据结构中的线性结构及其延伸:
- 线性表:数组和矩阵 —— 数组是连续存储的线性结构,元素类型相同、大小相等,通过整型索引访问元素,尺寸不能改变
- 线性表:链表 —— n 个节点离散分配、彼此通过指针相连;确定一个链表只需要头指针
- 线性表(散列):哈希表 —— 通过关键码值直接进行访问的数据结构,映射函数叫散列函数,存放记录的数组叫散列表
- 线性表:栈和队列 —— 数组和链表是线性存储结构的基础,栈和队列是其应用
C. 逻辑结构:树
- 树:基础和 Overview —— 树的整体知识体系结构和几种常见树类型
- 树:二叉搜索树 BST —— 左子树所有结点值小于根,右子树大于根,左右子树也分别为二叉排序树
- 树:平衡二叉树 AVL —— 左右子树高度差绝对值不超过 1;常用实现有红黑树、AVL、替罪羊树、Treap、伸展树等
- 树:红黑树 R-B Tree —— 自平衡二叉查找树,是平衡二叉树和 AVL 树的折中
- 树:哈夫曼树 —— 又称最优二叉树,带权路径长度最短的二叉树
- 树:前缀树 Trie —— 又称字典树、单词查找树,利用字符串公共前缀减少查询时间
D. 逻辑结构:图
- 图:基础和 Overview —— 图是最灵活的数据结构之一:社交网络、同分异构体区分、网络拓扑、最短路径都可以建模
- 图:遍历 BFS & DFS —— 深度优先搜索与树的先序遍历类似;广度优先搜索又称宽度/横向优先搜索
- 图:最小生成树 Prim & Kruskal —— Kruskal 从最小权重边着手将森林合并;Prim 从顶点出发建树
- 图:最短路径 Dijkstra & Floyd —— 地图距离计算、公交查询、路由选择等广泛使用
- 图:拓扑排序 —— 解决有向图中的依赖解析问题
- 图:AOE & 关键路径 —— 项目管理计算工期:缩短工期即缩减关键路径上的工期
延伸专题
本系列后续还覆盖:十大排序算法、算法思想(分治/贪心/DP/回溯等)、字符串匹配与大数据处理。
学习资源推荐
入门:
- Data Structure Visualizations —— 强烈推荐用动画学习算法
- Java Point - DS —— 英文学习网站
- TheAlgorithms - Java —— GitHub 上的 Java 算法集合
- skywang12345 - DS —— 中文数据结构系列
- 亦海 - DS —— 文章写得很清晰
进阶:
- July - 结构之法 算法之道 —— 首推