“van Emde Boas 布局则递归摆放一棵既有树的节点,以改善缓存局部性。它与本页的整数集合查询结构共享名称,但递归对象和接口不同。”
形式陈述
布局递归
在缓存无关模型中,设一棵每层都填满的二叉树有
路径 I/O 分析
以节点为存储单位,固定块大小
若整树尚不能放入一个块,停止细分的子树来自一个大小超过
其中常数项覆盖整树已能放入一个块的情形。这里选定
直觉
vEB 布局在许多高度尺度上同时把完整子树放成连续片段。固定任意实际块大小后,总能在递归中找到一层,使一个常数块片段覆盖根叶路径的若干层;代码无需知道
例子与边界
与层序布局对照
层序数组把同深节点放一起,根附近局部性好,但路径到深层后相邻父子可能相距指数远;不同
名称与失效边界
本页递归的是树高,与vEB 整数树递归键宇宙不是同一结构。证明依赖平衡/完整树及连续布局;普通指针逐节点随机分配不享受界。动态插入会移动布局或产生碎片,需要 packed-memory/cache-oblivious B-tree 等额外技术。路径 I/O 好也不自动保证扫描或更新最优。
推论与应用
布局按树高递归拆成 top tree 与 bottom trees,是分治法在数据摆放上的应用。静态搜索时,键比较仍沿原树的根叶路径进行,只改变节点的物理位置。因此 CPU 比较次数为
这一证明依赖紧凑、定长的节点表示。若节点另含可变长记录,可把键和记录索引留在紧凑布局中,再单独计算取回记录的 I/O。范围扫描也需要自己的分析:连续输出多少条记录、如何从一片叶区间进入下一片,都是根叶搜索界之外的工作。
理想缓存模型把块传输单独计费,实际多级缓存、TLB 和预取还会影响运行常数。静态路径的局部性界只需常数个块的缓存容量;动态缓存无关搜索树则需进一步安排空位、重建和更新。
参考资料
- Harald Prokop, Cache-Oblivious Algorithms, MIT thesis, 1999.
- Matteo Frigo et al., Cache-Oblivious Algorithms, FOCS, 1999.
- Michael Bender, Erik Demaine, Martin Farach-Colton, Cache-Oblivious B-Trees, SIAM J. Comput., 2005,2.1 节:连续递归子树与搜索传输界。