# 1. Splay 动态维护括号序列/文本编辑器的工程实现中隐式 Treap(按位置分裂)实现 O(log n) 插入/删除/翻转 A 节点的实际键值 B 节点的优先级 C 子树大小作为隐式下标,表示位置 ✓ 正确答案 D 插入时间戳
# 4. Path Copying 在 Persistent Data Structure 的 O(1) 节点共享。 A 每个版本都复制一份完整子树 B 未修改子树被删除 C 通过指针共享,新复制的路径节点直接指向旧版本未修改的子树 ✓ 正确答案 D 用 FAT Node 存储
# 5. Sleator-Tarjan 静态最优性定理的工程实现。 A Splay 一定比任何 BST 快 B Splay 只适用于随机访问 C 对任意固定访问序列,Splay 的代价与最优静态 BST 同阶,无需预知访问分布 ✓ 正确答案 D Splay 需要预知元素频率
# 6. RRB-Tree 的核心中如何在可持久化向量上实现 O(log n) 的 concat/append,与 Clojure PersistentVector 的 tail 优化? A 只能 append 不能 concat B 分支因子变成 1 C 完全不用 radix 树 D 允许节点部分填充(relax),从而支持 O(log n) 的 concat ✓ 正确答案
# 7. RRB-Tree 为什么能做到 O(log n) 的 concat,radix 树结构与重平衡(rebalancing)如何避免逐元素复制? A 整层节点整合 + 重平衡,把 O(n) 个元素打包进 O(log n) 个节点 ✓ 正确答案 B 每次复制一个元素 C 用数组存储所有元素 D 哈希表
# 8. Splay 的双旋(zig-zig/zig-zag)中为什么能摊还 O(log n),而单旋会退化? A 双旋更快 B 单旋实现不了 C 双旋能充分释放势能、降低路径深度,保证摊还 O(log n);单旋在反复访问深层节点时退化为 O(n) ✓ 正确答案 D 双旋占用更少空间
# 9. Splay 的区间操作中用哨兵与懒标记实现区间翻转/插入/删除的基本框架? A 消除边界特判,使 [l,r] 区间可统一通过两次 splay 定位 ✓ 正确答案 B 让查找更快 C 增加节点数 D 用于存储懒标记
# 10. Splay 与随机 Treap 的对比中为什么 Treap 用随机优先级实现期望平衡,而 Splay 用访问局部性实现均摊平衡? A Splay 是概率平衡 B 二者都用随机优先级 C 二者都用势能分析 D Treap 用随机优先级实现期望平衡,Splay 用访问即旋转与局部性实现均摊平衡 ✓ 正确答案
# 11. Path Copying 在 Functional Programming 的核心实现。 A 让不可变数据结构能高效"更新"(生成新版本),未修改部分与旧版本共享 ✓ 正确答案 B 让数据可变 C 增加副作用 D 强制深拷贝
# 13. Splay 维护区间信息的 lazy 标记下推顺序(文艺平衡树模板)中 access 后 splay 到根,先下推祖先标记再操作子树 A 为了减少节点数 B 为了加快旋转 C 祖先的懒标记尚未反映到子树,需要先自上而下下推,否则读到错误状态 ✓ 正确答案 D 懒标记不需要下推
# 14. Splay 势能分析中 rotate 摊还 3(log s(v)-log s(u)) 的逐项推导中 zig-zig/zig-zag 两种情况的势能变化计算 A 每一步都只算 O(1) B 中间节点的 size 对数值在求和时对消,只剩 x 到根的变化 ≤ log n ✓ 正确答案 C 势能恒为 0 D 与 size 无关
# 15. Zig-Zig 与 Zig-Zag 操作的势能分析与 O(log n) 摊还证明。 A 摊还代价与势能无关 B 摊还代价 ≤ 1 C 摊还代价 = O(s(x)) D 摊还代价 ≤ 3(log s'(x) − log s(x)) ✓ 正确答案
# 16. RRB-Tree 与 Immutable.js 的实现对比中结构共享与缓存局部性差异? A 都是可变链表 B 都是不可变 + 分支因子 32 的 radix trie + 结构共享 ✓ 正确答案 C 都用哈希表存储 D 都不支持共享
# 17. RRB-Tree 的工程价值中相比普通持久化向量的 concat 复杂度优势? A append 从 O(1) 变慢 B concat 从 O(n) 优化到 O(log n) ✓ 正确答案 C 访问变成 O(n) D 无法共享结构