📜 [原文1]
讲义 11B:复杂性复习 - 解答 <br> William Pires
这是讲义的标题和作者信息。“讲义 11B”表明这是系列讲义中的第11部分的B部分,通常A部分是问题,B部分是解答。“复杂性复习 - 解答”明确了这份文档的核心内容,即关于计算复杂性理论(Computational Complexity Theory)的复习题的官方解答。“William Pires”是这份讲义的作者。计算复杂性理论是理论计算机科学的核心分支,它研究计算问题根据其内在难度(需要多少计算资源)进行分类。
无。
无。
本部分是文档的元信息,点明了主题(复杂性理论习题解答)、来源(讲义11B)和作者。
标题和作者部分的存在是为了让学生和读者能够快速识别文档内容、出处和作者,便于归档和查阅。
可以将这份文档看作是一本练习册的答案页。标题就像答案页的页眉,告诉你这是“第11章B节:复杂性”这部分的答案。
想象你刚做完一套关于“计算复杂性”的测验题,现在老师把标准答案发下来了,你拿到的这份文档就是那份标准答案,文档的开头清楚地写着“复杂性复习 - 解答”。
📜 [原文2]
答案:$n \cdot \log (n), n^{100}+3 n^{2}$ 是多项式的,$n^{0.001 n}, 2^{\sqrt{n}}$ 不是。
这个问题要求我们判断给出的四个函数增长率是否属于多项式级别。在计算复杂性理论中,一个函数 $f(n)$ 被认为是多项式的,如果它被一个多项式函数所界定,即存在一个常数 $c > 0$ 和一个常数 $k$,使得对于所有足够大的 $n$,$f(n) \le c \cdot n^k$。这个界定通常使用大O符号表示为 $f(n) = O(n^k)$。
因此,答案是正确的。前两者被多项式函数所界定,而后两者不是。
该问题考察了对多项式时间复杂度基本定义的理解。核心是区分多项式增长(如 $n^c$)和指数增长(如 $c^n$ 或 $n^n$)。$n \cdot \log(n)$ 和 $n^{100}+3n^2$ 的增长率被多项式函数所限制,而 $n^{0.001n}$ 和 $2^{\sqrt{n}}$ 的增长速度超过了任何多项式函数。
这个问题的目的是为了检验学生是否掌握了复杂性理论中最基本的概念之一:区分多项式与非多项式(主要是指数)增长函数。这是理解P类与NP类等后续概念的基础。
想象两条曲线在坐标系上。一条是 $y=x^2$(多项式),它是一条向上弯曲的抛物线。另一条是 $y=2^x$(指数),它开始时非常平缓,但在某个点之后会急剧、近乎垂直地上升。$n^{0.001n}$ 和 $2^{\sqrt{n}}$ 就属于后一类,它们的增长最终会比任何多项式曲线都更“陡峭”。
📜 [原文3]
答案:错误。要使 $L$ 在 NP 中,您需要一个验证器,其运行时间是 $|x|$ 的多项式¹。如果您允许 $c$ 的长度是 $|x|$ 的指数级,并且您允许 $V$ 运行时间是 $|x|+|c|$ 的多项式,那么您实际上已经允许 $V$ 运行时间是 $|x|$ 的指数级。
这个问题考察的是对 NP 类 定义的精确理解。NP (Nondeterministic Polynomial time) 的核心定义之一是基于验证器的。
一个语言 $L$ 属于 NP,如果存在一个确定性图灵机(即验证器) $V$,它满足两个条件:
从条件1可以推断出,证书 $c$ 的长度也必须是 $|x|$ 的多项式。为什么呢?因为如果 $c$ 的长度是 $|x|$ 的指数级,一个运行时间为 $|x|$ 多项式的验证器甚至没有足够的时间来完整地读取证书 $c$。
现在我们来看题目中的陈述:验证器 $V$ 的运行时间是 $|x|+|c|$ 的多项式。这看起来似乎是高效的,但问题在于它没有限制证书 $c$ 的长度。
错误之处:如果我们可以选择一个长度是 $|x|$ 指数级的证书 $c$(例如, $|c| = 2^{|x|}$),那么运行时间是 $|x|+|c|$ 的多项式,比如 $O((|x|+|c|)^2)$, 将会变成 $O((|x|+2^{|x|})^2)$。这个时间是关于 $|x|$ 的指数级,而不是多项式级。
这意味着,通过使用一个非常长的证书,我们给了验证器指数级的计算时间。这违反了 NP 定义中“多项式时间验证”的核心要求。这样的语言可能属于 NEXP (Nondeterministic Exponential Time),但不一定在 NP 中。
$x \in L \iff \exists c$ 使得 $|c| \le p(|x|)$ 且 $V(x, c)$ 在 $O(|x|^k)$ 时间内接受。
这个判断题是错误的。NP 的核心要求是验证器相对于输入 $|x|$ 的大小是多项式时间的。这隐含地要求了证书 $|c|$ 的大小也必须是 $|x|$ 的多项式。题目中的条件允许证书 $c$ 的长度是指数级的,从而使得总验证时间相对于 $|x|$ 变成指数级,这不符合 NP 的定义。
此题旨在深化学生对 NP 形式化定义的理解,特别是对验证时间和证书长度的双重多项式约束的认识。它强调了复杂性分析中,“相对于谁”是至关重要的。
把验证过程想象成一个侦探(验证器)破案。
想象你在参加一个开卷考试。
📜 [原文4]
答案:正确。这是一个证明。
设 $A, B$ 是 NP 完全的,我们想证明 $A \leq_{\mathrm{P}} B$。
我们知道 $B$ 是 NP 难的,因此它是 NP 完全的。所以对于任何 $L \in \mathrm{NP}$,我们有 $L \leq_{\mathrm{P}} B$。
由于 $A$ 是 NP 完全的,这意味着 $A \in \mathrm{NP}$。
结合这两点(取语言 $L=A$),我们有 $A \leq_{\mathrm{P}} B$。
这个问题考察的是 NP-完全 (NP-Complete, NPC) 问题的定义和性质。让我们先分解 NP-完全 的定义。
一个语言(问题)$B$ 是 NP-完全的,如果它满足两个条件:
现在题目说:任取两个 NP-完全 问题 $A$ 和 $B$,我们是否可以证明它们能相互进行多项式时间归约?也就是 $A \leq_{\mathrm{P}} B$ 并且 $B \leq_{\mathrm{P}} A$ 是否成立?答案的证明只展示了 $A \leq_{\mathrm{P}} B$,但 $B \leq_{\mathrm{P}} A$ 的证明是完全对称的。
让我们一步步跟随答案的逻辑:
这个证明是完全正确的。由于 $A$ 和 $B$ 的地位是平等的,我们也可以用完全相同的方法,通过交换 $A$ 和 $B$ 的角色,来证明 $B \leq_{\mathrm{P}} A$。因此,所有 NP-完全 问题构成了一个等价类,它们在多项式时间归约的意义下,难度是完全相同的。
$x \in L \iff f(x) \in A$
这不是一个计算性问题,而是一个逻辑证明。但我们可以用具体的 NP-完全 问题来形象化。
我们知道这三个问题都是 NP-完全的。
这个逻辑可以无限传递下去,形成一个所有 NP-完全 问题之间的“全连接”归约网络。
该论断是正确的。NP-完全的定义保证了这一点。任何一个 NP-完全 问题 $B$ 都是 NP-难的,意味着所有 NP 问题都能在多项式时间内归约到它。而另一个 NP-完全 问题 $A$ 恰好就是 NP 问题之一,因此 $A$ 必然能归约到 $B$。
此题旨在检验学生是否深刻理解了 NP-完全 问题的核心性质,即它们是 NP 中“最难”的一类问题,并且所有这些“最难”的问题在难度上是等价的(在多项式时间归约下)。这解释了为什么我们只需要解决 一个 NP-完全 问题,就等于解决了所有 NP 问题。
想象一个“万能翻译机”俱乐部 (NP-Hard)。
想象 NP-完全 问题是“万能钥匙”。
📜 [原文5]
答案:错误。$N$ 是以二进制作为输入给出的,因此输入大小为 $O\left(\log _{2}(N)\right)$。但是 $N^{2}= 2^{2 \log _{2}(N)}$,使用 $N=2^{\log _{2}(N)}$。因此运行时间是输入长度的指数级。
这个问题考察的是对“输入大小”的精确理解,这是复杂性分析的基石。一个算法是否是多项式时间的,是比较其运行时间与 输入编码的长度,而不是输入所代表的 数值的大小。
让我们建立 $N$ 和 $n$ 之间的关系:
从 $n \approx \log_2(N)$,我们可以反解出 $N \approx 2^n$。
现在,我们将运行时间 $T(N) = O(N^2)$ 用输入大小 $n$ 来表示:
$T(n) = O((2^n)^2) = O(2^{2n})$。
这个结果 $O(2^{2n})$ 是一个关于输入大小 $n$ 的指数函数,而不是多项式函数 $O(n^k)$。因此,这个算法不是多项式时间的,而是指数时间的。
$T(n) = O((2^n)^2) = O(2^{2n})$.
这个判断是错误的。算法的复杂性必须根据其输入的 编码长度 来衡量。对于一个以二进制编码的数 $N$,其编码长度约为 $\log N$。一个 $O(N^2)$ 的运行时间,当用编码长度 $n \approx \log N$ 来表示时,变为 $O((2^n)^2) = O(2^{2n})$,这是一个指数级的复杂性,而非多项式级。
此题旨在强调复杂性分析中一个至关重要且容易出错的细节:区分输入数值和输入大小(编码长度)。它引入了伪多项式时间这一重要概念,并阐明了为何某些看似“多项式”的算法实际上是指数级的。
想象你要邮寄一笔钱。
想象你在数米。
📜 [原文6]
练习 2。证明 NP 在并运算下是封闭的。也就是说,如果 $L_{1}, L_{2} \in \mathrm{NP}$,那么 $L_{1} \cup L_{2} \in \mathrm{NP}$。
设 $L_{1}, L_{2} \in \mathrm{NP}$。那么根据定义,存在一个多项式时间验证器 $V_{1}$,使得:
类似地,我们有一个多项式时间验证器 $V_{2}$ 用于 $L_{2}$,使得:
我们现在想为 $L_{1} \cup L_{2}$ 构建一个多项式时间验证器 $V$。思路是给定 $c$,我们首先运行 $V_{1}$ 检查它是否接受,然后运行 $V_{2}$。如果其中任何一个接受,我们就接受;如果两者都拒绝,我们就拒绝。
```
Algorithm 1 A verifier for $L_{1} \cup L_{2}$
Input: $x, c$
Run $V_{1}$ on $x, c \quad \bullet V_{1}$ runs in polynomial time in $|x|$
if $V_{1}$ accepts then
Accept $x$
end if
Run $V_{2}$ on $x, c \quad \bullet V_{2}$ runs in polynomial time in $|x|$
if $V_{2}$ accepts then
Accept $x$
end if
Reject.
```
首先,很明显 $V$ 运行时间是 $|x|$ 的多项式,因为它所做的只是在 $x, c$ 上运行 $V_{1}, V_{2}$ ²。
所以剩下要证明的是
假设 $x \in L_{1} \cup L_{2}$,我们想证明存在一个 $c$ 使得 $V(x, c)$ 接受。如果 $x \in L_{1}$,我们知道存在一个 $c_{1}$ 使得 $V_{1}\left(x, c_{1}\right)$ 接受。因此取 $c=c_{1}$ 会导致 $V$ 接受。
否则,如果 $x \in L_{2}$,我们知道存在一个 $c_{2}$ 使得 $V_{2}\left(x, c_{2}\right)$ 接受。因此取 $c=c_{2}$ 会导致 $V$ 接受。
因此
我们现在证明另一个方向。假设存在一个 $c$ 使得 $V(x, c)$ 接受。那么在伪代码中,要么 $V_{1}(x, c)$ 接受,要么 $V_{2}(x, c)$ 接受。如果 $V_{1}$ 接受,那么根据定义
否则,如果 $V_{2}$ 接受,那么根据定义
无论如何,都必须是 $x \in L_{1} \cup L_{2}$。所以 $V(x, c)$ 接受 $\Rightarrow x \in L_{1} \cup L_{2}$。
这个问题要求证明 NP 类对于并运算是封闭的。所谓“封闭”,是指对集合中的成员进行某种运算后,结果仍然在该集合中。这里,集合是 NP,运算是并集(Union)。也就是说,如果 $L_1$ 和 $L_2$ 都是 NP 问题,那么它们俩的并集 $L_1 \cup L_2$ 也一定是一个 NP 问题。
要证明 $L_1 \cup L_2 \in \mathrm{NP}$,我们需要根据 NP 的定义,为其构造一个多项式时间的验证器。我们称这个新的验证器为 $V$。
证明思路:
该证明通过构造法,为两个 NP 语言的并集 $L_1 \cup L_2$ 设计了一个新的多项式时间验证器 $V$。这个 $V$ 顺序地调用 $L_1$ 和 $L_2$ 各自的验证器 $V_1$ 和 $V_2$,只要其中任意一个接受证书,新的验证器 $V$ 就接受。通过严谨地证明这个新验证器的时间复杂性和正确性,可以得出结论:$L_1 \cup L_2$ 仍属于 NP,故 NP 对并运算是封闭的。
这个练习的目的是让学生练习使用复杂性类的形式化定义(这里是 NP 的验证器模型)来证明其基本性质(闭包性质)。这是理论计算机科学中一种常见的证明模式,有助于加深对复杂性类本质的理解。
把 NP 问题想象成需要“门票”才能进入的俱乐部。
想象一个双重安检系统。你要进入一个大楼,这座大楼有两个入口,一个通往A公司,一个通往B公司。
📜 [原文7]
我们可以给出以下多项式时间算法来解决这个问题:
```
Algorithm 2 An algorithm for $k$-Clique
Input: $\langle G\rangle$ where $G$ is a graph
```

