“有限解枚举把“总输出多项式”进一步分成首项等待、相邻项间隔、结束等待与工作空间。先等 $2^n$ 步再输出全部 $n$ 位串仍有输出多项式总时间,却没有多项式首项延迟;这不影响本页区间报告与…”
形式陈述
给定有限输入
令
- 输出多项式总时间:从开始到终止,总时间至多为
的某个固定多项式 - 多项式延迟:从开始到首项、任意相邻两项之间,以及最后一项到终止,都至多用
的同一个多项式时间;若没有答案,从开始到终止也必须满足该界 - 多项式工作空间:任意时刻保留的工作数据占用至多
的多项式位;只写且不能读回的输出流不计为工作区。若把已输出答案存起来去重,那份缓存要计入空间
多项式延迟(包括收尾)给出至多
直觉
想列出一份很长的结果清单,“明天全部交齐”和“每分钟给下一项”是不同承诺。还有第三个问题:为了连续输出,是否需要先把整份清单存进内存?枚举算法必须分开回答。
结束事件同样重要。已经收到两个答案后,长时间没有第三个,无法判断是全部输出完了还是仍在搜索。空结果时更没有首项可作进度信号,因此定义必须约束确认结束所花的时间。
例子与边界
总量合格,首项仍很慢
输入为一元串
算法 B 不空转,直接从全零开始,每输出一项就递增计数器。每次加一和写一条记录最多用
SAT 判定 oracle 支持怎样的流式枚举
对显式声明
每个到达节点都对应一个确有补全的前缀,所以不会在一棵没有答案的子树里继续深搜。叶子显然是满足赋值;每个满足赋值的全部前缀都可补全,算法不会把它剪掉,因而不会漏解。不同叶子对应不同完整比特串,所以无须存储已输出集合也能保证无重复。先 0 后 1 则固定了字典序。
对于
全部输出依次为 010、101。从 010 返回时,前缀 011 不可满足,被剪去;回到根的右支后,100 被剪去、101 被输出,最后前缀 11 被剪去,算法发结束事件。它恢复的是所有赋值,不能用只恢复一份见证的
延迟证明与空间账本
首个输出前,算法沿至多
这是相对于 oracle 的多项式延迟,还要加上每次限制和查询写出的多项式成本。若单次实际 SAT 判定时间是
朴素递归实现每层保留一份大小
推论与应用
若有一般 SAT 的普通多项式延迟枚举器,且满足本页首项与空集终止界,就可运行到首项或结束来多项式判定 SAT,从而推出 P=NP。这个推论依赖准确的延迟定义;仅知道某个枚举器总会在有限时间给完全部解不够。
“依次枚举再计数”也不会自动产生多项式计数器,因为见证数可能指数多。#P 前缀计数用数量决定均匀采样概率,本页只询问前缀是否非空,输出规则又是字典序;这些接口不能互换。比如在有三个见证的树上,均匀随机选择非空孩子并不一定均匀选择叶子。
共同终点要求复算 010、101 的输出次序,说明首项、下一项、结束三个时刻如何计费,并把暴力 oracle 的内部枚举时间与外层查询次数分开。
参考资料
- David S. Johnson、Mihalis Yannakakis、Christos H. Papadimitriou,On Generating All Maximal Independent Sets,Information Processing Letters 27,1988,pp.119–123,开篇(a)–(c):总输出、增量与延迟标准
- Andrea Marino,Finding Graph Patterns: Theory, Techniques, and Applications for Community Detection,第9页:首项、相邻项与最后一项后结束的延迟口径
- 本页 SAT 深度优先枚举、
粗界、外层空间和空串分帧为独立展开;不声称实现了上述论文的极大独立集算法