关于P, NP, NPC, NPH名词的解释, 网上的文章很多都是太长太专业或读不懂, 这里简单快速的整理一下我的理解,
可能不够专业准确, 但是能帮助你快速理解, 形成认知上的概念
为了理解这几个名词, 先要说明时间复杂度 和 多项式时间的概念
时间复杂度O ( n ? ) O(n?)O(n?)用来评估算法的计算工作量的大小, 通常写成n的某种数学表达式, 其中n nn代表输入数据数量
它可以是多项式(常数乘法次方等)
1 ,n ,log n,n2,n3
也可以是非多项式(指数阶乘等)
2 n ,n!
其计算量层级大小关系如图,
O ( 1 ) < O ( log n ) < O ( n ) < O ( n log n ) < O ( n2 ) < O ( n3 ) < O ( 2n ) < O ( n ! )
多项式形式就是我们中学数学用笔算的那些, 通常可以在有限的时间内计算出结果, 也叫做在多项式时间内解决
而非多项式的计算量, 会在n增大时爆发式增长,无法在有限的时间内纯靠跑完计算得出结果
举个简单的例子
假设n = 100 n=100n=100,
多项式n 2 = 10 0 2 = 10000 n^{2}=100^{2}=10000n2=1002=10000就是个口算题
非多项式2 n = 2 100 ≈ 1.26765 ∗ 1 0 30 2^{n}=2^{100}\approx1.26765*10^{30}2n=2100≈1.26765∗1030
这个数字有多大呢? 世界上最快的超级计算机(截止2020年11月TOP500数据)每秒计算量也才堪堪达到4.42 ∗ 1 0 17 4.42*10^{17}4.42∗1017, 大概要跑9万年, 这个计算量的算法肯定是不可取的
P问题: 能找到在多项式时间里解决它的算法
能到找一个算法, 即使n很大, 也能在有限的时间内跑完, 求出最佳答案的
简单而言就是我们现在能算出最优解的,
NP问题: 能在多项式时间里验证它的答案
不能确定是否在多项式时间内找到答案,但是可以在多项式时间内验证答案是否正确
简单而言就是你随便瞎蒙个答案, 要判断这个答案对不对, 我还是能做到的
由上面两个概念可以得出:P ∈ N P P \in NPP∈NP
因为能多项式地解决一个问题,必然能多项式地验证一个问题的解
NPC(NP-Complete/NP完全):
1. 所有的NP问题都可以reduce到某个问题C,
2. 且C是NP问题。
reduce是指Reducibility(约化/归约),如果问题A可以约化为问题B,那么用B的解法就可以解决A(或者说问题A可以“变成”问题B)
也就是说如果NPC问题解决了(或者也叫做NPC问题发现了多项式级的算法),任意NP问题都可以套用该方法解决。NPC能强悍到能通解NP,那么它自然是NP问题中最难的那一部分。
NPH问题(NP-Hard/NP难):
1. 所有的NP问题都可以reduce到某个问题H,
2. 但H不一定是NP问题。
即使NPC问题解决了,NPH问题有可能仍然无法得到多项式级的算法,也就是说NPH至少是NPC,甚至是比NPC更难的问题。
对于NP最终能否等于P,目前还是存在争议等待被验证的问题。
所以暂定P!=NP,则P, NP, NPC, NPH的关系图,根据之前的描述如下
2021-07-16 今天读到《数学之美》,附录里面就提到了于计算复杂度,依照里面的描述,略微补充之前的措辞。书里也同样也有一张和下图意思一致的插图(P!=NP情况下)。
就旅行商问题而言,
如果求解内容不同也可能变成不同问题
求解 | 问题属于 | 备注 |
---|---|---|
求相邻最近的两个地点 | P问题 | 循环套循环, 得出所有两点间的距离, 时间复杂度O(n 2 n^2n2) |
求途经所有地点行程小于500公里的路径 | NP问题 | 虽然没有好的算法, 但是给我一个路径我还是能告诉你是否小于500公里的 |
求途经所有地点的最短路径 | NPH问题 | 即使你给我一条路径, 我也不能判定它就一定是最短的 |