平衡树变形与跳表(Treap/Splay/无旋 Treap)

共 17 题
#

1. Splay 树的均摊 O(log n) 如何通过伸展操作实现?zig/zig-zig/zig-zag 三种情况的旋转规则与势能函数 Φ=Σlog(size(x)) 的摊还分析

A 先旋父节点,再旋目标节点 ✓ 正确答案
B 不旋转
C 只旋目标一次
D 先旋目标节点,再旋父节点
#

2. Java ConcurrentSkipListMap 的并发控制策略

A CAS 原子更新指针(无锁) ✓ 正确答案
B 全局互斥锁
C 信号量
D 读写锁
#

3. 跳表(skip list)如何用多层随机索引实现 O(log n) 查找

A O(n log n)
B O(n)
C O(log n) ✓ 正确答案
D O(1)
#

4. Splay 的'工作集定理'中访问最近访问过的元素摊还 O(log n),访问频率越高的元素越靠近根

A 最近访问过的元素摊还代价低,高频元素靠近根 ✓ 正确答案
B 所有元素访问代价相同
C Splay 树是严格平衡的
D 访问代价与频率无关
#

5. Treap 如何用随机优先级+旋转维持期望 O(log n) 平衡?证明期望树高为 O(log n)(等价于随机 BST 的期望高度)

A 随机优先级使树等价于随机 BST,期望高度 O(log n) ✓ 正确答案
B 使用 AVL 旋转
C 树是完美平衡
D 使用哈希
#

6. Treap 与笛卡尔树的等价性中 Treap 的插入顺序按 priority 排序后构建的笛卡尔树即为该 Treap

A 两者都是严格平衡
B 两者都使用哈希
C 两者都保存键序与优先级堆序 ✓ 正确答案
D 两者无关
#

7. Treap 的期望 O(log n) 与 AVL/红黑树的严格 O(log n) 在工程中的取舍中 Treap 常数小但最坏概率存在,红黑树稳定但旋转复杂

A Treap
B 跳表
C 红黑树/AVL ✓ 正确答案
D 张量
#

8. 为何跳表相比红黑树更易实现且无复杂旋转

A 更快的查找
B 实现简单、无需复杂旋转 ✓ 正确答案
C 更省内存
D 严格平衡
#

9. 跳表在 SSD/磁盘上的"概率索引"类比与分形树

A 完全随机
B 使用哈希
C 每层节点用缓冲批量吸收写入,减少磁盘写放大 ✓ 正确答案
D 无缓冲
#

10. Redis 的 zset 为何选跳表而非平衡树(范围查询/简单)

A 跳表支持高效范围查询且实现简单 ✓ 正确答案
B 跳表查找更快
C 平衡树更省内存
D 跳表需要旋转
#

11. Splay 在 LCT(Link-Cut Tree)中作为辅助树的角色中 preferred path 上的 Splay 维护路径信息,access 操作中的 splay 暴露路径

A 把目标节点到根的路径打通并暴露为一个 Splay ✓ 正确答案
B 删除整棵树
C 查找最小值
D 构建笛卡尔树
#

12. 为何 Redis 的 zset 选跳表而非 Treap/Splay(概率平衡 vs 确定性旋转),实现复杂度、范围查询、并发友好性

A 跳表查找更快
B 跳表实现简单、范围查询自然、并发友好 ✓ 正确答案
C Treap 复杂度更高
D Splay 更省内存
#

13. 如何把跳表改造为支持范围扫描的并发有序结构

A 底层是有序链表,可沿链顺序遍历 ✓ 正确答案
B 使用哈希
C 每层随机
D 无底层链
#

14. 并发跳表如何用细粒度锁/乐观锁支持并行更新

A 全局大锁
B 禁用并发
C 细粒度锁或 CAS 乐观锁 ✓ 正确答案
D 串行队列
#

15. 无旋 Treap 的可持久化中 split/merge 时复制路径上的节点即可实现 O(log n) 的持久化平衡树

A 原地旋转
B 在 split/merge 时复制路径上的节点,生成新版本 ✓ 正确答案
C 使用哈希
D 不保留版本
#

16. 无旋 Treap(FHQ Treap)的 split/merge 操作如何替代旋转?按值分裂与按秩分裂的实现,惰性标记在 merge 中的下推顺序

A split 与 merge ✓ 正确答案
B 左旋与右旋
C 红黑染色
D 哈希
#

17. 跳表与 B+ 树在磁盘/内存场景的对比中跳表适合内存(无旋转、简单),B+ 树适合磁盘(高分支因子、页对齐)

A B+ 树无查找
B B+ 树实现更简单
C B+ 树高分支因子 + 页对齐,减少磁盘 I/O ✓ 正确答案
D 跳表不能范围查询