# 1. Splay 摊还分析的势能函数中为什么以子树大小对数为势能可导出 O(log n) 均摊界? A 让旋转变快 B 让势能恒为常数 C 与树高无关 D 让每次旋转的摊还代价能被 3(log s'(x) − log s(x)) 控制,最终累计到 O(log n) ✓ 正确答案
# 2. Splay 的顺序统计中如何用子树 size 做第 k 小定位与按排名插入删除,摊还 O(log n) A 不做任何操作 B 删除整棵树 C 重建树 D 把目标节点 splay 到根 ✓ 正确答案
# 4. Splay 在区间分裂与区间合并的 O(log n) 摊还工程实现。 A 叶子节点 B 任意节点 C 根节点 D 左树的最大节点(或右树最小节点),使其右/左孩子为空再接上另一棵树 ✓ 正确答案
# 5. Splay 的工程陷阱中递归深度、内存池与迭代式 splay 的实现选择? A 迭代式 splay(沿路径收集节点后自底向上旋转) ✓ 正确答案 B 总是递归 C 增大栈空间 D 不用 splay
# 6. 多懒标记的下传中区间加与区间翻转同时存在时如何规定下传顺序与 pushdown 时机,避免标记丢失 A 任意顺序下传即可 B 定义固定且一致的下传顺序,并在访问子树前先 pushdown 祖先链上的所有标记 ✓ 正确答案 C 只保留一个标记 D 下传时忽略聚合值
# 7. Splay 的访问即旋转如何利用时间局部性,为什么重复访问同一元素时后续访问摊还 O(1),与静态平衡树的差异? A 静态平衡树能做到同样效果 B 访问后删除它 C 访问后把它 splay 到根,利用时间局部性 ✓ 正确答案 D 完全随机
# 8. Splay 与 Treap/FHQ 无旋 Treap 的对比中区间操作、可持久化与常数因子的差异? A 两者都无法持久化 B FHQ 不可持久化 C Splay 更好持久化 D FHQ 的 split/merge 沿路径复制节点即可持久化,Splay 的旋转会破坏历史版本 ✓ 正确答案
# 9. LCT 中 Splay 的角色中实链的辅助树如何维护路径信息,access 操作如何变换虚/实边? A 存储所有节点 B 用于哈希 C 作为每条实链的辅助树,维护路径聚合信息 ✓ 正确答案 D 只用于排序
# 10. Splay 的区间反转与合并分裂中如何用两棵 splay 的 join/split 实现区间操作? A 直接换根 B 逐元素反转 C 删除再重建 D split 出区间 → 打翻转懒标记 → join 回 ✓ 正确答案
# 11. Splay 在 LCT 中为什么必须用 splay 而非 treap,辅助树的虚实切换(access/makeroot)对旋转操作的要求? A Treap 更快 B Splay 支持"把节点 splay 到根后改变结构"的确定性操作,契合 access 虚实切换 ✓ 正确答案 C Splay 不需要懒标记 D Treap 无法合并且不能用作辅助树
# 12. Splay 在 Treap vs AVL vs Red-black 树的工程实测性能。 A Splay 树高更高 B Splay 旋转开销大、常数因子较大 ✓ 正确答案 C Splay 不可平衡 D Splay 无法查找
# 14. Splay 在 Apache Doris、Berkeley DB 的实际工程案例。 A 加速随机写入 B 减少磁盘空间 C 支持事务 D 利用访问局部性,让高频访问的热键驻留树顶,摊还 O(log n) ✓ 正确答案
# 15. Splay 在 LCT 的 rotate/splay 操作的工程化指针管理。 A 键值或优先级 B 左孩子或右孩子 C 辅助树内父节点 或 通过虚边指向原树上的父 ✓ 正确答案 D 深度或大小
# 17. Splay 与 FHQ Treap 在区间操作上的对比中为何无旋 Treap 更易实现持久化? A FHQ 不持有任何节点 B Splay 从不破坏结构 C 两者都易持久化 D 其 split/merge 沿路径复制节点,天然不可变,不破坏旧版本 ✓ 正确答案
# 18. Splay 与 LCT 中辅助树如何维护实链上的路径聚合信息? A 每次查询时全树遍历 B 维护在 Splay 节点上,rotate 后自底向上合并更新 ✓ 正确答案 C 存于哈希表 D 由用户手动指定
# 19. 迭代器与父指针失效中 Splay 的旋转如何使已持有的节点引用失效,为什么不适合多迭代器并发遍历 A Splay 没有迭代器 B 每次访问都会旋转重构结构,使已持有的节点位置关系失效 ✓ 正确答案 C 与其他结构无关 D 只与内存有关