Skip to content

算法Algorithm

van Emde Boas 布局

施工中 · 内容逐步修订

van Emde Boas layout · vEB layout

递归切分树高并连续摆放上下子树,使根叶路径对未知块大小保持局部性。

形式陈述 ​

布局递归 ​

在缓存无关模型中,设一棵每层都填满的二叉树有 N≥1 个节点、h≥1 层,每个节点占常数个存储单元。在约 h/2 层切开:上半形成高度 ⌈h/2⌉ 的 top tree,下方有若干高度 ⌊h/2⌋ 的 bottom subtrees。内存中先递归布局 top tree,再从左到右递归布局各 bottom subtree;单节点直接存放。布局算法不读取缓存参数 B,M。

路径 I/O 分析 ​

以节点为存储单位,固定块大小 B≥2,并设缓存至少容纳两个块。沿布局递归向下,遇到节点数不超过 B 的子树就停止细分。每棵这样的子树连续存放,即使未按块对齐,也至多跨两个块。

若整树尚不能放入一个块,停止细分的子树来自一个大小超过 B 的父递归子树。树高每次约减半,因此停止时的高度仍为 Θ(log⁡B),节点数介于约 B 与 B 之间。一条根叶路径穿过 O(1+h/log⁡B) 个这样的片段,所以块传输次数为

O(1+logB⁡N).

其中常数项覆盖整树已能放入一个块的情形。这里选定 B 只是为了分析存储结果,布局本身适用于所有块大小。

直觉

vEB 布局在许多高度尺度上同时把完整子树放成连续片段。固定任意实际块大小后,总能在递归中找到一层,使一个常数块片段覆盖根叶路径的若干层;代码无需知道 B,分析仍能把路径分成少量适配该块尺度的连续段。

vEB 布局的高度递归与内存次序
例子与边界

与层序布局对照 ​

层序数组把同深节点放一起,根附近局部性好,但路径到深层后相邻父子可能相距指数远;不同 B 下频繁换块。vEB 布局让多种高度尺度的子树都连续,适合静态搜索树的根叶遍历。

名称与失效边界 ​

本页递归的是树高,与vEB 整数树递归键宇宙不是同一结构。证明依赖平衡/完整树及连续布局;普通指针逐节点随机分配不享受界。动态插入会移动布局或产生碎片,需要 packed-memory/cache-oblivious B-tree 等额外技术。路径 I/O 好也不自动保证扫描或更新最优。

推论与应用

布局按树高递归拆成 top tree 与 bottom trees,是分治法在数据摆放上的应用。静态搜索时,键比较仍沿原树的根叶路径进行,只改变节点的物理位置。因此 CPU 比较次数为 O(log⁡(N+1)),块传输次数则为 O(1+logB⁡N);两种成本对应同一条逻辑路径。

这一证明依赖紧凑、定长的节点表示。若节点另含可变长记录,可把键和记录索引留在紧凑布局中,再单独计算取回记录的 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 节:连续递归子树与搜索传输界。
关系图谱10 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系

使用的工具

被这些条目使用

并列辨析