```
for all subset $S$ of $k$ vertices from $G$ do
Check that for each pairs $(u, v)$, with $u, v \in S$ we have that $(u, v)$ is an edge in $G$.
▷ This means the vertices in $S$ form a complete graph.
If for all pairs, the edge ( $u, v$ ) is in $G$, accept.
end for
Reject.
```
这个算法基本上查看 $G$ 中所有 $k$ 个顶点的子集,并检查它们是否形成一个完全图。显然,如果 $\langle G\rangle \in k$-Clique,那么我们将接受,否则我们将拒绝。
在算法中,我们查看 $G$ 中所有 $\binom{n}{k}$ 个 $k$ 个顶点的子集。对于每个子集,我们需要检查 $O\left(k^{2}\right)$ 条边是否存在,每对一个。由于 $k$ 是一个常数,我们可以假设这需要常数时间。因此算法的运行时间是 $O\left(n^{k}\right)$。由于 $k$ 是一个常数,这是多项式时间。
这个问题探讨了当 团 (Clique) 问题中的团大小 $k$ 是一个固定的常数时,其复杂性。我们要证明 $k$-Clique 问题属于 P 类,即存在一个多项式时间的确定性算法来解决它。
问题定义:
算法思路 (暴力搜索):
既然我们要找一个大小为 $k$ 的特定子集,最直接的方法就是检查所有可能性。
时间复杂性分析:
这是证明的关键部分。我们要分析上述算法的运行时间是否是输入大小 $n$ 的多项式。
$\binom{n}{k} = \frac{n!}{k!(n-k)!} = \frac{n(n-1)\dots(n-k+1)}{k!}$
由于 $k$ 是一个常数, $k!$ 也是一个常数。上式的分子是一个关于 $n$ 的 $k$ 次多项式。因此,$\binom{n}{k} = O(n^k)$。
由于 $k$ 是一个常数,$\binom{k}{2}$ 也是一个常数。所以,检查一个子集是否为团的时间是 $O(k^2)$,也就是常数时间。
$T(n) = O(n^k) \times O(k^2)$
因为 $k$ 是常数,所以 $O(k^2)$ 也是常数。因此,总运行时间是 $T(n) = O(n^k)$。
$\binom{n}{k} = \frac{n(n-1)\cdots(n-k+1)}{k!}$。当 $k$ 是常数时,分母是常数,分子是 $n$ 的 $k$ 次多项式,所以 $\binom{n}{k} = O(n^k)$。
当团的大小 $k$ 是一个固定的常数时,$k$-Clique 问题可以通过暴力枚举所有大小为 $k$ 的顶点子集并在多项式时间内解决。算法的运行时间是 $O(n^k)$,由于 $k$ 是常数,这是一个多项式时间算法,因此 $k$-Clique 问题属于 P 类。
此部分的目的是为了与下一部分的通用 Clique 问题形成鲜明对比。它展示了问题参数(如 $k$)是常数还是变量,会如何根本性地改变问题的复杂性,将其从 P 类问题变为 NP-完全 问题。
想象你在一个沙滩上找贝壳。
📜 [原文8]
如果我们要修改上述算法来证明这一点,它会是这样的:
```
Algorithm 3 An algorithm for Clique
Input: $\langle G, k\rangle \quad \triangleright k$ is now part of the input
for all subset $S$ of $k$ vertices from $G$ do
Check that for each pairs $(u, v) \in S(u, v)$ is an edge in $G$.
if for all pairs, the edge ( $u, v$ ) is in $G$ then
Accept.
end if
end for
Reject.
```
想象输入是 $\left(G, k=\frac{n}{2}\right)$。那么,算法将不得不查看 $\binom{n}{\frac{n}{2}}$ 个子集,但这
大约是 $2^{n}$ 个子集。然而,输入大小只有 $n^{2}+\log _{10}(n)$,因此算法的运行时间是指数级的。³
这个问题解释了为什么当团的大小 $k$ 成为输入的一部分时,前面用于证明 $k$-Clique $\in \mathrm{P}$ 的算法不再是多项式时间的。这正是通用 Clique 问题是 NP-完全 而非 P 类问题的关键所在。
问题定义的变化:
分析之前的算法:
我们仍然使用相同的暴力搜索算法:枚举所有大小为 $k$ 的子集并检查。
为什么不再是多项式时间?
关键在于,现在的运行时间必须与总输入大小 $O(n^2 + \log k)$ 进行比较。
让我们考虑一个最坏情况的例子,正如原文所建议的:
现在我们来比较:
由于运行时间是输入大小的指数函数,而不是多项式函数,所以这个算法不是多项式时间算法。
为什么之前的证明失效了?
之前的证明依赖于一个关键假设:$T(n) = O(n^k)$ 是一个多项式时间,因为指数 $k$ 是一个常数。
但是现在,指数 $k$ 本身就是输入的一部分,是一个变量。当 $k$ 可以随 $n$ 变化时(例如 $k=n/2$),运行时间 $O(n^k)$ 就变成了 $O(n^{n/2})$,这显然不是一个多项式函数。
$T(m) = O(\frac{2^{O(\sqrt{m})}}{\sqrt{O(\sqrt{m})}} \cdot (O(\sqrt{m}))^2) = O(2^{c\sqrt{m}} \cdot m^{3/4})$。
这个函数 $T(m)$ 是 $m$ 的指数函数(或严格来说,准指数),而不是多项式 $O(m^c)$。
当 $k$ 作为输入的一部分时,之前用于 $k$-Clique 问题的暴力枚举算法的运行时间 $O(\binom{n}{k} k^2)$ 不再是输入大小 $O(n^2 + \log k)$ 的多项式。在 $k=n/2$ 等最坏情况下,其运行时间会变成输入大小的指数函数。这解释了为什么该算法不能证明通用 Clique 问题属于 P 类,并暗示了其内在的困难性(实际上是 NP-完全的)。
这部分的存在是为了与前一部分形成对比,清晰地揭示了问题参数从常数变为变量是如何导致复杂性从 P 急剧跃升到 NP-完全的。这是理解复杂性理论中参数化复杂性思想的入门。
📜 [原文9]
练习 4。书中问题 7.18。证明如果 $\mathrm{P}=\mathrm{NP}$,那么除了 $A=\emptyset$ 和 $A=\Sigma^{*}$ 之外,所有 $A \in \mathrm{P}$ 的语言都是 NP 完全的。(提示:考虑 $L \leq_{\mathrm{P}} A$ 的定义,已知 $L \in$ NP 意味着 $L \in \mathrm{P}$。)
这个练习非常适合测试您对 NP 完全性定义的熟悉程度。
假设 $\mathrm{P}=\mathrm{NP}$,并且 $A \in \mathrm{P}$ 是除了 $\emptyset$ 或 $\Sigma^{*}$ 之外的任何语言。这意味着存在两个字符串 $y, z$ 使得 $y \in A$ 且 $z \notin A$。
现在考虑 NP 完全问题 3-SAT,由于假设 $\mathrm{P}=\mathrm{NP}$,我们有 3-SAT $\in P$。因此存在一个多项式时间判定器 $M$ 用于 3-SAT。
我们想证明 $A$ 是 NP 难的。我们将证明 3-SAT $\leq_{\mathrm{P}} A$。所以,我们声称以下是从 3-SAT 到 $A$ 的映射归约。
```
Algorithm 4 A mapping reduction $f$ from 3-SAT to $A$
Input: $\langle\phi\rangle \quad \triangleright \phi$ is a CNF
Run $M$ on $\langle\phi\rangle \quad \triangleright$ This takes polynomial time $\quad \triangleright$ This tells us if $\langle\phi\rangle \in$ 3-SAT or not
if $M$ accepts then
Return $y \quad \triangleright\langle\phi\rangle \in$ 3-SAT, so we return $y \in A$
else
Return $z \quad \triangleright\langle\phi\rangle \notin$ 3-SAT, so we return $z \notin A$
end if
```
很明显,上述映射 $f$ 是在多项式时间内计算的。此外,也很清楚,如果 $\langle\phi\rangle \in$ 3-SAT,我们有 $f(\langle\phi\rangle)=y \in A$。如果 $\langle\phi\rangle \notin$ 3-SAT,那么 $f(\langle\phi\rangle)=z \notin A$。因此 $f(\langle\phi\rangle) \in A \Longleftrightarrow\langle\phi\rangle \in 3$-SAT。
所以这是一个有效的从 3-SAT 到 $A$ 的多项式时间映射归约。
因此 $A$ 是 NP 难的,并且由于 $A \in \mathrm{P}$,$A \in \mathrm{NP}$,因此根据定义 $A$ 是 NP 完全的。
您可能想知道为什么我们需要 $A$ 不是 $\emptyset$ 或 $\Sigma^{*}$。在从语言 $L$ 到 $A$ 的映射归约中,我们需要 $x \in L \Leftrightarrow f(x) \in A$。
但是如果我们将 $A=\emptyset$,那么 $A$ 中就没有字符串!所以如果 $x \in L$,我们永远不能有 $f(x) \in A$。因此如果 $L \neq \emptyset$,就不可能存在从 $L$ 到 $A$ 的映射归约。
类似地,如果 $A=\Sigma^{*}$,那么所有字符串都在 $A$ 中。所以如果 $x \notin L$,我们永远不能有 $f(x) \notin A$。因此如果 $L \neq \Sigma^{*}$,就不可能存在从 $L$ 到 $A$ 的映射归约。
这个问题探讨了一个非常反直觉的、但在理论上极为重要的推论:如果 P=NP 这个千古猜想成立,那么整个复杂性世界的版图将会发生惊人的坍塌。具体来说,几乎所有我们认为“简单”的 P 类问题(除了两个最极端的平凡问题),都将在一夜之间变成“最难”的 NP-完全 问题。
证明框架:
分步证明:
构造归约函数 $f$:
关于平凡语言 $\emptyset$ 和 $\Sigma^*$ 的解释:
在 P=NP 的假设下,任何一个非平凡的 P 类语言 $A$ 都变成了 NP-完全问题。证明的关键是构造一个从已知 NP-完全问题(如 3-SAT)到 $A$ 的多项式时间归约。这个归约函数利用了 P=NP 带来的“魔法”:一个多项式时间的 3-SAT 求解器。该求解器预先判断输入实例的真伪,然后巧妙地将结果映射到 $A$ 中的一个“是”实例或一个“否”实例,从而完成归约。
此题旨在展示 P=NP 猜想的深刻含义。如果它为真,不仅仅意味着我们能高效解决旅行商等难题,更意味着整个复杂性等级结构会发生坍塌,P 和 NP-Complete 这两个看似遥远的类别会惊人地重合在一起。这揭示了复杂性理论内部结构之间的紧密联系。
想象你有一个“全知按钮” $M$ (因为 $\mathrm{P}=\mathrm{NP}$),你问它任何 3-SAT 问题 $\phi$,它都会立刻告诉你“真”或“假”。
现在你想证明“判断一个数是否为偶数”($A$) 是宇宙中最难的问题之一。
你建立一个服务亭 $f$:
📜 [原文10]
练习 5。书中问题 7.21。设 $G$ 表示一个无向图。并且设
证明 SPATH $\in \mathrm{P}$ 且 LPATH 是 NP 完全的。(简单路径是不访问同一个节点两次的路径。)
回想一下,简单路径是永不访问同一个节点两次的路径(即,路径没有环)。
我们首先证明 SPATH $\in P$。要检查从 $a$ 到 $b$ 是否存在长度 $\leq k$ 的简单路径,只需执行以下操作:从 $G$ 中的 $a$ 开始执行广度优先搜索。
当我们执行广度优先搜索(BFS)时,我们首先看到所有距离 $a$ 为 1 的节点,然后是距离为 2 的节点,依此类推……所以如果我们在距离达到 $k+1$ 之前到达 $b$,我们就接受,否则就拒绝。显然,执行 BFS 所需时间是输入大小的多项式。
这个问题展示了一对看似“镜像”的问题,但它们的复杂性却有天壤之别。SPATH (Shortest Path) 寻找短路径,而 LPATH (Longest Path) 寻找长路径。
第一部分:证明 SPATH $\in \mathrm{P}$
问题定义:
关键洞察:
算法:
时间复杂性分析:
SPATH 问题可以在多项式时间内解决,因为它等价于寻找图中两点间的最短路径长度是否超过一个阈值。使用标准的广度优先搜索 (BFS) 算法即可在 $O(V+E)$ 的时间内找到最短路径,这是一个多项式时间算法,因此 SPATH $\in \mathrm{P}$。
这部分的存在是为了与下一部分 LPATH 的 NP-完全性形成强烈对比。它展示了“至多 k”和“至少 k”这两个看似微小的词语差异,如何导致问题复杂性从“简单”(P) 变为“困难”(NP-完全)。
📜 [原文11]
我们现在证明 LPATH 是 NP 完全的。
首先,我们证明 LPATH 在 NP 中。这是一个 LPATH 的验证器:
```
Algorithm 5 A verifier for LPATH
Input: < G,a,b,k>,p \triangleright p is the extra string the verifier takes as input
Check p is a simple path from a to b in G.
Check that p has length at least k.
if Both of the above are true then
Accept.
else
Reject.
end if
```
显然,上述程序在多项式时间内运行。也很清楚,如果 $\langle G, a, b, k\rangle \in \mathrm{LPATH}$,那么从 $a$ 到 $b$ 必定存在一条长度 $\geq k$ 的简单路径。所以只需将 $p$ 设为这条路径,这将导致验证器接受。显然,如果不存在这样的路径,就没有 $p$ 会导致验证器接受 $\langle G, a, b, k\rangle, p$。
所以剩下要证明的是问题是 NP 难的。为此,我们将 NP 完全问题 HamPath 归约到 LPATH。我们需要给出一个从 HamPath 到 LPATH 的多项式时间映射归约。
回想一下,HamPath 是以下问题:给定一个图 $G$ 和两个节点 $s, t$,是否存在一条从 $s$ 到 $t$ 的哈密顿路径?
给定 $G, s, t$ 作为 HamPath 的输入,我们的函数输出 $\langle G, a=s, b=t, k=n\rangle$。即 $f(\langle G, s, t\rangle)= \langle G, s, t, n\rangle$。
显然这可以在多项式时间内计算。所以剩下要证明的是 $\langle G, s, t\rangle \in$ HamPath 当且仅当 $\langle G, s, t, n\rangle \in \mathrm{LPATH}$。
这并不难,一旦我们展开哈密顿路径的定义。根据定义,存在一条从 $s$ 到 $t$ 的哈密顿路径,当且仅当存在一条从 $s$ 到 $t$ 的简单路径,它访问每个顶点一次。
由于路径从 $s$ 开始,在 $t$ 结束,并经过所有 $n$ 个顶点一次,这意味着它的长度必须是 $n$⁴。
因此,根据定义,当且仅当存在一条从 $s$ 到 $t$ 长度为 $n$ 的简单路径时,$G$ 才具有从 $s$ 到 $t$ 的哈密顿路径。
还要注意简单路径的长度不能超过 $n$,否则会重复一个顶点,因此就不是简单路径。
因此,我们清楚地知道,当且仅当存在一条从 $s$ 到 $t$ 长度至少为 $n$ 的简单路径时,才存在从 $s$ 到 $t$ 的哈密顿路径。
所以 $\langle G, s, t\rangle \in$ HamPath 当且仅当 $\langle G, s, t, n\rangle \in \mathrm{LPATH}$。这证明了 HamPath $\leq_{\mathrm{P}}$ LPATH。因此 LPATH 是 NP 难的。
由于 LPATH 是 NP 难的且在 NP 中,它是 NP 完全的。
第二部分:证明 LPATH 是 NP-完全的
要证明 LPATH 是 NP-完全的,我们需要做两件事:
1. 证明 LPATH $\in \mathrm{NP}$
2. 证明 LPATH 是 NP-难的
最终结论:
$\langle G, s, t \rangle \in \text{HamPath}$
$\iff$ 存在从 $s$ 到 $t$ 的简单路径,访问了 $n$ 个顶点。
$\iff$ 存在从 $s$ 到 $t$ 的简单路径,长度为 $n-1$。
$\iff$ 存在从 $s$ 到 $t$ 的简单路径,长度至少为 $n-1$ (因为最长也就是 $n-1$)。
$\iff \langle G, s, t, n-1 \rangle \in \text{LPATH}$
LPATH 是 NP-完全的。首先,通过给出一个路径作为证书,我们可以在多项式时间内验证它是否是满足条件的简单路径,证明了 LPATH $\in \mathrm{NP}$。然后,通过一个从已知的 NP-完全问题——哈密顿路径 (HamPath)——到 LPATH 的多项式时间归约,证明了 LPATH 是 NP-难的。归约的核心思想是,一个 $n$ 顶点的图中的哈密顿路径,本质上就是一条长度恰好为 $n-1$ 的简单路径,这恰好可以被 LPATH 问题中“长度至少为 $n-1$”的条件所捕获。
此题是复杂性理论中一个经典的例子,用来说明微小的问题陈述变化可以导致复杂性的巨大差异。它教育学生如何通过归约来证明一个新问题是 NP-难的,这是解决复杂性问题的一项核心技能。
📜 [原文12]
[^0]: ${ }^{1}$ 但这意味着如果 $x \in L$,则存在一个长度为 $|x|$ 的多项式的 $c$,使得 $V(x, c)$ 接受。否则,$V$ 将没有时间在多项式时间内读取 $c$。
这个脚注是对练习1中问题2答案的补充说明,它解释了为什么 NP 定义中“验证器 $V$ 运行时间是 $|x|$ 的多项式”这一条,隐含地要求了“证书 $c$ 的长度也必须是 $|x|$ 的多项式”。
逻辑链条:
该脚注强调了 NP 验证器的多项式时间限制是一个硬约束,它不仅限制了计算步骤,也通过物理限制(读取时间)间接限制了能够提供给验证器的信息量(证书长度)。
📜 [原文13]
[^1]: ${ }^{2}$ 这是一个您可以忽略的技术点。我们应该首先检查 $c$ 不会太大。我的意思是 $|c|=O\left(n^{k}\right)$,其中 $V_{1}, V_{2}$ 都以 $O\left(n^{k}\right)$ 的时间运行。也就是说,如果 $c$ 大于 $V_{1}$ 和 $V_{2}$ 的运行时间,我们应该拒绝。这是为了避免 $c$ 太大导致将其作为输入给 $V_{1}$ 需要太长时间的情况。如果 $c$ 大于 $V_{1}, V_{2}$ 的运行时间,我们知道它们永远不会接受 $(x, c)$。
这个脚注是针对练习2(证明 NP 对并集封闭)中构造的新验证器 $V$ 的一个技术性补充。它处理了一个微妙的边界情况。
问题: 在我们为 $L_1 \cup L_2$ 构造的验证器 $V$ 中,我们假设 $V_1$ 和 $V_2$ 的运行时间分别是 $p_1(|x|)$ 和 $p_2(|x|)$。根据上一条脚注的逻辑,它们各自的有效证书 $c_1, c_2$ 的长度也分别被 $p_1(|x|)$ 和 $p_2(|x|)$ 所限制。那么,我们给新验证器 $V$ 的证书 $c$ 的长度应该是什么呢?
脚注的观点:
为什么可以忽略:
作者说这是“可以忽略的技术点”,因为 NP 的定义是“存在一个证书”。我们证明了如果 $x \in L_1 \cup L_2$,那么就存在一个(长度为多项式的)证书 $c_1$ 或 $c_2$ 能让 $V$ 接受。对于那些过长的、无效的证书,我们的验证器 $V$ 将会(正确地)拒绝它们,这并不影响证明的核心逻辑。这个脚注只是让验证器的构造更加“鲁棒”和“高效”。
该脚注为练习2中的构造性证明增加了一个技术细节:新的验证器可以首先检查证书的长度,如果长度超过了两个子验证器可能处理的范围,就直接拒绝。这可以形式上保证新验证器的证书长度也是多项式有界的。
📜 [原文14]
[^2]: ${ }^{3}$.重要的是要认识到我们查看的是最坏情况输入的运行时间。在这里,只要您给出 $k=n / 2$(或 $n$ 的任何足够大的函数),算法就会非常慢。
这个脚注是对练习3中关于通用 Clique 问题分析的强调。
核心思想:
该脚注强调了在判断算法是否为多项式时间时,必须考虑最坏情况的输入。对于通用 Clique 问题,当 $k$ 作为 $n$ 的一个函数(如 $k=n/2$)时,暴力算法的运行时间呈现指数增长,因此它不是一个多项式时间算法。
📜 [原文15]
[^3]: ${ }^{4}$ 这里我将路径的长度计为顶点数
这个脚注是作者在练习5证明 LPATH 的 NP-难度时,对自己使用的“路径长度”定义的一个澄清。
两种常见的“路径长度”定义:
脚注的作用:
与标准定义的关系:
结论:
这个脚注澄清了作者在特定步骤中使用了一个非标准的定义,但它想强调的是,无论使用哪种定义,证明的逻辑都是完全相同的,只是具体的 $k$ 值差了1。这不影响归约的正确性。
该脚注澄清了作者在证明中使用的“路径长度”是指顶点数,而非更常用的边数。这是一个定义上的选择,两种定义都能得出相同的结论,即 HamPath 可以归约到 LPATH。
1. $x \in L_{1} \Leftrightarrow \exists c_{1} \text { such that } V_{1}\left(x, c_{1}\right) \text { accepts. }$
- 解释: 这是语言 $L_1$ 属于NP类的形式化定义,说明一个字符串 $x$ 在 $L_1$ 中,当且仅当存在一个证书 $c_1$ 能被 $L_1$ 的验证器 $V_1$ 所接受。
2. $x \in L_{2} \Leftrightarrow \exists c_{2} \text { such that } V_{2}\left(x, c_{2}\right) \text { accepts. }$
- 解释: 这是语言 $L_2$ 属于NP类的形式化定义,与上一条类似。
3. $x \in L_{1} \cup L_{2} \Longleftrightarrow \exists c \text { such that } V(x, c) \text { accepts. }$
- 解释: 这是证明 $L_1 \cup L_2$ 属于NP需要达成的目标,即为 $L_1 \cup L_2$ 找到一个满足NP定义的验证器 $V$。
4. $x \in L_{1} \cup L_{2} \Rightarrow \exists c \text { such that } V(x, c) \text { accepts }$
- 解释: 这是证明 $L_1 \cup L_2 \in \mathrm{NP}$ 的完备性部分,说明如果 $x$ 属于并集,那么一定存在一个能让新验证器接受的证书。
5. $V_{1}(x, c) \text { accepts } \Rightarrow x \in L_{1}$
- 解释: 这是验证器 $V_1$ 的可靠性,如果 $V_1$ 接受了,那么输入 $x$ 一定属于语言 $L_1$。
6. $V_{2}(x, c) \text { accepts } \Rightarrow x \in L_{2}$
- 解释: 这是验证器 $V_2$ 的可靠性,与上一条类似。
本部分旨在对整个“讲义 11B:复杂性复习 - 解答”进行一次高层次的总结,提炼出每个练习所揭示的核心概念与思想。通过这次回顾,我们可以将孤立的知识点串联起来,形成对计算复杂性理论更宏观和深刻的理解。
这份讲义通过五个循序渐进的练习,深刻地探讨了计算复杂性理论的几个基石性概念:
本最终总结部分的存在,是为了帮助读者从具体的证明细节中跳脱出来,鸟瞰整个知识图景。它将各个练习的核心“寓意”联系在一起,巩固了对复杂性理论核心思想的直觉和理解,确保学习者不仅掌握了“如何证明”,更理解了“为何要这样证明”以及这些证明“揭示了什么”。
可以将整个讲义看作一次“计算世界”的探索之旅:
这次总结,就是站在旅途的终点,回顾一路上的风景,将它们串联成一幅完整的“计算复杂性世界地图”。
想象你刚刚看完一部由五个短片组成的电影。每个短片都讲述了一个关于“难度”的故事。本部总结就像是电影结束后的导演访谈或影评分析,它将五个独立的故事联系起来,揭示了它们共同的主题:“计算的极限是什么?”以及“我们如何精确地描述和度量这种极限?”。它帮助你将零散的观影感受整合成对导演(在此即为复杂性理论)核心思想的深刻洞见。
[[END_OF_RESPONSE]]所有解释内容已全部输出完毕。