上次开组会,听师姐在讲解她的论文,提到了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问题:TSP
售货员旅行问题 (traveling salesman problem),是最具有代表性的NP问题之一。假设一个推销员需要从香港出发,经过广州,北京,上海,…,等 n 个城市, 最后返回香港。 任意两个城市之间都有飞机直达,但票价不等。现在假设公司只给报销 C 块钱,问是否存在一个行程安排,使得他能遍历所有城市,而且总的路费小于 C?
推销员旅行问题显然是 NP 的。因为如果你任意给出一个行程安排,可以很容易算出旅行总开销。但是,要想知道一条总路费小于 C 的行程是否存在,在最坏情况下,必须检查所有可能的旅行安排! 这将是个天文数字。
这个天文数字到底有多大?目前的方法接近一个一个的排着试,还没有找到更好可以寻得最短路径的方法。对七个城而言,共有 6!=720 个排法,还比较简单;,但若有 20 个城,则排法就有 19! 种。因故在排列组合里 n! 写起来轻松。但 1.21∗10171.21∗1017 是一个大得不得了的数字。若每秒钟排一次,要排 3.84∗1093.84∗109 年(一年约为 3.15∗1073.15∗107 秒),即使使用计算器,每秒排一百万次(不容易做到)也得重做三千年才能找到答案。「生也有涯,知也无涯」,想不到区区二十个城,要三十个世纪才能找到答案。
具体的来龙去脉下面这位大神讲的很清楚: