数据结构与算法
这篇解决什么问题
数据结构决定数据如何组织,算法决定如何处理数据。它们不是刷题专用知识,而是影响程序性能、可读性和扩展性的基础工具。
学完你会掌握
- 常见数据结构的使用场景。
- 排序、搜索和遍历的基本思想。
- 时间复杂度和空间复杂度的意义。
- 如何在业务代码中选择合适的数据结构。
核心概念
| 数据结构 | 特点 | 常见场景 |
|---|---|---|
| 数组 | 连续存储,按下标访问快 | 列表、批量处理 |
| 链表 | 插入删除灵活,随机访问慢 | 队列、底层结构 |
| 栈 | 后进先出 | 调用栈、撤销操作 |
| 队列 | 先进先出 | 任务排队、消息处理 |
| 哈希表 | 按 key 快速查找 | 字典、缓存、去重 |
| 树 | 层级结构 | DOM、文件目录、索引 |
| 图 | 节点和关系 | 路径、依赖、社交关系 |
算法关注如何高效完成任务,例如排序、搜索、递归、动态规划、图遍历。
复杂度不是装饰词
复杂度描述的是输入规模变大时,成本如何增长。
| 复杂度 | 典型例子 | 风险 |
|---|---|---|
| O(1) | 哈希表按 key 查询 | 依赖哈希质量和冲突处理 |
| O(log n) | 二分查找、平衡树查询 | 通常需要有序结构 |
| O(n) | 遍历列表 | 数据大时要控制次数 |
| O(n log n) | 常见排序 | 大多数通用排序可接受 |
| O(n^2) | 双重循环比较 | 数据稍大就可能出问题 |
复杂度要结合数据规模判断。几十条数据时,清晰简单更重要;几十万条数据时,错误的数据结构会变成真实性能事故。
典型选择
| 需求 | 优先考虑 |
|---|---|
| 按 ID 快速查找 | 哈希表 |
| 保持插入顺序并遍历 | 数组或列表 |
| 频繁取最大/最小值 | 堆 |
| 表达层级关系 | 树 |
| 表达依赖和路径 | 图 |
| 先进先出处理任务 | 队列 |
| 撤销、括号匹配、调用链 | 栈 |
选数据结构时,先说清楚操作模式:查多还是写多,是否要求有序,是否需要范围查询,数据规模多大。
它是怎么工作的
判断一个方案是否合适,常用复杂度描述成本。
O(1) 常数时间
O(log n) 对数时间
O(n) 线性时间
O(n log n) 常见高效排序
O(n^2) 双重循环,数据大时要警惕
复杂度不是唯一标准,但它能帮助你提前发现明显不合理的方案。
开发中的真实场景
业务开发中常见例子:
- 用哈希表把列表查询从双重循环降为一次遍历。
- 用队列处理异步任务。
- 用树结构表示菜单、组织架构、评论楼层。
- 用图表示依赖关系和流程流转。
- 用排序和分页处理列表展示。
AI Coding 时代怎么用
AI 很容易写出能跑但低效的代码。你可以要求它:
- 说明时间复杂度和空间复杂度。
- 给出数据量增大后的表现。
- 避免不必要的嵌套循环。
- 为关键算法补充测试样例。
- 优先选择业务上可读、可维护的数据结构。
常见误区
误区一:认为算法只和面试有关。实际上,低效列表处理、重复查询、错误缓存结构都会造成真实性能问题。
误区二:总想用复杂算法。大多数业务场景先用清晰的数据结构即可。
误区三:只看时间复杂度,不看数据规模。小数据下简单方案可能更合适。
误区四:认为数据库用了索引就不需要算法思维。索引本身就是数据结构,查询计划也和算法选择有关。
小结
数据结构与算法的核心不是炫技,而是用合适的组织方式和处理方法解决问题。AI 能帮你生成实现,但你需要判断它是否适合当前数据规模和业务场景。