“本页的 $O(\log n)$ 是有序数组、常数时间随机访问和比较模型下的最坏查询界。前驱问题把“找最后一个不超过 $x$ 的键”提升为可跨模型比较的接口,整数 Word RAM 能利用键的…”
形式陈述 ​
模型、接口与目标 ​
在缓存无关模型中,数据以块大小
对
次 I/O,同时做
静态树的 vEB 递归布局 ​
先构造一棵平衡二叉搜索树,再按van Emde Boas 布局存入连续数组。对高度
搜索仍按比较结果从根走向叶,变化的是节点地址。布局递归没有一层写着“每块放
块传输界的不变量 ​
固定任意
个这样的路径片段。
每个片段只引起常数次块传输,得到搜索界。证明重心是“某个合适尺度的递归子树连续”,并非笼统的“递归会有局部性”。若节点由普通堆分配器逐个随机放置,逻辑递归关系不再带来地址连续性,论证也随之消失。
直觉
普通二叉搜索树的逻辑路径只有
例子与边界
查询 11 的可追踪例子 ​
把键
层序数组会把 8、12、10、11 放在下标 1、3、6、13 附近,越到深层距离越大。vEB 布局先连续递归放上半树,再放下半子树;对于能容纳约四个节点的块,路径中的相邻若干层会被同一个递归片段覆盖。
这个例子不声称四个节点必然恰落在一个对齐块内。数组起始地址可能使连续片段跨块,所以证明按常数块而非“一块”计数;渐近界不依赖幸运对齐。
predecessor 与扫描 ​
predecessor 搜索记录路径上最后一个小于查询键的候选,访问的仍是一条根叶路径,因此继承相同 I/O 界。successor 对称。
区间扫描需要额外的叶序结构。若布局把中序叶或记录区连续存储,定位首键后可用
推论与应用
动态维护为何是另一项技术 ​
静态数组插入一个键可能移动大量后缀,树旋转也会破坏递归片段。动态缓存无关搜索树通常把有序记录放入 packed-memory array,以分层密度阈值控制局部重排,再用缓存无关搜索索引定位区域;更完整的 cache-oblivious B-tree 还要协调分裂、重建和扫描。
密度不变量要求每个层级区间的占用率落在相应上下界。插入先利用附近空隙;区间过密时逐级扩大重排范围。由多次局部更新摊分重排成本,而不是从静态
与已知结构的对照 ​
传统 B-tree 明确知道
排序数组也有优秀的顺序扫描局部性,二分搜索却可能在每一层跳到远处;合适的 cache-oblivious 静态布局改善的是搜索路径。名称中的 vEB 指 layout,不是按整数宇宙递归、支持 predecessor 的 van Emde Boas 集合。
适用边界 ​
界依赖记录大小固定或可受控,使
因此页面级结论应分开报告:静态查找可由 vEB layout 达到
参考资料
- Harald Prokop, Cache-Oblivious Algorithms, MIT Master's Thesis, 1999.
- Michael A. Bender, Erik D. Demaine and Martin Farach-Colton, Cache-Oblivious B-Trees, SIAM Journal on Computing, 2005.
- Matteo Frigo, Charles E. Leiserson, Harald Prokop and Sridhar Ramachandran, Cache-Oblivious Algorithms, ACM Transactions on Algorithms, 2012.