“从优化阈值到最优见证明确补足答案二分的两个接口:数值范围 $[0,U]$ 只需 $O(\log(U+1))$ 次判定,但查询编码与判定成本仍收费;得到最优值后,还要通过受该阈值约束的前缀或问…”
形式陈述
固定一个 多项式平衡、可多项式验证的关系
定义阈值语言
它属于 NP:用
当
最优值不是最优见证。 恢复对象还需要判断
这里仍有原证书长度上界。先检查当前前缀自身是否已是达到阈值的见证,否则按前缀 0/1 扩展。由于
直觉
二分回答“最好能到几分”,前缀恢复回答“由哪些选择得到这一分数”。知道赛场最高分,并不能仅凭分数写出获胜者的名单。两个阶段共享可行性验证,却承担不同的输出义务。
整数目标让“精确停在哪里”有明确含义。候选值的数量可能是指数级,但写出其编号只需多项式位;二分利用这个差别。逐个尝试每个数值会重新花掉指数时间。
例子与边界
价值为 14 的背包见证
给三件 0–1 背包物品
| 当前 |
询问阈值 |
回答 | 下一范围 |
|---|---|---|---|
| 12 | 是 | ||
| 18 | 否 | ||
| 15 | 否 | ||
| 13 | 是 | ||
| 14 | 是 |
于是最优值为 14。接下来先试“不选第一件”:余下第二、三件在容量 5 内可以达到 14,故第一位为 0。再试“不选第二件”:只剩第三件,价值至多 6,不能达到 14,故第二位为 1,剩余容量改为 011,总重量 5、总价值 14。
这是背包自身的阈值自归约:每次删除正在决定的物品,选入时扣除重量与价值,实例仍是同一背包阈值问题。若某件重量超过剩余容量,有解不变量迫使试排除为真。剩余阈值非正时,非负容量下空集即达到要求。零重量物品也只能处理一次;表里的物品编号是身份,不能合并重复物品后丢失可选次数。
查询和位账必须同时给出
二分阶段在首次可行性询问之后,至多再用
每条阈值查询长度为
本例
不适用的接口
若目标可取任意实数而只给比较 oracle,不能假设有有限二进制最优值或通过有限二分得到精确解。例如无限集合可能只有上确界却没有最大元;本页的有限见证条件原本排除了这一点。有理目标若要整数化,须先给统一分母或可证明的分离界,并计算表示长度,不能把整数版本原封不动迁移。
若黑箱只近似回答阈值附近的可行性,真假单调边界会出现未知带;若目标可能负值,首次询问 0 也不能再用来检测空可行集。两种变体都需要新契约。仅返回最优值的黑箱并不自动知道哪个见证达到它,一般前缀接口的必要性仍然存在。
推论与应用
本页把三个责任分开:验证关系定义什么算可行;整数目标与已编码上界支撑精确二分;前缀或问题特有自归约恢复对象。由此可以解释精确优化为何常与阈值判定相连,而无需把优化任务本身写成 NP 语言。
背包的实际阈值 oracle 可以用 容量动态规划实现,但
参考资料
- Boaz Barak,Introduction to Theoretical Computer Science, Chapter 16,§16.2,Theorem 16.3:目标值二分后恢复优化见证
- David P. Williamson、David B. Shmoys,The Design of Approximation Algorithms,2011,§3.1:整数背包的动态规划与缩放;本页的三件物品、阈值调用及残余实例轨迹独立展开