上科大2022年初试991NPC问题

七、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 iSi=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 iSi=S1iSi ∣ 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) (XpY)

证明

  1. 证明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 iSi=S1iSi是否成立。所以问题AVERAGE-SUM是NP问题。

  2. 证明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 L1pL2,如果存在一个多项式时间的可计算函数 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 xL1当且仅当 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=0n>K1,则 n n n一定不会出现在 S ′ S' S中,对结果没有任何影响。 1 ∣ S 1 ∣ ∑ i ∈ S 1 i \frac{1}{|S_1|} \sum_{i \in S_1} i S11iS1i 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 S11iS1i=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 S11iS1i<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+11iS1i<S11iS1i<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)iS1i>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=K1S1iSi+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 S11iS1i=K1,转化成了上一种情况。
    • 1 ∣ S 1 ∣ ∑ i ∈ S 1 > K \frac{1}{|S_1|} \sum_{i \in S_1} > K S11iS1>K,可以在 S 1 S_1 S1中不断增加 0 0 0,可以让 ∑ i ∈ S 1 i \sum_{i \in S_1} i iS1i不变的同时 ∣ S 1 ∣ |S_1| S1减小,直到 1 ∣ S 1 ∣ ∑ i ∈ S 1 < K \frac{1}{|S_1|} \sum_{i \in S_1} < K S11iS1<K​,转化成了上一种情况。

    显然整个转化过程是多项式时间的。

ps: 证明某种语言 L L L是NP完全语言的方法(“算法导论中文版第三版 P634” ):

  1. 证明 L ∈ N P L \in NP LNP
  2. 选取一种已知的NP完全语言 L ′ L' L
  3. 描述一种可计算函数 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)
  4. 证明函数 f f f满足 x ∈ L ′ x \in L' xL当且仅当对于所有的 x ∈ { 0 , 1 } ∗ x \in \{0,1\}^* x{0,1}都有 f ( x ) ∈ L f(x) \in L f(x)L
  5. 证明计算函数 f f f的算法有多项式运行时间。
  • 39
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值