建模与选型
功能定位
把业务或题面描述转成可被算法处理的问题定义,并选出"足够简单且可行"的算法方向。可独立调用,也可由 algorithm-engineer 总纲路由而来。
触发条件
TRIGGER:如何建模 / 选什么算法 / 问题抽象 / 方案对比 / 判定-计数-最优化-构造的区分 / 复杂度预算评估 / "这个能用 DP 吗""该不该用图论"。
DO NOT TRIGGER:
- 已选定算法,需要正确性证明与复杂度账本 →
algorithm-proof - 写代码、跑测试、做性能记录 →
algorithm-implementation - 模型训练、调参、数值求解器 →
algorithm-applied
工作流程
- 厘清问题类型:判定 / 计数 / 最优化 / 构造;静态 / 动态;在线 / 离线;精确 / 容错;是否需还原方案。
- 固定契约:输入格式、规模、数值范围、输出定义、多解选择、时间空间限制。缺关键约束时先问,或给条件分支。
- 建立模型 + 基线:给出简单正确的基线并说明瓶颈;基线的作用是解释与验证。
- 按特征选方向(见下表),检查必查前提,比较关键取舍。
- 评估总成本:含建模、数据准备与维护成本,不只比较核心循环。
- 输出选型结论:候选方向、前提、取舍、不成立时的退路。
选型方向表
| 问题特征 | 候选方向 | 必查前提 |
|---|---|---|
| 有序查找或单调可行性 | 二分 | 单调性、区间不变量、返回边界 |
| 连续区间统计 | 前缀、双指针、窗口 | 负数和条件变化是否破坏窗口推进 |
| 最优子结构与重复子问题 | DP | 状态充分、转移完整、依赖无环/可求解 |
| 局部选择 | 贪心 | 交换论证或其他结构性保证 |
| 频繁区间查询更新 | 树状数组/线段树等 | 运算结合性、更新类型与懒标记组合 |
| 连通/依赖/路径 | 图模型 | 有向性、权值、负环、输出要求 |
| 大规模有限内存 | 流式/外存/近似 | 内存、误差、数据遍数、更新删除 |
| 组合优化超出精确预算 | 约束求解、近似、启发式 | 可行性、停止条件、保证与误差界 |
约束与注意事项
- 表格只提供选型方向,不是自动模板;同一关键词可能对应不同问题。
- 明确业务约束是否真的等价于图边、容量、代价等模型假设,不做想当然映射。
- 规模太大时基线只在小输入运行;面试教学从直觉逐步推进,生产方案优先维护性与已验证组件。
- 不因为某算法"高级"就优先使用;先正确再性能,但可及早排除明显超预算方案。
输出格式
- 问题定义(类型、输入输出、规模、约束)
- 基线与瓶颈
- 候选方向 + 各自前提 + 取舍 + 退路
- 契约模板:templates/problem-contract.md
参考文档
| 文档 | 用途 |
|---|---|
| references/model-and-selection.md | 建模要素与选型方向表 |
| templates/problem-contract.md | 算法问题契约模板 |