外部内存数据结构详解
1. 3 边平面范围搜索问题及解决思路
在处理 3 边平面范围搜索问题时,会遇到一些挑战。为了实现高效的外部树数据结构,需要较大的扇出,这就引出了 O(B²) 结构。该结构解决了 O(B²) 个点的静态版本问题,它之所以必要,是因为要“支付”访问子节点 vi 的代价,需要在对应 vi 的平板中找到 Θ(B) 个满足查询的点。
插入点 p 到节点 v 时,可能会导致 O(B²) 结构中对应包含 x 的子节点 vj 的平板里点过多。此时,除了将 p 插入 O(B²) 结构,还需移除 vj 对应点中 y 坐标最低的点 p′,并将 p′ 递归插入以 vj 为根的树中。插入操作在搜索路径上的每个节点使用 O(1) 次 I/O,总共需要 O(logB N) 次 I/O。同时,还需将 x 插入基础 B 树,这可能会导致分裂和/或共享操作,每次此类操作可能需要重建 O(B²) 结构。使用平衡 B 树,可以在最坏情况下以 O(logB N) 次 I/O 完成插入后的重新平衡。删除操作也可以类似地以 O(logB N) 次 I/O 处理。
这里用到了一些常见的技术:
- 过滤 :将部分查询成本分摊到输出大小上。
- 引导范式 :在每个节点使用 O(B²) 元素的静态结构。
- 权重平衡和全局重建 :用于获得最坏情况下高效的更新边界。
2. 一般平面范围搜索
在解决了 3 边平面范围搜索问题后,我们来考虑一般平面范围搜索,即给定平面上的一组点,找出查询矩形内的所有点。
对于这