形式陈述
给定一条长度 的目录链 ,每个目录是按同一全序理路全序Total order · Linear order任意两个元素都可比较的偏序。键排序的有限记录序列,允许等值记录和空目录。查询要在每个目录找最后一个键不大于 的位置,没有则返回 。记原始记录总数为 。
从后向前构造增强目录,令 ,并令
其中采样取下一目录按位置编号的第 条记录,线性归并理路归并排序Merge sort递归排序两半并线性合并的稳定比较排序算法。保留重数及“原记录/复制样本”的来源;这里不是去重的集合并。每条增强记录 保存两种位置:本层原目录 中最后一个键不大于 的位置,以及下一增强目录 中相同意义的位置。相等键的桥指向该等值段末尾。目录开头另设一个不计入数据的 哨兵,其两种位置都为 。
先在 用一次二分查找理路二分查找Binary search在有序数组中反复排除一半候选区间的查找算法。求 的前驱位置。若该记录为 ,沿它的桥到下一目录,再检查至多一个后继,就能恢复 在下一层的前驱;同时由本层原目录指针返回该层答案。如此沿链前进,总查询时间为
每层记录数满足 ,故全部增强记录至多 ;包括 个目录头与哨兵后,总空间为 。已排序输入可用线性合并扫描建立采样与桥,同为 预处理。比较与数组访问按单位成本计。
直觉
一次完整二分确定了查询键在当前目录中的缝隙。下一目录每隔一个记录就有一个样本复制回来,因此这个缝隙里不可能隐藏很长的未知段。桥把位置带过去,只需一次局部修正;之后不用重新二分。
复制样本帮助导航,却不是本层原始数据。回答“第几条原记录”或做范围报告时,必须回到原目录指针,不能把桥记录当作额外对象输出。
分数级联的采样桥与局部校正
例子与边界
一次需要局部修正的查找
取 ,样本为 ,再取 ,于是 。查询 时,首层没有前驱,从哨兵的桥落到 的位置 。下一记录为 ,前进一步后,,所以第二层前驱为 ;第一层仍返回不存在。
查询 时,首层前驱为 ,桥指到第二层的 ;下一项 ,无需前进。两层的原目录答案分别为 和 。
重复值也要按位置保存。若 ,第一个采样记录是 ;查询键 时,桥须指向等值段末尾 ,不能因为样本来自 就把它误报为最后一项。记录身份与键值相等是两件事。
为什么至多修正一步
设 是 在 中的最后一个前驱。桥已经定位到 中键不大于 的最后一项。从那里到真正答案之间,所有新遇到的键都在 。若至少有两个这样的记录,连续位置中必有一个被每隔一项的采样选中,并复制进 ;它会成为比 更靠后的合法前驱,矛盾。因此最多只有一个未采样记录需要跨过。哨兵情况是同一个首段论证。
同理, 不会另有键落在 ,因为其全部记录本就包含在 。所以 保存的本层原目录位置也是 的正确答案。空目录、查询小于全部键或大于全部键都由这些边界位置统一处理。
推论与应用
二维范围树理路范围树range tree以主坐标搜索树和节点关联目录支持固定维正交范围查询。查询沿树访问相关的 目录。共享两个纵向边界位置,可把原先每张表独立二分的 定位工作降为 ,报告仍另加 项输出。这里闭区间下端需要 lower bound、上端需要 upper bound;可对严格前驱与非严格前驱分别建立一致的桥约定,不能把本页的最后一个 位置直接当成第一个 。
目录链是最清楚的基型。原始分数级联定理还允许有界度目录图,并按实际经过的边传播搜索;采样密度和桥结构要适应该度界,不能把链上的“每隔一项复制”不加修改地套给任意分支图。任意不相邻的目录也不能免费获得桥定位。
动态插删会改变采样位置与桥,需另行维护动态分数级联结构。静态定理不会自动给出相同更新界。首项对数取决于首个增强目录大小,可用 统一上界;其后工作则取决于实际访问的目录数。
参考资料