Skip to content

模型Model

Xor 过滤器

Xor filter · 异或过滤器

把静态成员集写成三位置异或方程,度一剥离后逆序赋值,并把构建失败、查询误报与哈希独立性分别证明。

形式陈述 ​

三个位置共同保存一份指纹 ​

输入是预先固定的有限原键集合S,先按完整键去重,令 n=|S|。取b≥1、r≥1,建立长度m=3b的r位数组B。三个位置函数分别落在互不相交的区间

h0(x)∈[0,b),h1(x)∈[b,2b),h2(x)∈[2b,3b).

另取r位指纹f(x)。构建成功后,对每个成员x满足

B[h0(x)]⊕B[h1(x)]⊕B[h2(x)]=f(x).

查询重算三个位置和指纹,只比较这条等式;不等则确定不在S,相等则可能在S。三个位置不同由区间划分保证,不靠“哈希大概不会碰撞”。数组不保存原键,所以肯定答案不精确。[1, §§3.1–3.2]

从图的边扩展到三端点 ​

沿用图的顶点和带身份边思想,把数组位置作为顶点,每个原键作为一条含三个端点的边,得到三部三均匀超图。不同原键即使端点相同也要保留为不同边,不能先按位置三元组去重。

维护各顶点当前度数,把度为1的顶点放入队列。弹出v时重新检查度数;若已不是1就跳过,否则取其唯一尚存边e,记录 (e,v),删除这条边并把它的三个端点度数各减1。新变成度1的顶点入队。v称为这一边的支点。

若队列耗尽时仍有边,报告本轮构建失败,不发布未完成的B。若n条边全部删去,得到剥离次序。初始化全部B为0,逆序处理每个 (e,v),将B[v]设为该边指纹异或另外两位置的当前值。

逆序赋值为何不破坏已经完成的行 ​

边e被剥离时,v只属于e,不属于当时仍未删去的任何其它边。逆序回放到e时,那些当时未删去的边已经赋好值;它们都不使用v,所以改B[v]不会破坏它们。新值又使e的异或等式成立。按逆序归纳,最终每个成员方程都成立,因而没有假阴性。

这份证明解释了支点的作用,也解释了为什么不能照剥离正序任意写值:正序中后来可能改到早先方程使用的位置。未作为支点的位置初值取0即可;正确性不要求B本身逐槽独立随机。

直觉

先找只剩一个未知方程的出口 ​

一条方程有三个数组位置,若其中某位置不再被其它待解方程使用,就可以把这条方程暂时拿走。等其它方程都解决后,回到这个私有位置,用它补齐异或差额。这与完整高斯消元的目标相关,但此处只使用度一结构,不任意组合方程。

查询只读三个r位值。构建时却要看全部边,才能找出安全赋值次序。这是用批量预处理换固定查询工作的静态接口,不能把单键查询便宜理解为单键更新也便宜。

例子与边界

四条方程的完整剥离与回放 ​

取b=3、r=3,四个键的端点和指纹为:

键 三个位置 指纹
a 0、3、6 1
b 0、4、6 2
c 1、3、7 4
d 1、4、8 3

开始只有位置7和8度为1。按顶点编号入队并处理,可依次剥离 (c,7)、(d,8)、(a,3)、(b,4);其中某些先前入队的顶点会过期,弹出时检查度数即可。

逆序赋值为:B[4]=2;B[3]=1;B[8]=3⊕B[1]⊕B[4]=1;B[7]=4⊕B[1]⊕B[3]=5。其它位置为0,最终

B=[0,0,0,1,2,0,0,5,1].

例如键c得到 0⊕1⊕5=4,键d得到 0⊕2⊕1=3。必须逐条检查方程,不能只验证最后写入的支点。

剥不动不等于方程无解 ​

设两个不同键拥有同一三元组(0,1,2)。三个顶点度数都是2,没有度1出口。如果两键指纹同为5,方程实际相同,仍有许多解;若指纹分别为5和6,则同一左边不可能同时等于两数,确实无解。剥离算法对两种情况都报告失败。

因此失败说明没有获得这套剥离构造的证书,不是一般线性系统不可解的判定。可以换位置函数重试或调整容量,也可以改用更复杂的解方程方法,但不能把后者的能力冒充本文算法。

查询误报需要怎样的随机性 ​

固定非成员x。条件化于位置函数、成功剥离次序及全部成员指纹后,B和查询三个位置的异或值都已确定。如果f(x)仍是独立均匀r位串,则按这个概率分布

Pr[x通过查询∣全部构建信息]=2−r.

因此无条件误报率也为 2−r。充分条件是指纹函数对固定相关键给出完全独立输出,并与位置函数独立;重试成功与否只由位置图决定。仅有每键边缘均匀、两两独立或简单制表的三独立,都不足以直接推出给定整张成员表后的条件独立。

工程中常从少量种子展开位置和指纹,需另证相应模型或接受近似随机假设。本页的确定性检查器接收已给定的三元组和指纹,用来验结构与方程,不把伪随机实验当成理想独立性的证明。

推论与应用

每次构建、重试和输出接口分别记账 ​

度数与关联边可用每点计数及边ID异或维护:插入边e时,在其三个端点把e的ID异或进去;度为1时,这个值恰好就是唯一边ID。移除再异或一次。边ID0合法,必须靠度数判断是否唯一,不能把ID异或值0当作空。每条边只移除一次,最多带来三次新度1入队,故队列工作和逆序赋值合计O(n+m)。构建空间O(n+m)个字;最终查询表只有mr位,另存种子等元数据。

上述线性构建从已去重的键集合及已给定位置、指纹开始,原键去重成本单列。下载器用Python集合检查重复键,该检查在通常散列成本模型下是期望线性,不是任意Python键的最坏线性保证。核心操作按每个位置、边ID、计数和r位值装入常数个RAM字计;长键或多字指纹的读取、哈希求值成本不能略去。

一次成功查询固定读三个位置,最坏O(1)。一次构建失败仍已付O(n+m)。只有明确证明每次独立重试的成功概率至少p₀>0,才可用几何分布得期望构建成本 O((n+m)/p0);本文没有对任意n、b及任意位置函数族承诺这个下界。可以设置重试预算,耗尽就返回未构建,而不是悄悄给出缺成员的表。

n=0时,零数组加三位置查询仍会对指纹0给出误报,概率模型下恰为 2−r;若另存空集标记,可直接全部否定。这是一个明确的接口优化,不影响非空集合证明。

与商过滤器逐项维护指纹多重集不同,本表构建后不支持任意单键插删。随意改一个位置会影响共享它的其它成员方程;集合变化应整批重建,或另设增量结构并重新证明查询组合规则。

终点任务要求交出剥离序列、每步唯一边检查和逆序数组,再构造同端点两键的“有解但剥不动”与“无解”实例。最后固定一份成功表,穷举非成员的全部r位指纹,验证恰有一种通过;这里测试的是条件概率的有限样本空间,而不是一次经验误报率。

参考资料

[1] Thomas Mueller Graf、Daniel Lemire,Xor Filters: Faster and Smaller Than Bloom and Cuckoo Filters,2020,Journal of Experimental Algorithmics25,Article1.5,§§3.1–3.2,Algorithms1–4(作者PDF pp.2–6):三位置方程、剥离和逆序赋值。本文明确限定独立性、重试成功条件与构建失败语义,不把经验容量系数当作全体输入定理。

关系图谱12 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

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

使用的工具

并列辨析