算法:NP问题,NP完全问题(NPC),NPhard问题

    在做计算机算法关于NP完全问题这一章的作业的时候,发现有很多概念理解的不是很透彻,然后就反复看老师的讲义,在网上查阅各种资料,花了很多时间来弄懂这块的内容。发现书上的概念太正式,定义太标准,不容易很快理解,而网上的资料有些地方论述的不够全面,像我这样的新手在遇到NP家族的概念和问题的时候就很容易懵逼…因此在此将我的心得与整理的资料放在这里,一方面供我以后自己参考,避免又搞混,一方面和大家进行交流。

一、概念介绍

下面就对这些令人头疼的概念做个简单的介绍和对比:

1. P类问题

    这类问题是最简单的一类问题,即所有这类问题都可以用一个确定性算法在多项式时间内求出解。此类问题的复杂度是此类问题的一个实例的规模n的多项式函数。比如排序问题,求最短路径问题等。

2. NP(Non-deterministic Polynomial,即多项式复杂程度的非确定性问题)问题

    有些问题很难找到多项式时间的解法(也许根本就不存在),但是如果给出了该问题的一个解,我们可以在多项式时间内判断这个解是否正确,比如对于哈密尔顿回路问题,如果给出一个任意的回路,我们可以很容易的判断出该回路是否是哈密尔顿回路(看是不是所有顶点都在回路中)。


P类问题是NP问题的子集,原因是P类问题既然能在多项式时间内求解,也必然能在多项式时间在验证它的解,满足NP类问题的定义。

3. NP完全问题(NPC)


    如果所有NP问题都能在多项式时间内转化为A,则称A为NPC问题。

NPC是NP的子集。

4. NP-hard问题(NPH,NP困难问题)

    问题A不一定是一个NP问题,但所有的NPC问题都可以在多项式时间内转化为A,则称A为NPH问题。

二、其他知识

1. NPC问题一定是NP困难问题

    根据NP完全问题和NP困难问题的定义可以发现,NP完全问题A的定义中,除了要求对于所有别的判定问题A’ ∈NP,都有A’ ∝A,还要求A∈NP,而NP困难问题不一定是NP问题,所以可以看出NP完全问题是NP困难问题的子集,所以NP完全问题一定都是NP困难问题。

2.NP困难问题中包含的一些问题是既不属于NP也不属于P类问题的,一个典型的例子就是第k个最重子集问题。

3.证明一个新问题A是NPC问题的方法:

a.证明A∈NP;

b.选取一个已知的NPC问题B;

c.构造一个从B到A的变换f;

d.证明f为一个多项式变换。

这里一个关键的问题是如何选取参照物B和构造多项式变换f。在实际的证明中参照物的选择带有一定的经验性,已知的NPC问题越多越有利。第一个被证明的NPC问题是sat问题(可满足性问题),这个开创性的工作是由COOK完成的,自从他证明了sat问题是NPC问题以来,人们已经发现并证明了数千个NPC问题,如0/1背包问题和哈密尔顿回路问题等。

4.几个典型的NPC问题

三维匹配问题(3 dimensional matching,3DM);三元精确覆盖问题(exact cover by 3-set,X3C);顶点覆盖问题(vertex cover,VC);

哈密尔顿回路问题(Hamiltonian circuit,HC);划分问题(PARTS);三元可满足性问题(3SAT);团问题(CLIQUE);0/1背包(判定)问题(0/1KPS)

    暂时先写这么多,本人水平有限,可能有些讲的不清楚的地方,欢迎批评指正。

  • 14
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值