“本页的 $O(\log n)$ 是有序数组、常数时间随机访问和比较模型下的最坏查询界。前驱问题把“找最后一个不超过 $x$ 的键”提升为可跨模型比较的接口,整数 Word RAM 能利用键的…”
形式陈述
模型、接口与目标
在缓存无关模型中,数据以块大小
本页的静态构造选取二叉搜索树;动态 cache-oblivious B-tree 另需后文说明的维护结构。令
次 I/O,同时做
静态树的 vEB 递归布局
先对排序键递归选取中位数,构造高度为
搜索仍按比较结果从根走向叶,变化的是节点地址。布局递归没有一层写着“每块放
块传输界的不变量
固定任意
个这样的路径片段。
每个片段只引起常数次块传输,得到搜索界;整树已经不超过一个块大小时,常数项覆盖首次装入。空字典直接返回无匹配,不计算
直觉
普通二叉搜索树的逻辑路径只有
例子与边界
查询 11 的可追踪例子
把键
层序数组会把 8、12、10、11 放在下标 1、3、6、13 附近,越到深层距离越大。vEB 布局先连续递归放上半树,再放下半子树;对于能容纳约四个节点的块,路径中的相邻若干层会被同一个递归片段覆盖。
这个例子不声称四个节点必然恰落在一个对齐块内。数组起始地址可能使连续片段跨块,所以证明按常数块而非“一块”计数;渐近界不依赖幸运对齐。
predecessor 与扫描
本页的 predecessor 返回不大于查询键的最大已存键:沿路径保留最后一个合适候选,比较相等时即可返回;无候选时报告无前驱。successor 对称地返回不小于查询键的最小成员。两者都只访问一条根叶路径,继承相同 I/O 界;严格前驱或严格后继则须排除相等项。
区间扫描需要额外的叶序结构。若布局把中序叶或记录区连续存储,定位首键后可用
推论与应用
动态维护为何是另一项技术
静态数组插入一个键可能移动大量后缀,树旋转也会破坏递归片段。动态缓存无关搜索树通常把有序记录放入 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.