For AI agents: the complete documentation index is available at https://shijin.space/llms.txt, the full documentation bundle is available at https://shijin.space/llms-full.txt, and this page is available as Markdown at https://shijin.space/knowledge/nearest-neighbor-search-and-bucketing/index.md.

19 筛法中的近邻搜索与分桶

整理日期:2026-10-16。
适用范围:欧氏格两向量筛法中的伙伴搜索、分桶候选生成,以及检查成本和有效配对覆盖的基本模型。
前置笔记:15 高斯启发式与随机球面模型、17 筛法的基本框架与两向量约化、18 Nguyen–Vidick、ListSieve 与 GaussSieve。

设当前筛法维数为 s≥2s\ge2,待搜索的非零格向量池为 D={x1,…,xN}D=\{x_1,\ldots,x_N\}。本篇先固定一轮中的输入池,不预设它已经两两约化。

1. 筛法需要怎样的近邻搜索

第 18 篇中的基础算法需要反复寻找能够产生较短结果的向量。搜索任务可以分为两种:

  • 单个候选的伙伴搜索。 给定 xx,在当前池中寻找满足约化条件的 yy;找到后可能更新 xx 并继续搜索。
  • 批量配对搜索。 在整个池中寻找许多有效向量对,供下一轮筛选或数据库更新使用。

BGJ 将后一类任务表述为:给定单位向量列表和角度阈值,寻找夹角满足阈值的向量对。参见 Becker–Gama–Joux,ePrint 2015/522,摘要中的固定半径近邻问题。

以下批量模型采用“缩短两条向量中较长者”的判据。令

d±(x,y)=min⁡{∥x−y∥,∥x+y∥},d_{\pm}(x,y)=\min\{\|x-y\|,\|x+y\|\},

则有效对满足

0<d±(x,y)<max⁡{∥x∥,∥y∥}.0<d_{\pm}(x,y)<\max\{\|x\|,\|y\|\}.

等长情形下,这对应第 15 篇的 ∣cos⁡θ∣>1/2|\cos\theta|>1/2,并排除产生零向量的情形。长度不同时,需要保留真实范数;归一化方向只用于组织搜索。

这里通常只需要找到符合长度条件的伙伴,不必找到有限池中距离最小的元素。搜索范围也是当前池中的有限个向量;CVP 的搜索范围则是整个格。

嵌入具体算法时,仍应使用它原有的约化方向和目标长度。例如,用 yy 缩短指定的 xx,与只要求缩短两者中的较长者,是不同的任务。

2. 用桶生成候选

分桶先把可能形成有效对的向量放到共同的小集合中,再检查这些集合内部的向量对。

令

ui=xi∥xi∥∈Ss−1.u_i=\frac{x_i}{\|x_i\|}\in S^{s-1}.

考虑一个简单的对称球帽模型:选择中心方向 cℓ∈Ss−1c_\ell\in S^{s-1} 和阈值 0<α<10<\alpha<1,定义

Bℓ={i:∣⟨ui,cℓ⟩∣≥α}.B_\ell =\{i:|\langle u_i,c_\ell\rangle|\ge\alpha\}.

它包含以 cℓc_\ell 和 −cℓ-c_\ell 为中心的两个球帽,用绝对值同时照顾加法与减法方向。桶中存储原向量的编号,长度和坐标仍保留在 DD 中。

单侧球帽过滤 ⟨u,c⟩≥α\langle u,c\rangle\ge\alpha 是球面 LSF 的基本构造;本篇在此基础上使用对称的两个球帽。参见 Becker–Ducas–Gama–Laarhoven,SODA 2016,§4,PDF 第 5 页。

需要区分三个性质:

  • 桶可以重叠,一条向量可以进入多个桶。
  • 同桶只意味着成为待检查的候选,不保证满足约化条件。
  • 有效对也可能没有进入任何共同的桶,因此需要分析漏检概率。

提高 α\alpha 会缩小桶,但也可能降低有效对共同入桶的概率。分桶参数要同时考虑检查成本与搜索覆盖。

3. 一个固定输入池的搜索流程

下面的伪代码使用 tt 个独立、均匀随机的中心,展示一次批量搜索。它允许跨桶重复检查,也允许重复输出:

