什么是计算复杂度、P问题、NP问题和NP-C问题

首先时间复杂度的概念。时间复杂度并不是用来表示一个程序解决问题需要花费多长时间。而是当问题规划扩大,数据量增加后,程序需要的运行时间增长有多快。

  1. 若不管数据量有多大,花费的时间始终是一样多的,那么成具有O(1)的时间复杂度。
  2. 若数据量增加多少,花的时间随之增加多长,两者存在线性关系,则称O(n)。例如找出n个数中的最大值。
  3. 像冒泡排序、插入排序等,数据扩大2倍,时间变为4倍,属于O(n^2)
  4. 一些穷举类算法,所需时间长度呈几何阶数上涨,这就是O(a^n)、O(n!)

于是进行分类:

多项式级的复杂度:O(1)、O(n)、O(n^a),因为它们的规模n出现在底数的位置。
非多项式级的复杂度:O(a^n)、O(n!)。其复杂度计算机往往不能承受。

在运筹学的复杂性理论中,有两类标准问题:

  1. 判定问题:让程序解决一个问题,程序输出yes/no。
  2. 优化问题:寻找一个最优解。

下面引出P问题的概念:

如果一个问题可以找到一个能在多项式时间内解决它的算法,那么这个问题就属于P问题。

NP问题:

可以在多项式的时间内验证一个解的问题。另一个定义是:可以在多项式时间内猜出一个解的问题。

显然,P问题属于NP问题。能多项式时间内找到一个解的问题,必然能在多项式时间内验证一个问题的解。

但是,P=NP是否成立?此问题还未被解答。但NPC问题的存在使得多数人相信,不成立。

为了说明NPC问题。下面引入约化问题。

约化问题:如果能找到这样一个变化法则,对任意一个程序A的输入,都能按这个法则变换成程序B的输入,使两程序的输出相同,那么我们说,问题A可约化为问题B。

当然,我们所说的“可约化”是指的可“多项式地”约化(Polynomial-time Reducible),即变换输入的方法是能在多项式的时间里完成的。约化的过程只有用多项式的时间完成才有意义。

B的时间复杂度高于或者等于A的时间复杂度。

约化具有一项重要的性质:约化具有传递性。如果问题A可约化为问题B,问题B可约化为问题C,则问题A一定可约化为问题C。

好了,从约化的定义中我们看到,一个问题约化为另一个问题,时间复杂度增加了,问题的应用范围也增大了。通过对某些问题的不断约化,我们能够不断寻找复杂度更高,但应用范围更广的算法来代替复杂度虽然低,但只能用于很小的一类问题的算法。再回想前面讲的P和NP问题,联想起约化的传递性,自然地,我们会想问,如果不断地约化上去,不断找到能“通吃”若干小NP问题的一个稍复杂的大NP问题,那么最后是否有可能找到一个时间复杂度最高,并且能“通吃”所有的 NP问题的这样一个超级NP问题?答案居然是肯定的。也就是说,存在这样一个NP问题,所有的NP问题都可以约化成它。换句话说,只要解决了这个问题,那么所有的NP问题都解决了。这种问题的存在难以置信,并且更加不可思议的是,这种问题不只一个,它有很多个,它是一类问题。这一类问题就是传说中的NPC 问题,也就是NP-完全问题。NP-C问题的出现使整个NP问题的研究得到了飞跃式的发展。我们有理由相信,NPC问题是最复杂的问题。人们想表达一个问题不存在多项式的高效算法时应该说它“属于NPC问题”。

同时满足下面两个条件的问题就是NP-C问题

NP-C问题(非确定性多项式时间完备问题):首先,它得是一个NP问题;然后,所有的NP问题都可以约化到它。

证明一个问题是 NP-C问题也很简单。先证明它至少是一个NP问题,再证明其中一个已知的NPC问题能约化到它(由约化的传递性,则NP-C问题定义的第二条也得以满足;至于第一个NP-C问题是怎么来的,不作介绍),这样就可以说它是NPC问题了。

既然所有的NP问题都能约化成NPC问题,那么只要任意一个NPC问题找到了一个多项式的算法,那么所有的NP问题都能用这个算法解决了,NP也就等于P 了。因此,给NPC找一个多项式算法太不可思议了。因此,前文才说,“正是NPC问题的存在,使人们相信P≠NP”。我们可以就此直观地理解,NPC问题目前没有多项式的有效算法,只能用指数级甚至阶乘级复杂度的搜索。

NP-Hard问题:满足NPC问题定义的第二条但不一定要满足第一条(就是说,NP-Hard问题要比 NPC问题的范围广)。NP-Hard问题同样难以找到多项式的算法,但它不列入我们的研究范围,因为它不一定是NP问题。即使NPC问题发现了多项式级的算法,NP-Hard问题有可能仍然无法得到多项式级的算法。事实上,由于NP-Hard放宽了限定条件,它将有可能比所有的NPC问题的时间复杂度更高从而更难以解决。

参考资料:https://zhuanlan.zhihu.com/p/22497908

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值