CP-Algorithms 模板与实战

共 19 题
#

1. 从模板到实战的决策,如何根据 n 的范围、时限与输入特点选择算法与优化?

A 由 n 上界反推复杂度预算,结合时限与语言常数、输入特点(稀疏/稠密、是否可离线)选择算法与实现 ✓ 正确答案
B 只需看 n 是否很大,不必考虑常数
C 任何 n 都可盲目用 O(n^2) 算法
D 输入特点与算法选择无关
#

2. CP-Algorithms 的核心模板体系中数论/图论/字符串三块的依赖关系与组合用法?

A 三块完全独立,从不组合
B 数论是地基(模/逆元/素数),字符串自动机与图论相互依赖,三块常组合(如带模计数、自动机匹配) ✓ 正确答案
C 字符串不需要数论中的模运算
D 图论不依赖任何数论概念
#

3. CP-Algorithms 杜教筛 (Du Jiao Si) 在前缀和与狄利克雷卷积的 O(n^(2/3)) 模板。

A 用狄利克雷卷积 f*g=h 递推前缀和,整除分块分段递归,预处理前 n^(2/3) 项,总复杂度 O(n^(2/3)) ✓ 正确答案
B 杜教筛复杂度是 O(n^2)
C 杜教筛不需要记忆化
D 杜教筛只能求 μ,不能求 φ
#

4. CP-Algorithms 模拟退火在 NP-hard 组合优化的工程调参曲线。

A 模拟退火保证找到全局最优
B 温度越高越好,越低越好
C 初始温度定初始接受率、降温速率(α)定探索与收敛平衡、迭代数定精度,本质是探索-利用权衡 ✓ 正确答案
D 调参与问题无关,一套参数通用
#

5. CP-Algorithms 后缀自动机在子串出现次数、不同子串数、最长公共子串的工程模板。

A SAM 不能求不同子串数
B 出现次数需对每个子串单独统计 O(n^2)
C 出现次数用拓扑序累加 endpos 大小,不同子串数是 Σ(len-len[link]),最长公共子串在 SAM 上匹配 ✓ 正确答案
D 最长公共子串需建两个 SAM
#

6. CP-Algorithms 主席树 (Persistent Segment Tree) 在 K-th number 离线查询的 build/update 模板。

A 每个前缀都要重建整棵树 O(n^2)
B 主席树只能查询区间和,不能求第 k 小
C 为每个前缀建可持久化线段树记录值域计数,查询用版本 r 与 l-1 的计数差并行下降,O(log n) ✓ 正确答案
D 查询需要遍历整个区间 O(n)
#

7. CP-Algorithms 爬山 + 局部搜索在 TSP/VRP 调度的工程收敛速度。

A 爬山贪心向邻域更优解移动易陷局部最优,2-opt/3-opt 等邻域算子决定收敛速度与解质量,常配多起点 ✓ 正确答案
B 爬山一定找到全局最优
C 邻域越大一定越快
D 局部搜索与邻域算子无关
#

8. Immutable.js 在 Map/Set/List/Record 的 Hash Array Mapped Trie 工程细节。

A 5-bit 分段是任意选择的,无意义
B HAMT 不支持结构共享
C 用 32 位 hash 切 5-bit 段 + bitmap 稀疏节点,路径复制实现不可变与结构共享 ✓ 正确答案
D HAMT 更新必须复制整棵树
#

9. Persistent Hash Array Mapped Trie (HAMT) 的 32-bit hash 切分 5-bit 段与 bitmap 稀疏节点。

A HAMT 每层只有 2 路分支
B 32-bit hash 切 5-bit 段形成 32 路 trie,bitmap 压缩稀疏节点,路径复制实现持久化共享 ✓ 正确答案
C bitmap 是多余的,浪费内存
D HAMT 不支持持久化
#

10. Persistent HashMap 在 RocksDB/BoltDB snapshot 的工程化路径。

A 两者都只用哈希表存储
B RocksDB 用 LSM-tree + sequence 实现 snapshot,BoltDB 用 B+tree + 写时复制,提供一致读视图 ✓ 正确答案
C snapshot 只影响写性能,不影响读
D RocksDB 不支持事务
#

11. Persistent AVL 在 DrRacket、Racket、Elixir 的工程化 footprint 对比。

A 函数式语言(Racket/Elixir)天然不可变,持久化树零成本、生态支持好;命令式语言需手动路径复制成本高 ✓ 正确答案
B 所有语言的持久化成本相同
C Elixir 不支持持久化结构
D 命令式语言持久化最省事
#

12. Clojure PersistentHashMap 在 5-bit 段 + bitmap 的 HAMT 工程实现与 32-way 分支因子选择。

A bitmap 用于存储键值对,而非压缩
B Clojure 用 2-way 分支,深度极大
C 用 5-bit 段 => 32-way 分支 + bitmap 压缩节点,深度浅、缓存友好,路径复制实现不可变 ✓ 正确答案
D Clojure 的 map 是可变的
#

13. Clojure PersistentQueue 在 PersistentList 头节点 + 尾指针镜像的 O(1) 入队出队。

A 用 front/rear 两个 PersistentList 镜像,入队加 rear、出队取 front,front 空时翻转 rear,均摊 O(1) ✓ 正确答案
B 入队是 O(n)
C 队列只有单链表,无 rear
D PersistentQueue 是可变的
#

14. Elixir ETS + Persistent 在 OTP gen_server 的状态管理。

A gen_server 状态是可变的
B gen_server 状态必须存 ETS
C ETS 是进程私有状态
D gen_server 状态不可变传递、单一进程保证一致性,ETS 是可变共享哈希表适合高吞吐查询,二者按需取舍 ✓ 正确答案
#

15. Persistent Balanced BST 在函子 (Functor) 与 Foldable/Functor 类型类的 Haskell 风格实现。

A Haskell 默认不可变使 BST 天然持久化,用 Functor(fmap)与 Foldable(fold)类型类抽象映射与遍历 ✓ 正确答案
B Haskell 的 BST 是可变的
C Functor 类型类用于修改原树
D Haskell 无类型类机制
#

16. Persistent 跳表 (Persistent Skip List) 在 LevelDB/RocksDB snapshot 实现的工程细节。

A LevelDB 用 B+tree 做 memtable
B 跳表作为 memtable 内存写缓冲,随机层数 O(log n) 操作,快照靠不可变节点 + sequence 实现 ✓ 正确答案
C 跳表节点创建后可修改
D 跳表不支持有序迭代
#

17. Racket/WScheme Persistent Data Structures 在教学与工业的工程实现路径。

A Racket 默认可变,持久化需额外实现
B Racket 不支持持久化结构
C 教学与工业实现完全无关
D 教学用 WScheme 讲清不可变+结构共享,工业用 Racket 优化库兼顾性能,共享同一持久化思想 ✓ 正确答案
#

18. Scala PersistentHashMap 在 Cats/Stdlib 的 6-way 压缩节点 (Hash Map) 工程实现。

A Scala Map 是可变结构
B Scala 不可变 Map 基于 HAMT 变体,用 6-way 压缩节点紧凑存储哈希片段,权衡内存与查找 ✓ 正确答案
C 6-way 节点不存储哈希信息
D Cats 提供自定义 HashMap 实现
#

19. 模板正确性的验证中对拍(暴力对拍)与随机数据测试在模板维护中的作用?

A 对拍用暴力正确程序与高效程序对比输出,随机数据覆盖边界并最小化反例定位 bug,是模板验证标准手段 ✓ 正确答案
B 对拍只能验证正确性,不能定位 bug
C 随机数据无需覆盖边界情况
D 对拍与模板维护无关