图谱连接

草稿

NP-Hardness

理解当每个 NP 判定问题都能归约到一个问题时,为什么称它 NP-hard。

concept beginner complexityalgorithmsreductionsnp-hardness

从“目标枢纽”开始

设想一个目标判定问题 H,你会先听到这么一句:

如果 H 是 NP-hard,那么 NP 中的每个可高效检查的问题都应以多项式时间归约到 H

这不是“一个问题”变硬的问题,而是所有 NP 问题都指向一个目标的问题。

先看中心点:H 接收来自多个 NP 源问题的归约这些箭头是定义前提,不是已经构造完成的归约。它们表示 NP-hardness 所要求的比较关系。
判定问题 L源实例 x答案保持
要求的映射L <=p H每个源判定实例都要能这样映射当前未构造
H目标判定问题问题:给定 y,是否 y ∈ H?
电路满足性判定(Circuit-SAT)一个小电路 C 与赋值 101目标形式: f_CircuitSAT(C)要求: x ∈ L ↔ f(x) ∈ H源 Yes目标 Yes
SAT公式 φ = (x1 OR x2) ∧ (¬x1 OR x3)目标形式: f_SAT(φ)要求: x ∈ L ↔ f(x) ∈ H源 Yes目标 Yes
团(Clique)图 G 中存在大小为 3 的团目标形式: f_Clique(G, 3)要求: x ∈ L ↔ f(x) ∈ H源 Yes目标 Yes
独立集(Independent Set)图 G 和 k=4,但不存在大小为 4 的独立集目标形式: f_IS(G, 4)要求: x ∈ L ↔ f(x) ∈ H源 No目标 No
任意 L ∈ NP抽象源实例 x∀L∈NP 的形式占位仅符号化

本页的结论是条件定义目标;任何行都不代表某个真实完成的困难性证明。

上图强调:每条箭头是定义所要求的翻译承诺,不等于某个具体困难性证明已经完成。

第一个朴素直觉

“难”很容易被误解成:

  • 一个输入很大就难。
  • 候选很多就难。
  • 目前没有快算法就难。

这些都能给你研究动机,但不足以定义 NP-hard。

先修正“困难”这些朴素含义

点开卡片看每个直觉为何与正式目标不一致。

一个大输入就代表困难一个看起来很大很大的输入就是困难。

困难性不是单个输入大小。它是关于问题族和归约可比关系。

候选太多如果暴力枚举候选很多,那么它就 NP-hard。
找不到快算法还没找到快速算法就能证明 NP-hard。

为什么会坏掉

NP-hardness 看的是比较关系。一个单独归约只是具体例子,不是定义。

单次归约只是一条线索,不是定义NP-hardness 需要 NP 中每个源问题都能归约到 H,而不是一个最爱源。
错误目标视图
A <=p H只有一个源问题
缺失其他源问题

这能显示一个例子归约,不足以证明 NP-hardness。

NP-hardness 需要的视图L1 <=p HL2 <=p H..., 对每个 L in NP完整族要求
单源视图失败点不能推出 H 包含全部 NP 问题。不能对任意 L 触发 P=NP 的条件推理。

所以“一条箭头”是“示例来源”,不是“全量来源”。

核心发明:对所有源的全称量化

NP-hardness 的形式是:

H is NP-hardLNP,  LpH.H \text{ is NP-hard} \quad\Longleftrightarrow\quad \forall L \in NP,\; L \le_p H.

保真约束是:

xLfL(x)Hx \in L \quad\Longleftrightarrow\quad f_L(x) \in H

每一条源都要有双向保持:Yes 与 No 都要保留。

账本:保持 Yes 与 No归约对实例 x 有效时,目标 f(x) 的真假值必须保持一致。
是实例(Yes)一个小电路 C 与赋值 101
ff_CircuitSAT(C)
目标(Yes)目标答案:
否实例(No)图 G 和 k=4,但不存在大小为 4 的独立集
ff_IS(G, 4)
目标(No)目标答案:

是与否两个示例都采用同一类归约形式并保持真假值一致。

