P & NP 问题是由Steve Cook于1971年首次提出,克雷数学研究所将它作为高额悬赏的七个千禧年难题之一,同时,它也是计算机科学领域的最大难题。
下面先看看最基本的P类问题和NP问题:
P问题
P——Polynomial,多项式时间。P问题表示在多项式时间内可以解决的问题。时间复杂度为O(n), O(nk), O(nlogn)的问题都能在多项式时间内解决,我们在数据结构与算法中的大部分问题如排序、找最短路径等都能在多项式时间内解决。
NP问题
NP——Nondeterministic Polynomial ,非确定多项式时间。NP问题表示不确定在多项式时间内是否能解决的一类问题。也就是说它可能能在多项式时间内解决,也可能不能。同时P问题是NP问题的一个子类,即所有的P问题都是NP问题。
NP问题的延伸
NPC问题
NPC问题即NP-Complete问题,是NP问题中最难的一类问题。
它的定义分为两个层面:
1. 它是一个NP问题;
2. 所有的NP问题都能在多项式时间内变换得到它。
它有一个很管用的性质:如果一个NPC问题存在多项式时间能解决的算法,那么所有NP问题都能在多项式时间内求解,也就能证明P=NP。这对于求解N是否等于NP有重大意义。
Steve Cook在 1971年找到了第一个NPC问题,此后人们又陆续发现很多NPC问题,现在可能已经有3000多个了。哈密顿回路问题,货郎担问题,集团问题,最小边覆盖问题等等很多问题都是NPC问题。
NPH问题
NPH问题即NP-Hard问题,它是比NPC还难的问题。它满足NPC问题定义的第二条,但是不满足第一条。比如一个问题A,若它不是NP问题,同时可以找到某一个NPC问题能再多项式时间内转换为A,则A是一个NPH问题。旅行商问题(TSP)就是一个NPH问题。
最后我们设想一下,假如P=NP,那么世界将变成怎样?
首先,所有的NPC问题将被全部解决。
困扰人类已久的自然语言处理问题将被一举攻破。
所有人工智能问题都将得到解决:我们只需向计算机提交足够多的情境以及与之对应的正常人的反应,计算机就可以找出一种能正确生成出这些反应的最简算法,完全模仿人类的行为。
数学证明可以全部交给计算机解决:寻找一个反例将变得和验证一个反例一样简单,一切错误的猜想都将瞬间被推翻。
任何密码算法都将成为徒劳:计算机可以通过一大批明文密文样本推算出生成密文的算法。