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