BucketSearch(D, α, t):
    固定本轮的 D,计算各向量的范数与归一化方向

    重复 t 次:
        c ← 在单位球面上独立均匀采样
        B ← {i : |〈u_i,c〉| ≥ α}

        对 B 中每个无序对 i < j:
            σ ← 1(若 〈x_i,x_j〉 ≥ 0),否则 −1
            w ← x_i − σ·x_j

            如果 0 < ||w|| < max(||x_i||, ||x_j||):
                输出 (i, j, w)    # 可以流式处理

        释放本桶

符号选择使 ww 在 xi−xjx_i-x_j 和 xi+xjx_i+x_j 中取较短者。输出的是候选及其来源,外层算法再决定去重、接纳和替换规则。

这个流程仅描述搜索阶段。它没有规定初始采样、完整筛法的停止条件,也没有凭分桶本身保证找到最短向量。

4. 检查次数与有效对覆盖

记第 ℓ\ell 个桶的大小为 bℓ=∣Bℓ∣b_\ell=|B_\ell|。如果每个桶内部都完整枚举无序对,且没有跨桶去重,则检查次数为

C=∑ℓ=1t(bℓ2).C=\sum_{\ell=1}^{t}\binom{b_\ell}{2}.

同一对向量在三个桶中出现,就贡献三次检查。因此,平均桶大小不足以确定 CC;在总入桶次数固定时,桶大小越不均衡,检查次数越多。

对固定源向量对 (i,j)(i,j),定义共同入桶次数

mij=∑ℓ=1t1{i,j∈Bℓ}.m_{ij} =\sum_{\ell=1}^{t} \mathbf 1\{i,j\in B_\ell\}.

于是

C=∑i<jmij.C=\sum_{i<j}m_{ij}.

再令 EE 为固定输入池中所有有效无序对的集合,则:

H=∑(i,j)∈Emij,U=∑(i,j)∈E1{mij>0}.H=\sum_{(i,j)\in E}m_{ij}, \qquad U=\sum_{(i,j)\in E}\mathbf 1\{m_{ij}>0\}.

其中,HH 是包含重复的有效对命中次数,UU 是实际覆盖的不同有效源向量对数。对本流程,C−HC-H 是未通过约化检查的次数。

UU 仍不等于不同新向量的数量:不同源向量对可能产生相同结果,结果也可能已在池中。实际池更新还取决于接纳规则。

以上等式直接来自固定输入池、完整桶内枚举的计数定义。若提前停止、跨桶去重或在搜索中修改输入池,需要按实际流程重新计数。

5. 从入桶概率到覆盖概率

下面的概率公式都针对第 3 节的理想化随机中心模型。

对任意固定单位向量 uu,令

p=Pr⁡c[∣⟨u,c⟩∣≥α]=2ps(α),p=\Pr_c[|\langle u,c\rangle|\ge\alpha] =2p_s(\alpha),

其中 ps(α)p_s(\alpha) 是第 15 篇定义的单侧球帽概率。由旋转对称性,pp 不依赖 uu 的方向,因此对任意固定输入池都有

E[bℓ]=Np.\mathbb E[b_\ell]=Np.

这个期望不要求池内向量相互独立。

但两个固定向量共同入桶的概率是

qij=Pr⁡c ⁣[∣⟨ui,c⟩∣≥α, ∣⟨uj,c⟩∣≥α].q_{ij} =\Pr_c\!\left[ |\langle u_i,c\rangle|\ge\alpha,\ |\langle u_j,c\rangle|\ge\alpha \right].

qijq_{ij} 取决于两条向量的夹角,一般不等于 p2p^2。单侧版本由两个球帽交集的相对面积描述;双侧版本还需要计入对应的符号方向。球帽交集与共同过滤概率的关系见 BDGL,§2 的球楔定义与 §4,PDF 第 3、5 页。

由期望的线性性,检查次数满足

E[C]=t∑i<jqij.\mathbb E[C] =t\sum_{i<j}q_{ij}.

固定一对 (i,j)(i,j),由于不同桶中心独立采样,它至少共同入桶一次的概率为

Pr⁡[mij>0]=1−(1−qij)t.\Pr[m_{ij}>0] =1-(1-q_{ij})^t.

因此,不同有效源向量对的预期覆盖数为

E[U]=∑(i,j)∈E[1−(1−qij)t].\boxed{ \mathbb E[U] =\sum_{(i,j)\in E} \left[1-(1-q_{ij})^t\right]. }

覆盖公式使用了同一对向量在不同桶中的命中事件独立这一条件,不要求不同源向量对之间独立。检查次数的期望只使用线性性。使用结构化、相关或自适应选择的桶时,需要重新核对覆盖公式。

