algorithm-first-disciplinelisted
Install: claude install-skill findscripter/everything-skills
## 何时使用
模型本就懂 Big-O、哈希表、分治、动态规划、排序、图算法、摊还分析——它只是不会主动去用。本技能修的是**行为**,不是知识。它是「算法纪律」套件的网关:自身管经典的日常算法纪律,必要时再升级到三个兄弟技能。
**该用的场景:**
- 编写、修改或审查涉及循环、集合、查找、搜索、连接、递归、图、查询,或任何对超过个位数个元素做计算的代码。
- 即将写 `for` 套 `for`、在循环里调 `.find`/`.includes`/`.indexOf`、对独立元素在 `for`/`map`/`forEach` 里 `await`、或对集合每项发一次查询。
- 审计代码库/PR 中的已知反模式(await-in-loop、`.includes` 套在 `.filter` 里、循环里字符串拼接、`SELECT *`、N+1 等)。
- 复审「看着很地道」但可能藏着 O(n²) 或 N+1 的 AI 生成代码。
**不该用的边界(明确豁免):**
- `n < ~10` 的平凡集合、一次性 setup 代码——别为 `for i in range(3)` 浪费时间写复杂度。
- 常数因子优化、延迟尾部、I/O 瓶颈——这要 profiler,本技能��管渐进复杂度,不是测量工具。
- 自动重写已上线的慢代码——那是 `complexity-cuts` 的活;本技能是「写之前」的推理闸门,不改既有代码。
- 故意的暴力解——只要作者写下一行理由(如「实践中 n≤100,可读性优先」),暴力解可以放行;本技能只要求那行理由存在。
**违反规则的字面,就是违反技能的精神。**「就这一次」正是 O(n²) 上生产的方式。
## 步骤
**铁律:没有声明复杂度、数据结构、算法族,不写任何非平凡代码。**
在写循环/递归/查询前,消息里必须**按此顺序**出现七步预写协议:
1. **问题形状** —— 一句话。(如「给定 n 个带时间戳的事件,求总权重 ≤ K 的最长连续窗口」。)
2. **输入维度** —— `n = ?`,真实量级(如 `n ~ 10^6 行`),是否热路径。
3. **目标复杂度** —— `time = O(?)`,`space = O(?)`,点名主导输入维度。
4. **数据结构** —— 每个集合形态的值都从 `Array/List/Set/HashMap/TreeMap/Heap/Deque/Trie/Graph/BitSet/Counter/LinkedList` 中刻意选一个,附一句理由(如「Set 用于循环内 O(1) 成员判断」「Heap 用于 top-K 的 O(n log k)」)。循环内查找默认用哈希结构(Set/Map);n 大时默认流式/迭代器而非物化整表。
5. **算法族** —— 从这些里点一个:`linear scan / divide and conquer / two-pointer / sliding window / binary search / sort + sweep / hash join / BFS/DFS / topological sort / Dijkstra/A* / union-find / dynamic programming / greedy / recursion + memoization / prefix sum / segment tree / monoid reduction`。点不出来,就是要写暴力解,停下重想。
6. **