查看原文,点我
在计算机算法中,计算复杂性是一个很重要的研究内容。计算复杂性理论(Computational complexity theory)被认为是理论计算机科学和数学的一个分支。
对于计算机而言,任何一个问题的求解都需要资源(即使是最简单的1+1的问题)。计算复杂性理论通过引入数学计算模型来研究这些问题以及定量计算解决问题所需的资源(时间和空间),从而将资源的确定方法正式化。
计算复杂性理论将计算问题按照在不同计算模型下所需时间资源的不同予以分类,就得到了常见的P、NP、NP完全、NP难这样的概念(note:P代表Polynomial,即多项式时间的概念)
一个问题如果在确定性图灵机上所需时间不会超过一个确定的多项式(以输入的长度为多项式的不定元),那么我们称这类问题的集合为P(polynomial time Turing machine)
通俗地来说P问题就是多项式时间内可解的问题
可以在非确定型图灵机上在多项式时间内找出解的问题的集合
如果一个问题,可以在多项式时间内验证他的解是否正确,则该问题是一个NP问题。显然 P ∈ N P P\in NP P∈NP (note:到目前为止,P不等于NP)
这里Complete是完备的意思
一个决定性问题C若是为NPC,则代表它对NP是完备的,这表示:
a) 该问题是一个NP问题
b) 所有属于NP的问题都可归约成该问题
对于一个NP-C问题,我们不可能尝试将所有的NP规约到它,所以通常采用下述方法证明一个问题是NP-C问题:
a) 证明给定该问题的一个解,可以在多项式时间验证该问题
b) 可以将一个已知的NP-C问题规约到该问题(已经证明的NPC问题:卡普的21个NPC问题或者A compendium of NP optimization problems)
在计算复杂度理论内,一个极度重要的成就是史提芬·古克在1971年证明出了第一个NP-完全问题— 布尔可满足性问题。
Cook定理(1971) 可满足问题属于NP-C
可满足问题(SAT)
可满足问题是判断任意给定的一个布尔表达式是否存在一个真赋值(如果有这样一个真赋值,则称该布尔表达式可满足)
相较于NP-C问题,NP-Hard问题仅满足条件2
即所有的NP问题都可以规约到NP-Hard问题
通常通过将一个已知的NP-C问题规约到该问题来证明一个问题是NP-Hard问题
我们可以得到以下的关系图:
证明 P = N P P=NP P=NP是一个未解决的千禧年难题,当然如果最终证明 P = N P P=NP P=NP,会发生很多“有趣”的事情:比如当下流行的密码理论将不再安全,可能这时能够期待的就只有量子加密技术的早日出现吧。
多项式时间可解的问题,即P问题,通常被认为是一个易解的问题;一个多项式时间的算法往往也被认为是好的算法。然而多项式时间具体是什么含义?
在计算复杂度理论中,多项式时间(Polynomial time)指的是一个问题的计算时间m(n)不大于问题大小n的多项式倍数。用数学语言描述则为 m ( n ) = O ( n k ) , k m(n)= O(n^k),k m(n)=O(nk),k为一常量值。
在可计算性理论与计算复杂性理论中,归约是将某个计算问题转换为另一个问题的过程。比较直观的说法:如果一个能有效解决问题B的算法,也可以作为解决问题A的子程序,则将问题A称为“可归约”到问题B,因此求解A并不会比求解B更困难。
规约是证明NP-Hard问题的一种常用方法,通常用 < = <= <=这个符号来表示,如 p < = Q p<=Q p<=Q,表示P is reducible to Q , or Q is the reduction from P or P is reduced to Q(P问题可以归约到Q问题,or可以把P归约到Q)。方便记忆的话,这里的规约符号可以记作小于且等于,即说明问题P至少比Q容易,或者Q至少比P难
- 问题A能够规约为问题B
a) 一个能求解问题B的算法一定可以用来求解问题A(以子问题的形式)
b) 求解问题A的难度一定不会比求解问题B的难度大(这里的难度大指的是求解过程需要更多的计算、存储资源等)。——>可以从侧面证明,如求解A的难度更大,而由于A可以规约为问题B,则可以用求解问题B的算法来求解问题A,则求解A的算法可以替换为一个难度更低的算法- 规约具有传递性:A可以规约为B,B能规约为C,则A一定可以规约为C
可以说,一个问题归约为另一个问题的过程,是将问题复杂化的过程。归约得到问题的应用范围往往也扩大了。例如,一元二次方程的求解和一元一次方程的求解。
规约的类型较多,在本文中的规约特指多项式时间规约,即在多项式时间内将一个问题规约到另一个问题。
多项式归约主要做的就是以下两个转化(注意两个转化都要在polynomial的时间内完成)
3SAT问题定义如下:
给定一个有穷的布尔变量集合 X = { x 1 , x 2 , ⋯ , x n } , ∣ X ∣ = n X=\{x_1,x_2,\cdots,x_n\},|X|=n X={x1,x2,⋯,xn},∣X∣=n,每个变量取值为0或1,有一组子句(Clause) C = { C 1 , C 2 , ⋯ , C m } , ∣ C ∣ = m , C = C 1 ∩ C 2 ∩ ⋯ ∩ C m C=\{C_1,C_2,\cdots,C_m\},|C|=m,C=C_1\cap C_2\cap\cdots \cap C_m C={C1,C2,⋯,Cm},∣C∣=m,C=C1∩C2∩⋯∩Cm,每个 C i C_i Ci是由三个变量组成的析取范式,即 z 1 ∪ z 2 ∪ z 3 z_1\cup z_2 \cup z_3 z1∪z2∪z3.
其中
总的来说,一个SAT问题例子中包含一堆子句(Clause),这一堆子句每个都包含3个文字(Literal),每个literal表示命题变元集中一个布尔变量(Variable)或它的否定形式
一个3SAT的例子:
X = { x 1 , x 2 , x 3 } , C = { C 1 , C 2 , C 3 } , C 1 = x 1 ∪ x 2 ˉ ∪ x 3 , C 2 = x 1 ˉ ∪ x 2 ˉ ∪ x 3 , C 3 = x 1 ˉ ∪ x 2 ∪ x 3 ˉ X=\{x_1,x_2,x_3\},C=\{C_1,C_2,C_3\},C_1=x_1\cup \bar{x_2}\cup x_3,C_2=\bar{x_1}\cup \bar{x_2}\cup x_3,C_3=\bar{x_1}\cup x_2\cup \bar{x_3} X={x1,x2,x3},C={C1,C2,C3},C1=x1∪x2ˉ∪x3,C2=x1ˉ∪x2ˉ∪x3,C3=x1ˉ∪x2∪x3ˉ
存在一个真值赋值: x 1 , x 2 = 1 , x 3 = 1 x_1,x_2=1,x_3=1 x1,x2=1,x3=1,使得 C = 1 C=1 C=1,即该布尔表达式是可满足的
对于3SAT问题,有以下结论
3 S A T ∈ N P C 3SAT\in NPC 3SAT∈NPC
众所周知,0-1背包问题是一个NP-C问题,应用动态规划算法可以得到伪多项式时间的算法,如何证明0-1背包问题是一个NP-C问题?
0-1 背包问题(0-1 Knapsack)在数学上的定义如下:
我们有n种物品,物品j的重量为 w j w_j wj,价格为 p j p_j pj,我们假定所有物品的重量和价格都是非负的。背包所能承受的最大重量为W.在限定的总重量内,我们如何选择,才能使得物品的总价格最高.如果限定每种物品只能选择0个或1个,则问题称为0-1背包问题
0-1背包问题本质上是一个优化问题,为了证明0-1背包问题是一个NP-C问题,我们首先引入0-1背包问题对应的判定问题(记作0-1 Knapsack Fill )
我们有n种物品,物品j的重量为 w j w_j wj,价格为 p j p_j pj,我们假定所有物品的重量和价格都是非负的,限定每种物品只能选择0个或1个,是否存在一个选择策略,使得选择的物品总重量为W
看上去似乎引入0-1 Knapsack Fill问题没有任何用处,实际上对于优化问题和其对应的判定问题,有如下结论:
一个优化问题,不会比其对应的判定问题简单
由此,可以从0-1 Knapsack Fill问题入手,来证明0-1 Knapsack问题的复杂性
证明0-1 Knapsack Fill ∈ \in ∈ P问题
显然给定0-1 Knapsack的一个解,可以在多项式时间内验证该解是否正确:对选取的物品集合做一次遍历,累加得到价格和重量总和,即可验证。所以0-1 Knapsack Fill ∈ \in ∈ P问题.
将一个已知的NP-C问题规约到0-1 Knapsack Fill问题(多项式时间内)
证明3SAT<=0-1 Knapsack Fill
为了将3SAT规约到0-1 Knapsack Fill,做出以下定义:
通过上述转化过程,我们将一个3SAT问题归约到了0-1 Knapsack Fill实例(显然该过程是在多项式时间内,因为每一步的转化过程都是确定的),该实例有以下特点:
对于任意一个3SAT问题,我们都可以通过上述过程转化为一个0-1 Knapsack Fill问题,为证明0-1 Knapsack Fill问题的复杂性,只需证明:当且仅当C可满足时,存在物品集合的子集 U ′ ∈ U U^{'}\in U U′∈U 使得 ∑ u ∈ U ′ w ( u ) = W \sum_{u\in U^{'}} w(u)=W ∑u∈U′w(u)=W
通过上述过程,我们有3SAT<=0-1 Knapsack Fill
给出一个3SAT<=0-1 Knapsack Fill的例子:
3SAT:
X = { x 1 , x 2 , x 3 , x 4 , x 5 } , C = { c 1 , c 2 , c 3 , c 4 } , c 1 = { x 1 , x 2 ˉ , x 4 } , c 2 = { x 2 , x 3 ˉ , x 5 ˉ } , c 3 = { x 3 , x 4 , x 5 } , c 4 = { x 1 ˉ , x 2 , x 5 ˉ } X=\{x_1,x_2,x_3,x_4,x_5\},C=\{c_1,c_2,c_3,c_4\},c_1=\{x_1,\bar{x_2},x_4\},c_2=\{x_2,\bar{x_3},\bar{x_5}\},c_3=\{x_3,x_4,x_5\},c_4=\{\bar{x_1},x_2,\bar{x_5}\} X={x1,x2,x3,x4,x5},C={c1,c2,c3,c4},c1={x1,x2ˉ,x4},c2={x2,x3ˉ,x5ˉ},c3={x3,x4,x5},c4={x1ˉ,x2,x5ˉ}
对应的0-1 Knapsack Fill问题:
U = { u 1 , u 1 ˉ , u 2 , u 2 ˉ , u 3 , u 3 ˉ , u 4 , u 4 ˉ , u 5 , u 5 ˉ , c o 1 1 , c o 2 1 , c o 1 2 , c o 2 2 , c o 1 3 , c o 2 3 , c o 1 4 , c o 2 4 } U=\{u_1,\bar{u_1},u_2,\bar{u_2},u_3,\bar{u_3},u_4,\bar{u_4},u_5,\bar{u_5},co1_1,co2_1,co1_2,co2_2,co1_3,co2_3,co1_4,co2_4\} U={u1,u1ˉ,u2,u2ˉ,u3,u3ˉ,u4,u4ˉ,u5,u5ˉ,co11,co21,co12,co22,co13,co23,co14,co24},W=333311111.
物品集合U中物品对应重量为:
综合证明1和2,可知0-1 Knapsack Fill ∈ \in ∈ NPC
对于0-1 knapsack问题,给定其一个解,无法在多项式时间内验证该解是否正确:
综上:可知0-1 knapsack ∈ \in ∈NP-Hard