女孩和机器人一起思考

一起动脑筋 · 先看一个小故事

机器人有三种任务:按编号找分数、处理排队请求、撤销最近动作。女孩给它准备了不同工具。

把过程摊开来看

沿着编号看一遍,再用自己的话讲一遍
  1. 按编号数组
  2. 按到达顺序队列
  3. 撤销最近一次

选择结构先列出常见操作。

需要下标访问就考虑数组;需要先进先出就考虑队列;需要后进先出就考虑栈。名字不重要,操作规则与任务是否匹配才重要。

01选择数据结构前先问什么?

不要先问“我会哪个 STL”,而要先问:

数据是什么关系?

顺序、层级还是连接?

最常做什么?

访问、插入、删除还是搜索?

顺序重要吗?

先来先处理还是后来先处理?

规模有多大?

几十个还是百万个?

02什么时候想到数组?

如果数据有明确顺序,需要按下标访问、遍历、排序,数组或 vector 往往很自然。

有序的一组同类数据 → 先想到数组 / vector

03什么时候想到栈?

如果问题强调:

  • 最近放进去的先处理
  • 撤销
  • 返回上一层
  • 括号匹配

就应该想到 LIFO 的栈。

04什么时候想到队列?

如果问题强调:

  • 先到先处理
  • 一层一层扩散
  • 按到达次序处理任务

就应该想到 FIFO 的队列。

05什么时候想到树?

如果数据具有天然层级:

  • 文件夹
  • 组织结构
  • 表达式结构
  • 搜索树

树通常是更自然的模型。

06什么时候想到图?

如果对象之间可以任意连接,例如道路、好友、网络、依赖关系,就应该考虑图。

一般连接关系 → 图

07有没有“最强的数据结构”?

没有。

某项操作很快

可能意味着另一项操作更复杂,或者使用更多空间。

结构很灵活

可能带来更高管理成本。

08做题时可以怎样判断?

先读题意找数据关系和常用操作选择最自然的数据结构

然后再结合数据规模和算法效率检查这个选择是否足够快。

你已经知道了什么

  • 选择数据结构要从问题需求出发。
  • 数组适合顺序数据和下标访问。
  • 栈适合后进先出,队列适合先进先出。
  • 树适合层级关系,图适合一般连接关系。
  • 没有一种数据结构在所有场景都最好。
  • 数据结构选择本质上是操作需求和效率之间的权衡。

本专题完成:下一专题进入“基础算法”。

轮到你来试一试

画图软件先画圆再画方,撤销一次应先撤销谁?

想好了吗?点开看解释

方形,最近操作先撤销,符合栈的后进先出规则。