在碰撞与元素唯一性词条中,我们解决了一个具体的搜索问题:给定 oracle ,找两个索引 使 。Element distinctness 只是在找一对满足”函数值相同”的索引。本词条把这一问题推广到它的一般形态。
Subset finding 问题:给定 oracle 和一个固定的 元性质 ( 是与 无关的常数),要求找出一个 元子集
使得
也就是说,证书由 个索引以及它们的函数值组成,而性质 只允许读取这 对 来判定。这里 固定、 增长的参数化方式是本词条一切结论的前提,请务必记住。
历史脉络。 时这就是无结构搜索,Grover 算法给出 ;、 取”两个函数值相等”时就是 element distinctness,Ambainis 在 2003 年用 Johnson 图上的量子行走给出 (Zoo 7),这是量子行走超越 Grover 框架的第一个里程碑。Childs 与 Eisenberg 随即指出:Ambainis 的算法其实从未用到”相等”这一特殊结构——它只是要求”缓存的子集中存在一个可由已查询数据判定的 元证书”。把这一点抽象出来,就得到对所有固定 元性质都适用的 通用查询模板(Zoo 162)。随后 Belovs 与 Špalek 用 negative-weight adversary 方法证明,对 -sum 这一具体实例, 也是下界(Zoo 163),说明这个指数不是分析上的巧合。
为什么经典算法和朴素量子算法都不够好。在进入量子行走之前,先看清两条”捷径”为什么走不通。
- 经典算法:最坏情况下必须查询几乎所有输入。以 element distinctness 为例,若对手把前 次查询都回答成互不相同的值,我们仍然无法判断最后一个值是否造成碰撞;一般地,判定一个”最坏情形只有唯一 witness”的 元性质需要 次查询。
- 朴素量子算法:把搜索空间取为所有 元子集,直接 Grover。 元子集共有 个( 为常数),Grover 需要
次查询。 时这是 ,与经典完全一样,毫无优势。 越大,这个朴素指数 越糟。
问题的根源在于:Grover 的每一步都要从头构造一个候选 元子集,查询它的全部 个函数值,然后丢弃。相邻两次迭代之间没有任何信息被保留。量子行走的核心思想是把已查询的数据留在状态里:让候选集合每次只变化一个元素,这样每步只需 次新查询,省下的查询预算换成”走得更慢但更便宜”的搜索。本词条的目的就是把这句口号变成精确的复杂度账目。
1. 问题模型与 property oracle
先固定记号。令 , 为常数。算法通过标准 XOR oracle 访问 :
我们按**查询复杂度 (query complexity)** 计量成本:每调用一次 记一次,其余酉操作不计(但数据结构的可逆性要求会在讨论中说明)。
性质 的访问方式是本词条的关键约定: 只允许读取已经存储在状态里的 对,不允许额外调用 。典型的合法例子:
- -sum:( 是某个 Abel 群或足够大的值域),要求所选索引满足
- -distinctness:要求
- 一般兼容性条件:给定一张显式的兼容表(例如预先给出的”允许的 元组取值”列表),要求所选 对 构成表中允许的某种局部结构。
一条必须遵守的记账纪律:若检查 本身还需要新的 oracle 查询(最典型的情形是 涉及输入之间的关系,例如”所选顶点两两有边”,而边的信息不随顶点查询返回),那么这些查询必须计入成本,不能宣称检查免费。后文第 7 节的 clique 例子会展示违反这条纪律会发生什么。通用模板的全部结论只在”check 零查询”的前提下成立。
2. 核心直觉:把搜索变成图上的行走
在形式化之前,先用平实语言说清楚算法为什么是对的。
搜索的困难在于”候选太多、每个候选的验证太贵”。Grover 每次从头掷一个全新的 元子集,验证它要花 次查询,验证完就扔掉。量子行走换一种玩法:维护一个大小为 的工作集 ( 是一个待选参数),把它连同其中所有元素的函数值一起缓存。如果 里已经藏着某个满足 的 元子集,我们就成功了——这样的 称为被标记的 (marked)。
接下来不再是”掷新候选”,而是”走动”:每一步从 中删掉一个元素、加入一个新元素。因为旧数据都在缓存里,这一步只需要查询一个新元素的函数值—— 次查询,而不是 次。所有可能的工作集连同”删一添一”的相邻关系构成一张图,这就是 Johnson 图 ;算法就是在这张图上做量子版本的随机行走搜索,希望尽快走到一个被标记的顶点上。
这个图景里有两股相互竞争的力量,理解它们就理解了整个复杂度分析:
- 标记顶点太稀少。随机一个 元子集恰好包含目标 元子集的概率 大约是 。 取得越大,标记比例越高,搜索越容易。
- 图越来越难走。工作集越大,每一步只能换一个元素,要让状态”忘记”起点、混合到全图上,需要的步数就越多;反映在谱隙上,, 越大谱隙越小,行走越慢。
量子行走搜索的步数由乘积 控制(第 4 节给出框架),于是我们面对一个经典的参数平衡问题: 太小则标记太稀, 太大则行走太慢且初始缓存太贵。第 5 节会展示最优的 恰好让”初始建缓存的成本”与”行走搜索的成本”同阶,而平衡点是 。
3. 行走状态与标记条件
现在把上一节的图景形式化。选择参数 ,在 Johnson 图 上行走。图的每个顶点是一个 元子集 ;两个顶点相邻当且仅当它们恰好在一个元素上不同,即存在 、 使 。
算法为每个顶点维护缓存
即 中每个元素及其函数值的列表,存放在合适的数据结构中(排序数组、哈希表等)。行走状态因此是形如 的叠加。
标记条件:若 内存在某个 元子集 使 ,就标记 。注意这个判定只读取 中已存的数据,符合第 1 节对 property oracle 的约定。
三项成本分别核算:
- Setup(初始建立):制备所有 元子集的均匀叠加,并为每个 查询其中全部 个函数值以建立 。这需要 次查询,一次付清。
- Update(走一步):从 走到相邻的 时,只有一个元素被替换。新元素的函数值需要 次新查询(实际上还要把被删元素的旧值可逆地擦除,这是常数次额外操作和一次”反查询”,不改变量级),故 update 是常数次查询。
- Check(判定标记):只读取 。在有合适的哈希/索引结构时,例如判 -distinctness 只需在按值哈希的表中查找,判 -sum 可以在排序缓存上查找补数,都不需要新的 oracle 调用,故 check 为 次查询。
查询模型把数据结构操作视为免费;真实电路中要在叠加的 上可逆地维护 ,需要可逆哈希、radix tree 等技术把 update/check 压到 polylog 时间开销。本词条的 结论都是查询复杂度结论,这一点与前一词条对 element distinctness 的说明一致。
4. 量子行走搜索框架:步数由 控制
我们不重新推导量子行走搜索定理(其细节属于 Szegedy 型行走与振幅放大,读者已在 Grover 与振幅放大词条见过” 次重复可被 次相干迭代替代”的机制),而是把它作为黑箱陈述,并把每个因子的含义讲清楚。
设一张规则图上有随机行走,满足:
- 均匀分布是行走的平稳分布(即”随机走很久之后”落在每个顶点的概率相同);
- 行走的谱隙 (spectral gap) 为 ——粗略地说, 是行走”忘记起点、接近平稳分布”所需的步数尺度;
- 被标记的顶点在平稳分布下占比例 。
那么 Szegedy 型量子行走搜索用
步(每步一次 update 加一次 check)就能以 概率落在一个标记顶点上;外加一次 setup 建立初始叠加。
为什么是 这个组合。直觉来自与 Grover 的类比:在 Grover 中,目标比例 ,需要 次迭代——这里 扮演的正是”目标在平稳分布中的比例”,开根号是振幅放大带来的二次加速。但量子行走不能像 Grover 那样每一步都”瞬移”到一个全新的均匀随机候选:它只能在图上走,而”模拟一次独立抽样”本质上要求行走先混合,代价由谱隙 控制。两个因子相乘再开根号,就是量子行走为”局部移动”付出的相对代价。严谨的表述是把随机行走的转移矩阵量子化,在”标记/非标记”二维子空间内做振幅放大;我们只需要知道结论与每个因子的来源。
于是总查询数的通用形状是
其中 分别是 setup、update、check 的单次查询成本。对我们的问题,、、,所以剩下的工作只有两件:算出 ,算出 。
5. 标记比例 的精确推导
先分析最坏情形:整个输入中只有一个目标 元集合
唯一 witness 是最难的情形,也是最坏分析的标准假设(多 witness 的情形在本节末尾讨论)。
随机一个 元子集 被标记,当且仅当 。计数:包含 的 元子集,相当于从剩下 个元素中任选 个补齐,共 个; 元子集总数为 。因此
把这个比值的阶算出来需要两步代数。第一步,把组合数展开成阶乘并约简:
第二步,把两个阶乘比分别写成下降阶乘的乘积。 是 个因子的乘积, 同样是 个因子的乘积,逐项配对得
最后估计这个乘积的阶。因为 是常数而 将取为 的幂( 且 ),乘积中的每一项都满足
其中左端用了 (因 )与 ,右端用了 (交叉相乘后等价于 ,因 成立)。于是
常数 被吸收进 ,这正是” 为常数”这一假设在分析中的第一个用场。
直觉复述:要把某个特定的目标元素 装进随机 元子集,概率约为 ; 个目标元素大致独立地都要被装进去,所以概率约为 。“大致独立”在大 下是对的,上面的乘积推导是它的严格版本。
多 witness 的情形。如果有 个近似不重叠(两两交集很小)的目标集合,每个都独立地贡献约 的被标记概率,于是 约增大 倍,行走步数相应缩小约 倍,搜索更快。上面的 是唯一 witness 的保守最坏界,模板的安全参数都按它取。
6. Johnson 图的谱隙
Johnson 图上的随机替换链这样走一步:从当前集合 中均匀随机挑一个元素删去,再从补集中均匀随机挑一个元素加入。我们要它的谱隙。先给结论:Johnson 图的邻接结构(它是一个强正则图族)的谱可以精确算出来,随机替换链的谱隙为
完整的谱计算可以在 Ambainis 的论文(Zoo 7)中找到;这里给一个启发式推导,说明 从何而来。
固定起始顶点 ,考察 步之后当前集合与 的重叠大小 。初始 ;完全混合时,随机一个 元子集与 的期望重叠只有约 ,当 时几乎为 。所以”重叠从 衰减到接近 “就是”忘记起点”的标志。每走一步, 中任何一个特定元素被删去的概率是 (删谁均匀随机),而新加进来的元素恰好属于 的概率约为 ,近似可以忽略。于是每个”旧元素”每步以约 的概率流失,重叠的期望值近似按
衰减, 步后约为 。要让相关性衰减一个常数因子,需要 步——混合时间的尺度是 ,谱隙是它的倒数尺度,即 。
直觉复述:每步只能换掉一个位置,而工作集有 个位置,所以”翻新整个集合”需要约 步。 越大,行走越”粘”,这就是上一节所说” 太大则行走太慢”的定量来源。
注意 随 增大而变好(标记变多), 随 增大而变坏(混合变慢)——两股力量的对抗将在下一节决出最优的 。
7. 行走步数与参数平衡: 的诞生
把第 5、6 节的结果代入第 4 节的框架。行走步数为
逐项检查这个代数:根号内是 ( 与 约去一个 ),再开根号得 。于是 Szegedy 搜索的 walk steps 为
加上每步 的 update 与零成本的 check,总查询数为
这个表达式里每个因子的来源都值得复述一遍:第一项 是 setup——建立缓存必须付出的 次查询,随 线性增长;第二项是行走搜索,分子 来自 中 的 开根号,分母 是 中的 与 中的 相乘后净剩的 再开根号。
平衡求解。第一项随 增、第二项随 减,最优解在两项同阶处。令
两边同时取 次幂:
代回任一项验证:setup 为 ;行走项为
两项确实同阶,因此
为什么平衡就是最优(而不仅是启发式)。把 对 求导(把 当连续变量,这在大 下无伤大雅):
令 得 ,即 ——与平衡解只相差一个依赖 的常数因子,而 是常数,所以 确实是最优点。且 时第二项发散、 时第一项发散, 由负变正,这是唯一的极小点。“两项同阶”在这里不只是口诀,而是被导数验证过的。
退化情形的自检。 给出 、(Grover); 给出 、(element distinctness)。两个已知结果从同一个模板中掉出来,清楚地展示了这套机制的统一性:Grover 是”缓存大小为 的行走”,element distinctness 是”缓存大小为 的行走”。
8. -sum 的匹配下界
模板给出了上界,自然的问题是:这个指数还能改进吗?对 -sum 这一具体实例,答案是否定的(在查询模型意义下)。
-sum 问题:给定 (取自某个 Abel 群或值域),寻找 个不同索引满足
它是 subset finding 框架的直接实例:,性质 检查 个已缓存的值之和,零额外查询,第 1 节的记账纪律自动满足。套用第 7 节,量子查询上界为 。
Belovs 与 Špalek(Zoo 163)用 negative-weight adversary 方法给出了匹配的下界。adversary 方法的思想是把”任何量子查询算法都必须在输入对之间积累足够的区分度”转化为一个优化问题:为每一对输入 设计一个权重矩阵,使得算法每做一次查询能推进的”进展”有上界,而总的必需进展有下界,两者相除就是查询数下界。经典(正权重)adversary 的进展度量受限于”一个位置的改变能影响多少”,常常给不出紧的界;负权重版本允许矩阵元取负值,进展度量更细,能精确捕捉 -sum 中”必须同时凑齐 个索引”的瓶颈。Belovs–Špalek 为 -sum 显式构造了这样的负权重 adversary 矩阵,证明
与 Johnson 图行走的上界匹配。于是 -sum 的量子查询复杂度被完全确定为 ——通用模板至少在这个实例上是不可改进的。
保留条款(务必注意适用范围):这个下界依赖两个假设。
- 值域/群足够大。下界构造需要值域大到能容纳 adversary 矩阵所需的输入结构;不能直接外推到任意小的模数。例如模一个小常数的 -sum,输入结构完全不同,结论不再自动成立。
- 是固定常数。证明中的常数因子随 变化;若 随 增长(例如 ), 记号里被吃掉的因子可能变成主角,结论失效。
换言之,下界与上界一样,都是”固定 、 增长”这一参数化下的结论。
9. 与任意大小 subset-sum 的区别
名字相近的另一个问题必须区分开。量子子集和允许选取任意大小的子集,证书长度不固定,搜索空间是全部 个子集;该问题是 NP 完全的,目前已知的最佳算法(无论经典还是量子)仍然是指数时间的,量子加速体现为指数底数的改善(如 representation technique 等技术)。
本词条的 subset finding 走的是另一条参数化路线:把 当常数,证书大小固定,搜索空间只有 ,问题在 中,复杂度是 的多项式,量子加速体现为多项式指数的降低(从经典的 降到 )。
因此同名的 -subset-sum 有两种参数化,结论完全不同:
- 固定 、列表长度 增长:本词条模板, 量子查询;
- 或任意大小子集:NP 完全,指数时间算法与 representation technique。
读文献时务必先确认对方用的是哪一种参数化。
10. 图 clique 为何需要额外一层
最后用一个反例检验模板的边界,它也正好演示第 1 节那条记账纪律的作用。
设 是某个图的顶点集,性质 是”所选 个点两两相邻,构成 -clique”。粗看这是 subset finding 的直接实例:证书大小固定为 。但问题出在检查环节:判定 个顶点是否构成 clique,需要知道 条边的存在性,而顶点 oracle 查询一个顶点不会返回它与其他顶点的边信息——边信息来自另一个 edge oracle(“查询顶点对 是否有边”)。
于是数据结构必须升级: 除了缓存顶点,还必须缓存 的诱导子图,即 内部所有顶点对的边信息。三项成本全部重估:
- Setup:为 个顶点查询全部 条内部边,setup 从 变为 ;
- Update:换入一个新顶点后,要查询它与现有 个顶点之间的全部边,update 从 变为 ;
- Check:诱导子图已在缓存中,检查任意 元子集是否成团仍然零查询。
代入第 4 节的通用形状,行走步数不变( 与 只依赖图的组合结构),但每步贵了 倍:
(; 时第二项中 的幂次为 ,即行走成本与 无关。)最优的 和最终指数都随之改变,一般明显劣于”免费检查”模板的 。Childs–Eisenberg 针对 clique 类问题给出了多种更精细的算法(包括嵌套行走等结构),其出发点正是绕开这份朴素的账单。
教训是通用的:只有当性质 真能由已缓存的 数据免费判定时, 公式才直接适用。一旦检查环节暗藏新的 oracle 查询,setup/update/check 三项必须从头重算,结论也必须重算。
11. 小例子:3-sum 的完整演算
用一个可以全部手算的实例把模板过一遍。取 ,列表
第一步:找出全部 witness。,三元子集共 个,逐个求和:
仔细核对: 命中;而 也命中。所以这个实例其实有两个 witness: 与 。(原例中最显眼的目标是 ,因为 ;把第二个也找出来,正好用来验证第 5 节”多 witness 使 增大”的论断。)
第二步:装配 Johnson 行走。取 (这个小 下渐近最优 无意义,但 让机制最透明)。 有 个顶点,每个顶点是一个三元索引集。被标记的顶点是那些包含某个 witness 的顶点;由于 ,“包含 witness”就是”等于 witness”,故标记顶点恰为 与 两个。
第三步:核对 。按第 5 节的公式,唯一 witness 时
与乘积形式 一致。实际有两个不重叠的 witness(,近似不重叠),故真实标记比例为 ,恰为单 witness 的 倍——第 5 节的论断在此精确成立。
第四步:走几步。谱隙 。按 Szegedy 框架,步数尺度为
(取真实 ),这在 的尺度上没有渐近意义,但完整演示了”setup 一次、行走数步、每步只付一次新查询”的机制:setup 查询 个值;一步移动(例如从 到 )删去索引 、加入索引 ,只需新查询 一次;检查缓存中是否存在三数之和为 ,零查询。
第五步:回到渐近。对大的 与 ,模板给出 ,此时 setup 成本 与行走成本
同阶,总查询 。对照经典 与朴素 Grover over 三元组的 ,量子行走的优势一目了然。
12. 小结与习题
- 问题:固定 元性质、可由已查询数据判定的 subset finding;经典 ,朴素 Grover over 子集 。
- 机制:Johnson 图 量子行走;状态缓存 个 oracle 值;每步替换一个元素,update 为 次查询;标记条件可为任意固定大小性质。
- 两个关键量:唯一 元 witness 的标记比例 ;随机替换链谱隙 。
- 平衡:setup 与行走 在 同阶,总查询 ; 退化为 Grover, 退化为 element distinctness。
- 匹配性:-sum 的 negative-weight adversary 下界 与模板匹配(限于大值域、固定 )。
- 纪律:property 检查若需额外 oracle,必须重算 setup/update/check,通用指数不再直接适用(clique 例)。
习题:
1.(推导)不引用第 5 节,从组合数定义出发,精确推导”随机 元子集包含固定 元集合 “的概率,把它写成 ,并给出 成立的全部假设。 2.(平衡)对 ,写出总成本 ,分别用”两项同阶”与”求导”两种方法求最优 ,验证 ;再用同一模板核对 与 退化为已知结果。 3.(多 witness)设存在 个两两不相交的目标 元集合。写出新的 ,代入行走步数公式,说明总查询如何依赖 ;并讨论 witness 之间存在重叠时这个估计会发生什么变化。 4.(记账)为 clique 问题的 edge oracle 情形写出 setup 与 update 的查询成本,代入通用框架得到 ;对 求出该朴素账单下的最优查询量,并解释它为何劣于 模板。 5.(概念)解释为什么朴素 Grover over 所有 元子集给出 ,并指出量子行走省下的查询究竟来自哪一处机制上的差别。 6.(综合)某问题要求从 个数中找 个不同索引使其乘积等于给定值 (值域足够大)。判断它是否属于本词条模板;若是,给出最优 与总查询复杂度;并说明若把”乘积”改为”乘积模一个小素数 “,哪些结论仍然成立、哪些需要重新审查。
参考文献
- Zoo 编号 162:Andrew Childs 与 Jason Eisenberg, Quantum Algorithms for Subset Finding.
- Zoo 编号 7:Andris Ambainis, Quantum Walk Algorithm for Element Distinctness.
- Zoo 编号 163:Aleksandrs Belovs 与 Robert Špalek, Adversary Lower Bound for the -Sum Problem.
参考资料
- 本词条整理自《量子计算算法教程》原文:ch11-query-complexity/subset-finding
- 内容遵循 CC BY-NC-SA 4.0 许可协议