全称量词展开为许多必须的源问题承诺每一行都是在同一个目标 H 下的一条实例保持约束。
电路满足性判定(Circuit-SAT)一个小电路 C 与赋值 101 = 目标形式: f_CircuitSAT(C)目标 = 当且仅当(iff): x ∈ L ↔ f_L(x) ∈ H
SAT公式 φ = (x1 OR x2) ∧ (¬x1 OR x3) = 目标形式: f_SAT(φ)目标 = 当且仅当(iff): x ∈ L ↔ f_L(x) ∈ H
团(Clique)图 G 中存在大小为 3 的团 = 目标形式: f_Clique(G, 3)目标 = 当且仅当(iff): x ∈ L ↔ f_L(x) ∈ H
独立集(Independent Set)图 G 和 k=4,但不存在大小为 4 的独立集 = 目标形式: f_IS(G, 4)目标 = 当且仅当(iff): x ∈ L ↔ f_L(x) ∈ H
任意 L ∈ NP抽象源实例 x = 符号化目标形式: f_L(x)目标 = 符号化当且仅当(iff): x ∈ L ↔ f_L(x) ∈ H

传递桥:后续证明怎么用

后续我们拿到已知 NP-hard 的源问题 A 后,不必每次都重画所有源;只要证明:

LNP,  LpA\forall L \in NP,\; L \le_p A

ApHA \le_p H

然后即可推出

LNP,  LpH.\forall L \in NP,\; L \le_p H.

这就是为什么后续多数学科证明会走“已知困难源 + 一步桥接”路线。

实操中的传递性桥梁后续证明通常先拿到一个已知 NP-hard 的 A,再证明 A <=p H。
已知前提∀ L in NP, L <=p A这给 A 一个完整的 NP 覆盖。
A <=p H需证明的单条传递事实
合成结论∀ L in NP, L <=p H实操中不必再次重画所有源问题。

求解器推理管道

条件化地理解:如果假设 H ∈ P,那么对每个能有效归约到 H 的源问题 L,也能在 P 中求解它。

function solveL(x: L) {
  const y = reduceLtoH(x);      // f_L(x)
  return solveH(y);              // 假设在多项式时间内可算
}
从已选源问题到结论的推理流水线

对每个有有效归约的具体源问题 L,条件性流程都相同:五步。

1/5
选择源问题选中源问题 电路满足性判定(Circuit-SAT) 作为当前的 L。Circuit-SAT 示例源问题
接收源实例接收 Circuit-SAT 的实例 x。:
归约到 H构造并输出 f_CircuitSAT(C)。若定义前提成立,这一步对该源问题是有效的。目标:
调用 solveH假设 H 的判定器是多项式时间的。对翻译后的目标实例调用该判定器。目标: 假设: solveH ∈ P
返回源答案返回与目标实例相同的 Yes/No。保持性意味着这就是原始源实例的正确答案。: 目标:

选中源问题 电路满足性判定(Circuit-SAT) 作为当前的 L。

选择源问题选中源问题 电路满足性判定(Circuit-SAT) 作为当前的 L。
接收源实例接收 Circuit-SAT 的实例 x。
归约到 H构造并输出 f_CircuitSAT(C)。若定义前提成立,这一步对该源问题是有效的。
调用 solveH假设 H 的判定器是多项式时间的。对翻译后的目标实例调用该判定器。
返回源答案返回与目标实例相同的 Yes/No。保持性意味着这就是原始源实例的正确答案。

正确性直觉

最后一步靠的是“保持”契约:

  • 源实例是 Yes,则 x in L,所以 f_L(x) in H,目标求解器返回 Yes;
  • 源实例是 No,则 x notin L,所以 f_L(x) notin H,目标求解器返回 No。

因此只有在双向保持下,返回目标答案才正确。

复杂度后果

推理公式是:

(LNP,  LpH)(HP)NPP.\left(\forall L \in NP,\; L \le_p H\right) \land \left(H \in P\right) \Longrightarrow NP \subseteq P.

