
一起动脑筋 · 先看一个小故事
机器人有三种任务:按编号找分数、处理排队请求、撤销最近动作。女孩给它准备了不同工具。
把过程摊开来看
- 按编号数组
- 按到达顺序队列
- 撤销最近一次栈
选择结构先列出常见操作。
需要下标访问就考虑数组;需要先进先出就考虑队列;需要后进先出就考虑栈。名字不重要,操作规则与任务是否匹配才重要。
01选择数据结构前先问什么?
不要先问“我会哪个 STL”,而要先问:
数据是什么关系?
顺序、层级还是连接?
最常做什么?
访问、插入、删除还是搜索?
顺序重要吗?
先来先处理还是后来先处理?
规模有多大?
几十个还是百万个?
02什么时候想到数组?
如果数据有明确顺序,需要按下标访问、遍历、排序,数组或 vector 往往很自然。
有序的一组同类数据 → 先想到数组 / vector
03什么时候想到栈?
如果问题强调:
- 最近放进去的先处理
- 撤销
- 返回上一层
- 括号匹配
就应该想到 LIFO 的栈。
04什么时候想到队列?
如果问题强调:
- 先到先处理
- 一层一层扩散
- 按到达次序处理任务
就应该想到 FIFO 的队列。
05什么时候想到树?
如果数据具有天然层级:
- 文件夹
- 组织结构
- 表达式结构
- 搜索树
树通常是更自然的模型。
06什么时候想到图?
如果对象之间可以任意连接,例如道路、好友、网络、依赖关系,就应该考虑图。
一般连接关系 → 图
07有没有“最强的数据结构”?
没有。
某项操作很快
可能意味着另一项操作更复杂,或者使用更多空间。
结构很灵活
可能带来更高管理成本。
08做题时可以怎样判断?
先读题意→找数据关系和常用操作→选择最自然的数据结构
然后再结合数据规模和算法效率检查这个选择是否足够快。
你已经知道了什么
- 选择数据结构要从问题需求出发。
- 数组适合顺序数据和下标访问。
- 栈适合后进先出,队列适合先进先出。
- 树适合层级关系,图适合一般连接关系。
- 没有一种数据结构在所有场景都最好。
- 数据结构选择本质上是操作需求和效率之间的权衡。
本专题完成:下一专题进入“基础算法”。
轮到你来试一试
画图软件先画圆再画方,撤销一次应先撤销谁?
想好了吗?点开看解释
方形,最近操作先撤销,符合栈的后进先出规则。