- 线性数据结构,可以将相同类型的元素存储在连续的内存空间
- 数组应用
- 利用数组下标随机访问特性,随机抽取样本
- 排序和搜索
- 查找表,将大小写字母或者ASCII码值映射到数组中,可以快速查找到元素
- 可实现栈、队列、哈希表、堆、图等数据结构
- 动态数组实现
- 线性数据结构,使用链表存储可以使得各个数据节点分散在内存各处,不要求内存地址物理上连续
- 链表类型
- 单向链表
- 双向链表
- 环形链表
- 链表应用
- 单向链表常见于栈、队列、哈希表冲突解决方案、图邻接表解决方案
- 双向链表常见于高级数据结构如红黑树、B树、Java中LinkedList集合;LRU最近最少使用算法
- 环形链表常见于周期性操作,如时间片轮转调度算法
- 链表实现
- 练习题目:
- 翻转链表(迭代和递归方式)
- 删除倒数第N个节点
- 合并两个有序链表
- 环形链表判断
- LRU缓存淘汰算法实现
- 回文链表判断
- 删除链表中等于给定值 val 的所有节点(递归和迭代写法的对照)
- 通过建立键 key 与值 value 之间的映射,实现高效的元素查询
- 哈希表的实现
- 练习题目
- 两个数组的交集II
- 手写二叉搜索树
- 维护一棵二叉搜索树,add, remove, contains, minimum, maximum方法
- 深度优先遍历和广度优先遍历实现(递归和迭代两种写法)
- 打印二叉树递归建树过程
- 集合的实现
- 基于二叉搜索树
- 基于链表
- 两者性能上的比较,时间复杂度的分析
- 练习题目
- 唯一摩尔斯密码词
- 两个数组的交集
- 堆的实现
- 数组堆化headify, 上浮siftUp, 下沉siftDown, 替换replace等关键操作
- 基于堆实现优先队列
- 练习题目
- 前 K 个高频元素
- 线段树实现
- 构建线段树、区间检索、更新
- 练习题目
- 区域和检索 - 数组不可变
- 区域和检索 - 数组可修改(在数据动态变化的场景下更能体现优势)
- 字典树实现
- Node节点的设计(map, isWord)
- add添加, contains搜索, isPrefix前缀搜索的递归与非递归写法
- 练习题目
- 添加与搜索单词 - 数据结构设计
- 键值映射
- 并查集实现
- isConnected是否关联,unionElements元素合并
- 基本实现quick find,查询O(1),合并O(n)
- quick union,查询O(h),合并O(h) h为合并树的高度
- 基于size优化,元素个数少的集合合并到元素个数多的集合上
- 基于rank优化,元素对应树深度低的的集合合并到深度高的集合上
- 路径压缩,在find查找根元素同时将p指向的父节点断开,转而指向p的爷爷节点
- 路径压缩II,在数据压缩基础上,将节点一次性指向根节点,树变为两层