结合 P ⊆ NP(来自 P 与 NP)可得:

PNPandNPPP=NP.P \subseteq NP \quad\text{and}\quad NP \subseteq P \Longrightarrow P = NP.

这是条件命题:它不说明 P ≠ NP,只是说“若某个 NP-hard 的 H 落在 P,则会发生类崩塌”。

复杂度组合堆栈归约成本与 H 求解成本相加,仍是多项式。
符号表达式含义
mm <= n^b目标规模上界
Treduce(n)O(n^a)将源实例翻译为 H 实例
TsolveH(m)O(m^c)在 H 上多项式求解
Ttotal(n)O(n^a + n^{bc})组合流水线
源规模符号: n目标规模符号: m组合: O(n^a + n^{bc})
可选具体示例n = 12Treduce(n) = O(12^a)m <= (12)^bTsolveH(m) = O((12^b)^c)Ttotal(n) = O(12^a) + O((12^b)^c)

NP-hard、in NP、NP-complete 的区别

NP-hardness 是与所有 NP 问题比较的关系,不自动给出 in NP

  • NP-hard 只说比较方向;
  • NP-hard 且在 NP 里时是 NP-complete
  • 优化任务在本节点不直接作为对象;通常先转成决策版本。
类别位置预览

一个问题可 NP-hard 但未必 in NP,也可 in NP 但未必 NP-hard。

仅 NP-hardin NP: 否 · NP-hard: 是 · NP-complete: 否困难性比较的是 NP 全家族,不保证问题本身在 NP 里。这是可能关系,留到后续节点再给具体例子。
仅 in NPin NP: 是 · NP-hard: 否 · NP-complete: 否有高效验证证书,但还没有“所有 NP 都归约过去”的证据。许多验证型问题在 NP,但还不知道它们 NP-hard。
NP-完全in NP: 是 · NP-hard: 是 · NP-complete: 是既在 NP 中也 NP-hard。这是最熟悉的“既困难又可验证”类别。

常见误区

需要排除的错误说法

这些说法很自然,但每一个都不符合严格定义。

困难性方向反了
结论: 反例:`H <=p L` 不能证明 `H` 是 NP-hard。

H <=p L 不足以证明 H 是 NP-hard。

`H <=p L` 的箭头方向是反的;困难性要求 NP 中每个 L 都要归约到 H。

这个方向只是 `H` 到 `L` 的归约,因此有了 `L` 的求解器才可能帮助求解 `H`,不是反过来。

只用一个源问题不足以证明统一困难性展开并看为什么不对
NP-hard 不代表在 NP 中展开并看为什么不对
把“某个大实例很难”当成困难性展开并看为什么不对
“目前没找到快算法”展开并看为什么不对
把优化问题直接按判定困难性理解展开并看为什么不对

图谱连接

本节点在局部图中位于:

p-vs-np -> polynomial-time-reductions -> np-hardness.

后续具体 Circuit-SAT 节点会提供首个真实的源问题构造链。

图位置与局部流程这和已有实现边的顺序一致,并预告后续证明对象。
p-vs-np判定问题 + P/NP 框架
->前置关系
polynomial-time-reductions判定归约
->前置关系
np-hardness通用目标定义
->后续预览
circuit-sat首个具体源问题节点(未链接)

练习

应用该节点的逻辑

用每张卡片检查方向、量词和类成员关系。

若要判断“`H` 是 NP-hard”,哪种箭头方向是对的?

选择一个答案以检查此题。

一个 A <=p H 就足以说明 H NP-hard。

选择一个答案以检查此题。

下面哪一类与这种情况一致?in NP 与 NP-hard 都为真。

选择一个答案以检查此题。

假设 H ∈ P 且 SAT 有效归约到 H。对 SAT 来说这个推论说什么?

选择一个答案以检查此题。

  • 选择正确箭头方向。
  • 为什么只用一个源问题不够?
  • 哪个类同时为 in NPNP-hard
  • H ∈ P 时,源问题会得到什么含义?

图谱连接 : NP-Hardness