美文网首页
NP和P问题

NP和P问题

作者: SpringWolfM | 来源:发表于2018-01-11 04:54 被阅读0次

    来源:maxtrix67:http://www.matrix67.com/blog/archives/105

    • P问题:在多项式时间内可以求出解的问题
    • NP问题:在多项式时间内可以证明一个解是对的问题 or 在多项式时间内可以猜出一个解的问题

    1. 所有的P类问题都是NP问题

    所有的P类问题都是NP问题的意思是:P属于NP,P是NP的子集
    能多项式地解决一个问题,必然能多项式地验证一个问题的解(意思是,既然正解都出来了,验证任意给定的解也只需要比较一下就可以了)。

    1. 是否所有的NP问题都是P类问题

    人们目前想知道想证明的是:是否所有的NP问题都是P类问题
    也就是说,集合P与集合NP(把P类问题和NP类问题集合化),现在知道P属于NP,想要知道:是否有P=NP
    目前的大方向是:P=NP不成立,也就是,多数人相信,存在至少一个不可能有多项式级复杂度的算法的NP问题。

    1. NP-compeleted(NP完全问题)
    • 约化(Reducibility,有的资料上叫“归约”):
      问题A可以约化为问题B的含义是,可以用问题B的解法解决问题A,或者说,问题A可以“变成”问题B。

      例子1:问题A是求解一个一元一次方程,问题B是求解一个二元一次方程。求解一元一次方程可以约化为求解一个二元一次方程。把问题A转换成问题B,两个问题就等价了。

      例子2:Hamilton回路可以约化为TSP问题(Travelling Salesman Problem,旅行商问题):在Hamilton回路问题中,两点相连即这两点距离为0,两点不直接相连则令其距离为1,于是问题转化为在TSP问题中,是否存在一条长为0的路径。Hamilton回路存在当且仅当TSP问题中存在长为0的回路。

    NPC问题的定义非常简单。同时满足下面两个条件的问题就是NPC问题。首先,它得是一个NP问题;然后,所有的NP问题都可以约化到它。证明一个问题是 NPC问题也很简单。先证明它至少是一个NP问题,再证明其中一个已知的NPC问题能约化到它(由约化的传递性,则NPC问题定义的第二条也得以满足;至于第一个NPC问题是怎么来的,下文将介绍),这样就可以说它是NPC问题了。

    既然所有的NP问题都能约化成NPC问题,那么只要任意一个NPC问题找到了一个多项式的算法,那么所有的NP问题都能用这个算法解决了,NP也就等于P了。因此,给NPC找一个多项式算法太不可思议了。因此,前文才说,“正是NPC问题的存在,使人们相信P≠NP”。我们可以就此直观地理解,NPC问题目前没有多项式的有效算法,只能用指数级甚至阶乘级复杂度的搜索。

    • NP-Hard问题:NP-Hard问题是这样一种问题,它满足NPC问题定义的第二条但不一定要满足第一条(就是说,NP-Hard问题要比 NPC问题的范围广)。NP-Hard问题同样难以找到多项式的算法,但它不列入我们的研究范围,因为它不一定是NP问题。即使NPC问题发现了多项式级的算法,NP-Hard问题有可能仍然无法得到多项式级的算法。事实上,由于NP-Hard放宽了限定条件,它将有可能比所有的NPC问题的时间复杂度更高从而更难以解决。

    不要以为NPC问题是一纸空谈。NPC问题是存在的。确实有这么一个非常具体的问题属于NPC问题。下文即将介绍它。

    下文即将介绍逻辑电路问题。这是第一个NPC问题。其它的NPC问题都是由这个问题约化而来的。因此,逻辑电路问题是NPC类问题的“鼻祖”。

    逻辑电路问题是指的这样一个问题:给定一个逻辑电路,问是否存在一种输入使输出为True。

    什么叫做逻辑电路呢?一个逻辑电路由若干个输入,一个输出,若干“逻辑门”和密密麻麻的线组成。看下面一例,不需要解释你马上就明白了。
    ┌───┐
    │ 输入1├─→┐ ┌──┐
    └───┘ └─→┤ │
    │ or ├→─┐
    ┌───┐ ┌─→┤ │ │ ┌──┐
    │ 输入2├─→┤ └──┘ └─→┤ │
    &
    nbsp;└───┘ │ ┌─→┤AND ├──→输出
    └────────┘┌→┤ │
    ┌───┐ ┌──┐ │ └──┘
    │ 输入3├─→┤ NOT├─→────┘
    └───┘ └──┘
    这是个较简单的逻辑电路,当输入1、输入2、输入3分别为True、True、False或False、True、False时,输出为True。
    有输出无论如何都不可能为True的逻辑电路吗?有。下面就是一个简单的例子。
    ┌───┐
    │输入1 ├→─┐ ┌──┐
    └───┘ └─→┤ │
    │AND ├─→┐
    ┌─→┤ │ │
    │ └──┘ │ ┌──┐
    │ └→┤ │
    ┌───┐ │ │AND ├─→输出
    │输入2 ├→─┤ ┌──┐ ┌→┤ │
    └───┘ └→┤NOT ├→──┘ └──┘
    └──┘

    上面这个逻辑电路中,无论输入是什么,输出都是False。我们就说,这个逻辑电路不存在使输出为True的一组输入。

    回到上文,给定一个逻辑电路,问是否存在一种输入使输出为True,这即逻辑电路问题。

    逻辑电路问题属于NPC问题。这是有严格证明的。它显然属于NP问题,并且可以直接证明所有的NP问题都可以约化到它(不要以为NP问题有无穷多个将给证明造成不可逾越的困难)。证明过程相当复杂,其大概意思是说任意一个NP问题的输入和输出都可以转换成逻辑电路的输入和输出(想想计算机内部也不过是一些 0和1的运算),因此对于一个NP问题来说,问题转化为了求出满足结果为True的一个输入(即一个可行解)。

    有了第一个NPC问题后,一大堆NPC问题就出现了,因为再证明一个新的NPC问题只需要将一个已知的NPC问题约化到它就行了。后来,Hamilton 回路成了NPC问题,TSP问题也成了NPC问题。现在被证明是NPC问题的有很多,任何一个找到了多项式算法的话所有的NP问题都可以完美解决了。因此说,正是因为NPC问题的存在,P=NP变得难以置信。P=NP问题还有许多有趣的东西,有待大家自己进一步的挖掘。攀登这个信息学的巅峰是我们这一代的终极目标。现在我们需要做的,至少是不要把概念弄混淆了。

    相关文章

      网友评论

          本文标题:NP和P问题

          本文链接:https://www.haomeiwen.com/subject/thtznxtx.html