基础数据结构
1. 数组(Array)
- 特点:连续内存、固定大小、随机访问O(1)
- 常见问题:
- 两数之和/三数之和
- 合并两个有序数组
- 删除排序数组中的重复项
- 旋转数组
- 最大子数组和(Kadane算法)
2. 链表(Linked List)
- 类型:单链表、双链表、循环链表
- 常见问题:
- 反转链表(迭代/递归)
- 检测环(快慢指针)
- 合并两个有序链表
- 删除倒数第N个节点
- 相交链表问题
- 复杂度:
- 插入/删除:O(1)
- 访问:O(n)
3. 栈(Stack)和队列(Queue)
- 栈(LIFO)应用:
- 括号匹配
- 表达式求值
- 函数调用栈
- 队列(FIFO)类型:
- 普通队列
- 双端队列(Deque)
- 优先队列(PriorityQueue)
- 常见问题:
- 用栈实现队列/用队列实现栈
- 最小栈问题
- 滑动窗口最大值
树形结构
4. 二叉树(Binary Tree)
- 基本概念:
- 二叉搜索树(BST):左<根<右
- 平衡二叉树(AVL):任意节点左右子树高度差≤1
- 完全二叉树
- 满二叉树
- 遍历方式:
- 前序、中序、后序(递归/迭代)
- 层次遍历(BFS)
- 常见问题:
- 求二叉树深度
- 判断对称/平衡二叉树
- 最近公共祖先(LCA)
- 根据遍历序列重建二叉树
5. 堆(Heap)
- 类型:最大堆/最小堆
- 操作复杂度:
- 插入:O(log n)
- 删除:O(log n)
- 获取极值:O(1)
- 应用:
- 堆排序
- Top K问题
- 合并K个有序链表
6. 红黑树(Red-Black Tree)
- 特性:
- 自平衡二叉搜索树
- 节点红黑交替
- 从根到叶子的最长路径不超过最短路径的2倍
- 应用:Java TreeMap/TreeSet底层实现
哈希结构
7. 哈希表(Hash Table)
- 核心概念:
- 哈希函数设计
- 冲突解决方法:开放地址法、链地址法
- 复杂度:
- 平均情况:插入/删除/查找O(1)
- 最坏情况:O(n)
- 应用:
- 快速查找
- 去重
- 缓存实现(LRU Cache)
图结构
8. 图(Graph)
- 表示方式:邻接矩阵、邻接表
- 遍历算法:
- 深度优先搜索(DFS)
- 广度优先搜索(BFS)
- 常见问题:
- 最短路径(Dijkstra、Floyd)
- 最小生成树(Prim、Kruskal)
- 拓扑排序
- 检测环
高级数据结构
9. Trie树(前缀树)
- 特点:多叉树结构,前缀共享
- 应用:
- 字符串检索
- 自动补全
- IP路由最长前缀匹配
10. 并查集(Disjoint Set)
- 操作:
- Find:查找根节点
- Union:合并集合
- 优化:路径压缩、按秩合并
- 应用:
- 连通分量问题
- 朋友圈问题
- 最小生成树Kruskal算法
算法思想相关数据结构
11. 位图(Bitmap)
- 应用:
- 海量数据去重
- 布隆过滤器基础
- 权限控制
12. 跳表(Skip List)
- 特点:
- 有序链表+多级索引
- 查找复杂度O(log n)
- 应用:Redis有序集合实现
常见问题模式
-
设计类问题:
- 设计LRU缓存
- 设计LFU缓存
- 设计TinyURL系统
-
变种问题:
- 链表:环形链表II(找环入口)
- 数组:接雨水问题
- 字符串:最长无重复子串
-
组合问题:
- 哈希+双向链表实现LRU
- 堆+哈希实现LFU
- 单调栈解决接雨水问题
复杂度对比
数据结构 | 插入 | 删除 | 查找 | 访问 |
---|---|---|---|---|
数组 | O(n) | O(n) | O(n) | O(1) |
链表 | O(1) | O(1) | O(n) | O(n) |
哈希表 | O(1) | O(1) | O(1) | N/A |
二叉搜索树 | O(log n) | O(log n) | O(log n) | O(log n) |
堆 | O(log n) | O(log n) | O(n) | O(1) |
掌握这些数据结构的特点和应用场景,能够帮助你在面试中快速识别问题本质并选择合适的数据结构解决方案。