若希望某个固定有效对的漏检概率至多为 δ∈(0,1)\delta\in(0,1),且 qij>0q_{ij}>0,则需要

t≥ln⁡δln⁡(1−qij)≈ln⁡(1/δ)qij,qij≪1.t\ge \frac{\ln\delta}{\ln(1-q_{ij})} \approx \frac{\ln(1/\delta)}{q_{ij}}, \qquad q_{ij}\ll1.

这是单个固定对的要求;覆盖全部有效对还要控制整体失败概率。若某类有效对的 qij=0q_{ij}=0,增加桶数也无法找回它们。

只有进一步把输入方向建模为独立球面均匀样本,并让中心与输入独立时,才可对输入与中心共同取期望,得到

ED,c ⁣[(bℓ2)]=(N2)p2.\mathbb E_{D,c}\!\left[\binom{b_\ell}{2}\right] =\binom N2p^2.

这个随机输入平均式不能直接替代实际固定池中的 ∑qij\sum q_{ij},尤其不能把有效对的共同入桶概率设成 p2p^2。桶内筛选和后续多层条件还会改变分布。

6. 分桶成本需要包含建桶

对第 3 节的直接实现,每个中心都扫描全部 NN 条向量。按 ss 维内积的运算量计,

Tbuild=O(stN),Tcheck=O(sC).T_{\mathrm{build}}=O(stN), \qquad T_{\mathrm{check}}=O(sC).

完整流程还要计入候选去重、池更新和访存成本。检查次数变少,并不自动意味着总时间下降;寻找相关桶和生成桶成员本身也可能很昂贵。

内存同样取决于处理顺序:若逐桶处理并释放,桶成员引用的峰值为 max⁡ℓbℓ\max_\ell b_\ell;若同时保存全部桶,则为 ∑ℓbℓ\sum_\ell b_\ell。原向量、中心、索引和候选缓冲的存储另计。

BDGL 的 LSF 分析明确把“高效找到一个向量所属的过滤器”作为关键条件,并进一步构造相应的结构化方法。参见 BDGL,§3 的 Theorem 3.1 及其后的说明、§5。

7. LSH、LSF 与具体筛法的衔接

LSH 通过哈希值组织桶。 在一张标准哈希表中,h(u)h(u) 指定向量所属的一个桶;查询检查相同键对应的候选,多张表提供多次相遇机会。

以 Charikar 的随机超平面哈希为例,随机选择单位方向 aa,令

ha(u)=1{⟨a,u⟩≥0}.h_a(u)=\mathbf 1\{\langle a,u\rangle\ge0\}.

若两方向夹角为 θ\theta,则

Pr⁡[ha(u)=ha(v)]=1−θπ.\Pr[h_a(u)=h_a(v)] =1-\frac{\theta}{\pi}.

夹角越小,同键概率越大;同键仍不保证满足筛法长度条件。构造与公式见 Laarhoven,CRYPTO 2015,ePrint 2014/744 的 23 页版,§2.5,式 (3)–(4),PDF 第 6 页。

用于同时处理加法与减法时,需要查询正负两个方向,或采用等价的符号对称设计。

LSF 通过过滤条件组织桶。 每个过滤器判断一个向量是否通过;一个向量可以通过多个过滤器,也可能一个都不通过。第 2 节的球帽桶提供了一个具体模型。两者的区别在于候选集合如何生成,不能仅由程序是否使用哈希表来判断。参见 BDGL,§3,PDF 第 4–5 页。

将这些搜索方法接入筛法,还要维护原算法的状态:

  • 批量流程可以固定本轮输入,收集候选后统一更新。
  • 动态流程中,向量改变后,需要同步更新对应索引;再次约化也需要根据新向量重新搜索。
  • 概率搜索没有找到伙伴,只表示本次未命中,不能据此认证“两两约化完成”,也不能直接继承完整扫描时的不变量。

角度 LSH 接入 NV 类筛法和 GaussSieve 的具体方式,可参见 Laarhoven,§3 与 §5,并对照第 18 篇中的更新规则。

后续先展开角度 LSH 的多位组合与多表搜索,再进入球面 LSF 和 BGJ 递归分桶。比较具体方法时,继续沿用本篇的四类量:建桶成本、向量对检查次数、不同有效对覆盖数,以及实际池更新。

引用此笔记