上科大2022年考研初试991NPC证明问题
七、NPC(1题,共20分) 我们先回顾一下NP-Complete问题SUBSET-SUM:给定一组非负整数\(S\)和一个目标值\(K\),询问\(S\)是否存在一个子集\(S'\),使得\(\sum_{i \in S' } i = K\)。现在我们定义另外一个问题AVERAGE-SUM,即给定一组非负整数\(S\),询问\(S\)是否存在一个子集\(S'\),使得\(\sum_{i \in S'}i = \frac{1}{|S|} \sum_{i \in S} i\),\(|S|\)是\(S\)中元素的个数。它类似于SUBSET-SUM问题,不同之处在于现在的目标值总是\(S\)的平均值。请证明AVERAGE-SUM是NP-Complete问题。
提示:证明问题\(Y\)是NP-Complete问题,需要首先证明该问题是NP问题,然后再选择一个NP-Complete问题\(X\),证明该问题\(X\)可以以多项式时间归约到问题\(Y\)\((X \leq_p Y)\)
证明:
-
证明
AVERAGE-SUM是NP问题:
NP问题就是可以在多项式时间内验证的判定问题。显然,AVERAGE-SUM是判定问题(输出只有1或0)。若给定\(S'\),可以在多项式时间内\(\Theta(|S| + |S'|)\)验证\(\sum_{i \in S'}i = \frac{1}{|S|} \sum_{i \in S} i\)是否成立。所以问题AVERAGE-SUM是NP问题。 -
证明
AVERAGE-SUM是NPC(Np-Complete)问题:
已知AVERAGE-SUM是NP问题,SUBSET-SUM是NPC问题,如果能证明SUBSET-SUM能在多项式时间内规约到AVERAGE-SUM问题,就能证明AVERAGE-SUM是NPC问题。先回顾一下规约的定义:
语言\(L_1\)在多项式时间内可以规约到语言\(L_2\),记作\(L_1 \leq_{p} L_2\),如果存在一个多项式时间的可计算函数\(f: \{0, 1\} ^ * \rightarrow \{0, 1\}^*\),满足对所有的\(x \in \{0,1\}^*\),\(x \in L_1\)当且仅当\(f(x) = L_2\)。则称函数\(f\)为归约函数,计算\(f\)的多项式时间算法\(F\)称为规约算法。“算法导论中文版第三版 P627”
(语言是判定问题(decision problem)的一种形式化表达。)
在这个问题中,问题
SUBSET-SUM的输入有一个集合\(S\)和一个整数\(K\),可以表示成\(x = (S,K)\),问题AVERAGE-SUM的输入只有一个集合\(S\),可以表示成\(y = (S)\)。要证明SUBSET-SUM能在多项式时间内规约到AVERAGE-SUM问题,就是要证明存在多项式时间的可计算函数\(f\),对于问题SUBSET-SUM的输入\(x = (S_1, K_1)\),若\(f(x) = y = (S_2)\),那么将\(x\)作为问题SUBSET-SUM输入,\(y\)作为问题AVERAGE-SUM输入时,两个问题结果一样,即同时为1或同时0。首先,注意到对输入为\((S_1,K_1)\)的问题
SUBSET-SUM来说,在\(S_1\)中增加一个数\(n\),若\(n = 0 或 n > K_1\),则\(n\)一定不会出现在\(S'\)中,对结果没有任何影响。 \(\frac{1}{|S_1|} \sum_{i \in S_1} i\) 与\(K_1\)的大小关系有下面三种情况:-
若\(\frac{1}{|S_1|} \sum_{i \in S_1}i = K_1\),只要让\(S_2=S_1\),这两个问题实际上已经是同一个问题。
-
若\(\frac{1}{|S_1|} \sum_{i \in S_1} i< K\),则\(\frac{1}{|S_1| + 1} \sum_{i \in S_1} i< \frac{1}{|S_1|} \sum_{i \in S_1} i<K\),令\(n = K_1(|S_1| + 1) - \sum_{i \in S_1}i > 0\)。等式右边展开可得\(n = K_1|S_1| - \sum_{i\in S}i + K_1 > K_1\),令\(S_1'\)为\(S_1\)添加元素\(n\)后的集合,\((S_1',K_1)\)作为
SUBSET-SUM的输入时,和\((S_1,K_1)\)作为SUBSET-SUM输入的结果一致。又因为\(|S_1'| = |S_1| + 1\),此时有\(\frac{1}{|S_1'|} \sum_{i \in S_1'} i= K_1\),转化成了上一种情况。 -
若\(\frac{1}{|S_1|} \sum_{i \in S_1} > K\),可以在\(S_1\)中不断增加\(0\),可以让 \(\sum_{i \in S_1} i\)不变的同时\(|S_1|\)减小,直到\(\frac{1}{|S_1|} \sum_{i \in S_1} < K\),转化成了上一种情况。
显然整个转化过程是多项式时间的。
-
ps: 证明某种语言\(L\)是NP完全语言的方法(“算法导论中文版第三版 P634” ):
- 证明\(L \in NP\)。
- 选取一种已知的NP完全语言\(L'\)
- 描述一种可计算函数\(f(x)\)的算法,其中\(f\)可将\(L'\)中的每一个实例\(x \in \{0,1\}^*\)映射为\(L\)中的实例\(f(x)\)。
- 证明函数\(f\)满足\(x \in L'\)当且仅当对于所有的\(x \in \{0,1\}^*\)都有\(f(x) \in L\)。
- 证明计算函数\(f\)的算法有多项式运行时间。
author: num73
浙公网安备 33010602011771号