首先P问题、NP问题、NP-complete问题和NP-hard问题属于一条基础线上的几个问题,应该一起讲述(第一部分)。
Sharp-P(#P)问题常常与NP问题放到一起讨论,应该在第二部分讲述。
本博客旨在总结计算机研究中可能遇到的几类问题,以便已经学习过计算理论的同学在回顾知识的时候查阅。如果未学过计算理论,本博客对您的帮助可能不大。如果总结有错误,欢迎指出
一、P问题、NP问题、NP-complete问题和NP-hard问题
P类问题:
在多项式时间内可以解的问题。(可以找到多项式级复杂度的算法来解决的问题)
NP问题:
在多项式时间内可以验证的问题。(在多项式时间内验证得出一个正确解的问题)
P类问题是NP类问题的子集(存在多项式时间解法的问题,总能在多项式时间内验证它)
NP-complete问题:
一个问题是NP-complete问题,需要满足两个条件,当且仅当:
- 这个问题是NP问题。
- NP问题中任何一个问题都可以在多项式时间内归约成这个问题。(即规约算法的时间复杂度要在多项式时间之内)
NP-hard问题:
满足NPC问题的第二个条件的问题就是NP-hard问题,即NP问题中任何一个问题都可以多项式时间归约成这个问题,这个问题就是NP-hard问题。
即所有的NP问题都能约化到它,但是它不一定是一个NP问题。NP-Hard问题要比NP-complete问题的范围广。
二、Sharp-P(#P)问题与NP问题、Sharp-P-complete问题与NP-complete问题
NP问题的定义没有谈到任何关于求解的问题,只是所说:多项式时间内验证其解是否正确。比如: 我们给一个0-1背包的解,就可以在多项式时间内验证是否满足条件。至于是否能找到满足条件的解,这在NP复杂度里没有规定。
Sharp-P(#P)问题:
Sharp-P (#P)的定义是在 NP 问题中查找问题的解决方案数量的问题。换言之,拿到一个NP问题后,我们不要问有没有,改问有多少,就会转化成一个Sharp-P (#P)的问题。 比如:0-1背包问有没有这样的方法让一个背包的获益大于某个参数,而负重小于一个参数;这是 NP问题。但是如果我问,有多少种方法让背包中的物品满足这个条件,那就是Sharp-P (#P)问题。
由此可见,Sharp-P (#P)问题比NP更加复杂。
Sharp-P-complete (#P-complete)问题:
NP-complete的问题首先是一个NP问题,其次所有的NP问题都能在多项式时间内与它完成归约。
Sharp-P-complete (#P-complete)的问题首先是一个#P问题, 然后所有的#P问题能在多项式时间内采用一个图灵机与它完成归约。
Sharp-P-Hard(#P-Hard)问题:
一个问题是#P-Hard问题,需要满足一个条件,当且仅当:所有 #P 类问题都可以在多项式时间内归约为这个问题。
并且:
1.#P-hard 问题不一定属于 #P 类,因为 #P 类的问题必须是计数问题,而 #P-hard 问题可以是更一般的形式。
2.#P-complete 问题既是 #P-hard 问题,也是属于 #P 问题。
参考资料:
[1] https://www.cnblogs.com/longdouhzt/archive/2011/11/03/2235141.html