1. P问题
P问题: 能在多项式时间内解决的问题
考虑时间复杂度,P问题的时间复杂度总是可以用多项式表示,或小于某多项式表示的。
例如冒泡排序算法,时间复杂度为
2. NP问题
NP问题: 不能在多项式时间内解决或不确定能不能在多项式时间内解决,但能在多项式时间验证的问题。
为什么是”不能或不确定能不能“呢,因为关于P是否等于NP,人类尚且没有统一的答案。但是人们现在普遍认为P不等于NP。
典型的NP问题如哈密顿回路问题:
天文学家哈密顿(William Rowan Hamilton) 提出,在一个有多个城市的地图网络中,寻找一条从给定的起点到给定的终点沿途恰好经过所有其他城市一次的路径。
可以证明,哈密顿回路问题是一个NP问题,人们往往要通过穷举这样笨拙的方法寻找问题的解,然而,显然我们可以在多项式时间内判断一个既定的解是否是正确的。
3. NPC问题
NPC问题:它是一个NP问题,且所有的NP问题都可以用多项式时间约化到它。更本质的理解,我们把规约看作一种偏序关系,那么NPC就是NP的上届。一句话,所有NP问题都不比NPC难。
首先解释一下规约的概念,如果能找到这样一个变化法则,对任意一个程序A的输入,都能按这个法则变换成程序B的输入,使两程序的输出相同,那么我们说,问题A可约化为问题B,即可以用问题B的解法解决问题A,或者说,问题A可以“变成”问题B。
例如A是求一元一次方程的解,B是求一元二次方程的解,A的输入参数是k和m,B的输入参数是a,b和c。
显然,我们可以令
可以看出,B的时间复杂度高于或者等于A的时间复杂度。也就是说,问题A不比问题B难。
显然,NPC问题是NP问题的一部分,如果P=NP成立,P,NP和NPC将重合在一起。
4. NPhard问题
NPHard问题:NPhard满足所有的NP问题都可以用多项式时间约化到它,但并不要求其是一个NP的问题。或者说,NPhard是所有问题的上届。也就是说,所有问题都不比NPhard难。(要不人家怎么叫NPhard呢)
可以看出,NPhard问题的范围比NPC的范围更大。
5. 可计算问题
可计算问题的边界是什么?
可以说,可计算问题包括了P,NP和NPC,但不限于NP问题。由NP的定义可以看出,NP的问题的解必须是在多项式时间内可以验证的,而显然存在这样的问题,即问题的解既不能在多项式时间内找到,也不能在多项式时间内验证。
理论上说,可计算问题的数目和自然数集的数目相当,可以用如下方法证明:任何可计算问题都可以被图灵机计算,图灵机的算法和数据由纸带给出,而纸带则是由0和1组成的序列,因此,所有可计算问题都可以和一个由0和1组成的序列对应。而0和1组成的序列可以被看做二进制数,二进制数和十进制数一一对应,因此可计算问题和自然数集等势。
6.不可计算问题
定义了可计算问题后,我们很自然的像尝试计数不可计算问题。但遗憾的是,不可计算问题是不可数的,它的势远大于可计算问题。
什么样的问题是不可计算的?一个典型的例子是,消除机器学习中过拟合的问题是不可计算问题,因为对于任意的学习问题,样本的特征空间是无穷的,同时我们无法得到样本的分布。回到之前图灵机的例子,我们没有办法把所有的输入都写在纸上,因为它是无穷的,所以我们没有办法彻底解决过拟合的问题。
7. 机器学习所解决的问题
想找到一个问题的贝叶斯最有决策器是NPhard的,因此我们往往需要通过设置阈值等方式使学习算法在合适的时间停止,从而得到问题的近似解。
同时,过拟合的出现是不可避免的,彻底解决过拟合是NPhard的。