上科大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)\)

证明

  1. 证明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问题。

  2. 证明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” ):

  1. 证明\(L \in NP\)
  2. 选取一种已知的NP完全语言\(L'\)
  3. 描述一种可计算函数\(f(x)\)的算法,其中\(f\)可将\(L'\)中的每一个实例\(x \in \{0,1\}^*\)映射为\(L\)中的实例\(f(x)\)
  4. 证明函数\(f\)满足\(x \in L'\)当且仅当对于所有的\(x \in \{0,1\}^*\)都有\(f(x) \in L\)
  5. 证明计算函数\(f\)的算法有多项式运行时间。

posted on 2024-05-09 01:00  num73  阅读(139)  评论(0)    收藏  举报