文章目录
一、什么是NP问题
【强烈推荐】什么是P=NP问题?
参考URL: https://zhuanlan.zhihu.com/p/143003261
谈谈计算机中的NP,NP-Hard,NP完全以及"NP=P?"问题
参考URL: https://www.bilibili.com/video/BV1Wz4y1d7wb?from=search&seid=17069712980402004069
【计算机原理2】P=?NP和复杂度理论
参考URL: https://www.bilibili.com/video/BV1t54y1y7KN
在理解 QAP 之前,我们先来了解一下什么是 P 问题。
- P问题是什么?
- NP问题又是什么?
- P=NP又是什么意思?
- 研究并解决P=NP问题的意义是什么?
斯蒂芬·库克和列昂尼德·莱文在1971年独立地提出了P(即容易找到)和NP(即容易检查)问题。
P问题和NP问题的主要特征:
-
P 问题(easy to find)
all problems solvable, deterministically, in polynomial time
译:多项式时间内可解决的问题(当然在多项式时间是可验证的) -
NP 问题(esay to check)
non-deterministic Polynomial time
译:非确定性多项式时间可解决的问题
举几个例子来加深印象:
计算1-1000的连续整数之和:这个问题就比较简单,无论是编程还是使用高斯求和公式都可以在有限可接受的时间内完成,这种算是P类问题。
计算地球上所有原子个数之和:这个问题就很困难甚至无解,但是现在有个答案是300个,显然是错的,所以很容易验证但不容易求解,这种算NP类问题。
P类问题是可以在多项式时间内解决并验证的一类问题,NP类问题是可以多项式时间验证但是不确定能否在多项式时间内解决的一类问题。
1. 多项式时间
【强烈推荐】什么是P=NP问题?
参考URL: https://zhuanlan.zhihu.com/p/143003261
多项式时间(英语:Polynomial time)在计算复杂度理论中,指的是一个问题的计算时间不大于问题大小的多项式倍数。任何抽象机器都拥有一复杂度类,此类包括可于此机器以多项式时间求解的问题。
其实多项式时间的概念我们还是很熟悉的,在做算法题或者日常工作时我们都会说,这个解法的时间复杂度是O(n^2)性能不是很好,那个解法的时间复杂度是O(nlogn)(注:计算机中的log一般指底数=2)还可以。
这里的大O就是时间复杂度的表示法,看到这里仿佛清晰一些了,不过还是看下多项式表达:
多项式的概念我们在小学初中的时候就开始接触了,对于计算机来说有更特别的含义,我们都知道算法时间复杂度的大O表示法,取表达式中的最高次其他项忽略,因为随着输入规模的增大最高次的影响最大,对计算机来说可以做这样的近似处理,比如上面的多项式表达式可以理解为O(n^k)的复杂度。
这个世界并不是只有多项式时间这么简单,我们还知道有指数函数形如 2 n 2^n 2n 这个计算量已经非常可怕,更不要说 n n n^n nn和 n ! n! n!这种问题了。
对于计算机而言,它不知道问题难不难,对它而言就是拆解成非常多的步骤去执行,去衡量计算机认为难或者不难或许可以从其执行时间来看,在排除代码实现差异来说,执行时间越长的问题通常都会比较难。
直观感受一下,随着不同输入规模下,多项式时间和非多项式时间的时间消耗曲线差异吧:
看到这里恍然大悟,多项式时间内可解决的意义所在。
- 多项式时间是算法复杂度的一个概念。
- 问题元素为n时,若完成算法的指令条数为n的k次方(k为常数),那么这个算法是多项式时间算法。
- 比如冒泡排序的时间复杂度是n的平方,就是一个多项式时间算法。
- 如果指令条数为k的n次方或者