形式陈述
x-fast:对前缀长度二分
键为固定字长 的互异非负整数。X-fast Trie 从二进制 Trie理路二进制 Trie 与 Patricia 压缩Binary trie · Patricia trie把整数视为定长位串,并以路径压缩只保留真正分叉的位置。出发,在每个深度 建哈希表,保存当前存在的 位前缀。叶按键序链接;内部节点在缺失孩子的方向保存通向相邻极值叶的跳指针。
对查询键 ,其长度 的前缀是否存在,随 先真后假。对深度二分找到最长存在前缀后,跳指针和叶链给出相邻键,进而回答前驱或后继。空集合单独返回不存在。
采用通用哈希理路通用哈希Universal hashing · Universal hash family从函数族随机选择哈希函数,使任意预先固定的不同键对以至多 1/m 的概率碰撞。支持的字典并控制负载时,固定查询的单次哈希查找期望为 。以下按与随机种子独立的输入/更新序列分析,并把哈希求值、键比较和前缀提取计为常数字操作。X-fast 查询为期望 ,空间为 ;插删要维护至多 个前缀,使用动态哈希时为期望摊还 。
y-fast:只给桶边界建立前缀索引
Y-fast 的分桶思路把连续键区间放进平衡搜索树理路平衡搜索树Balanced search tree以结构不变量保证对数高度和最坏对数搜索时间的二叉搜索树族。,只对每桶的代表边界建立 x-fast 索引。本页具体采用阈值分裂/合并版本:除单桶的小集合情形外,每桶维持约 到 个键,边界是递增的整数分隔值,最后一个边界可取宇宙最大值。边界不必始终是仍存活的记录。
查询先找不小于 的第一个右边界,在对应桶内查前驱;若该桶没有不大于 的键,再取前一桶的最大键。边界只负责路由,不作为答案返回。桶内查找为最坏 ,代表索引查询为期望同阶,因此总查询为期望 。
直觉
X-fast 为所有深度建立哈希入口,把逐位导航变成对长度的二分;代价是每个键可能贡献 个前缀。Y-fast 让约 个相邻键共享一个代表,再到小桶中完成最后的比较,从而用少量索引加桶内存储覆盖全部键。
这两层分担不同职责。代表层定位区间,桶内树查真实记录;分隔值即使刚从数据中被删除,也可以继续担当原来的区间边界。这样才不会因每次删除一个边界记录,都立即重写其 个哈希前缀。
例子与边界
最长存在前缀
查询八位键 ,若前缀 存在、 不存在,则不存在的更长前缀也不必再试。最长前缀节点说明下一位想走0支,但该支缺失;从它的最小叶及前一叶就可定位相邻键。这里查的是前缀集合,不是对各层哈希表的物理桶号二分。
路由边界与真实答案
设两个桶覆盖 与 ,当前分别含 与 。删除记录15后,可以仍保留路由边界15;查询15进入第一桶并返回8,查询18进入第二桶,但桶中没有不大于18的键,于是返回前桶最大值8。
若直接把边界15当作前驱答案,就会返回一个已经删除的键。边界身份、桶的实际成员及叶链次序必须分别维护。
成本的概率与参数
也可写成 ,但只有明确 与 的关系后,才可改写成 。本页使用随机哈希,所以查询是期望界;桶分裂、合并及哈希扩容又使更新采用期望摊还界。观察种子或结构后自适应选择键的对手,需要另外的随机性分析。
推论与应用
分裂、合并与摊还账本
插入先定位桶并作树更新。桶超过 时按中位数分成两个约 的桶,并新增中间分隔值。删除使桶少于约 时,与邻桶一起重组:总数不超过 就合成一桶,超过时重新平均分成两个桶。这个阈值让重组后的桶远离下一次分裂与欠载边界。小字长及整数取整按常数大小基例处理。
新建或重新均衡的桶与触发阈值之间留有 次更新的余量。一次结构重组至多改变常数个代表,各自更新 个前缀;即使把桶树重建保守计为 ,也可用摊还分析理路摊还分析Amortized analysis对操作序列的总成本作上界,而非逐次最坏成本。分散到引起重组的一段更新上,得到每次更新期望摊还 。这里的账本要求边界在普通桶内更新期间保持稳定。
X-fast 代表数为 时,前缀索引占 空间,桶内树合计也为 。仅剩一桶时直接使用该树,不建立代表层;直到它再次超过 才分桶并恢复索引。这样既覆盖 的小集合,也避免在 附近反复建立和拆除 层索引。
与抽样代表版本的区别
另一条经典路线以约 的概率抽取代表,并在相邻代表间维护桶。它控制的是桶大小和代表更新频率的期望,而本页阈值方案用明确的分裂/合并与稳定分隔值记账。两者共享两层设计,但不能把随机桶大小、确定大小阈值和单次最坏更新混成一张无条件成本表。
代表层的叶链、跳指针及桶邻接关系要同时维护。只更新前缀哈希而保留旧邻接链接,会使查询得到正确的前缀位置,却进入错误的相邻桶。
参考资料
- Dan E. Willard,Log-Logarithmic Worst-Case Range Queries are Possible in Space Θ(N),Information Processing Letters 17(2), 1983,pp. 81–84。
- Pat Morin,Open Data Structures: An Introduction,Athabasca University Press,2013,Chapter 13: Data Structures for Integers,x-fast 前缀结构与 y-fast 抽样代表版本。
- Gonzalo Navarro,Compact Data Structures: A Practical Approach,Cambridge University Press,2016,整数前驱数据结构。