面试官您好,常用的数据结构是程序设计和算法实现的基础。它们在存储方式、访问效率、适用场景上各有特点。下面我从 线性结构、树形结构、图、哈希结构 四大类进行系统梳理,并附上核心特性与典型应用。
✅ 一、线性结构(Linear)
1. 数组(Array)
- 存储:连续内存空间
- 特点:
- 随机访问快:O(1)
- 插入/删除慢:O(n)(需移动元素)
- 大小固定(静态数组)
- 应用:缓存、矩阵、底层容器(如 ArrayList)
2. 链表(Linked List)
- 存储:节点分散,通过指针连接
- 类型:单向、双向、循环
- 特点:
- 插入/删除快:O(1)(已知位置)
- 访问慢:O(n)
- 内存开销大(存指针)
- 应用:LRU 缓存(LinkedHashMap 底层)、邻接表
3. 栈(Stack)
- 原则:后进先出(LIFO)
- 操作:
push,pop,peek - 实现:数组 or 链表
- 应用:函数调用栈、表达式求值、括号匹配
4. 队列(Queue)
- 原则:先进先出(FIFO)
- 变种:
- 双端队列(Deque):两端可进出
- 优先队列(PriorityQueue):按优先级出队(堆实现)
- 应用:BFS、任务调度、消息队列
✅ 二、树形结构(Tree)
1. 二叉树(Binary Tree)
- 每个节点最多两个子节点
2. 二叉搜索树(BST)
- 性质:左 < 根 < 右
- 操作:查找/插入/删除平均 O(log n),最坏退化为 O(n)
3. 平衡二叉树(AVL / 红黑树)
- 目的:防止 BST 退化,保持高度平衡
- 红黑树特点:
- 近似平衡(最长路径 ≤ 2×最短路径)
- 插入/删除旋转少,性能稳定
- 应用:
TreeMap、TreeSet、C++ STL map
4. 堆(Heap)
- 性质:完全二叉树,父 ≥ 子(大顶堆)或 父 ≤ 子(小顶堆)
- 操作:建堆 O(n),插入/删除 O(log n)
- 应用:优先队列、Top-K 问题、堆排序
5. Trie 树(前缀树)
- 特点:按字符路径存储字符串
- 优势:前缀匹配极快
- 应用:搜索引擎 autocomplete、IP 路由
✅ 三、哈希结构(Hash-based)
哈希表(Hash Table)
- 原理:通过哈希函数将 key 映射到数组下标
- 冲突处理:
- 链地址法(Java HashMap)
- 开放寻址法(Python dict)
- JDK 8+ 优化:链表长度 > 8 → 转红黑树
- 复杂度:平均 O(1),最坏 O(n)
- 应用:缓存(Redis)、去重、字典
✅ 四、图(Graph)
- 表示方式:
- 邻接矩阵:适合稠密图,空间 O(V²)
- 邻接表:适合稀疏图,空间 O(V+E)
- 遍历算法:
- DFS(深度优先):递归/栈,用于连通性、拓扑排序
- BFS(广度优先):队列,用于最短路径(无权图)
- 应用:社交网络、路径规划、依赖分析
✅ 五、对比总结表
| 数据结构 | 查找 | 插入 | 删除 | 有序 | 典型应用场景 |
|---|---|---|---|---|---|
| 数组 | O(1) | O(n) | O(n) | 是 | 随机访问、缓存 |
| 链表 | O(n) | O(1) | O(1) | 是 | 频繁增删、LRU |
| 栈 | - | O(1) | O(1) | LIFO | 表达式计算 |
| 队列 | - | O(1) | O(1) | FIFO | BFS、任务调度 |
| 哈希表 | O(1) | O(1) | O(1) | 否 | 去重、缓存 |
| BST | O(log n) | O(log n) | O(log n) | 是 | 动态排序 |
| 红黑树 | O(log n) | O(log n) | O(log n) | 是 | TreeMap |
| 堆 | O(1)(顶) | O(log n) | O(log n) | 部分有序 | Top-K、优先队列 |
| 图 | - | - | - | - | 社交关系、路径 |
✅ 六、选择建议
- 需要快速查找? → 哈希表
- 需要有序 + 动态增删? → 红黑树
- 求 Top-K? → 堆
- 处理字符串前缀? → Trie
- 表示关系网络? → 图
✅ 总结一句话:
数据结构是算法的基石,没有“最好”,只有“最合适”——根据时间/空间复杂度需求和业务场景选择,才能写出高效代码。
谢谢!

被折叠的 条评论
为什么被折叠?



