17-P类问题和NP类问题.
- 格式:ppt
- 大小:1.73 MB
- 文档页数:23
这或许是众多OIer最大的误区之一。
你会经常看到网上出现“这怎么做,这不是NP问题吗”、“这个只有搜了,这已经被证明是NP问题了”之类的话。
你要知道,大多数人此时所说的NP问题其实都是指的NPC问题。
他们没有搞清楚NP问题和NPC问题的概念。
NP问题并不是那种“只有搜才行”的问题,NPC问题才是。
好,行了,基本上这个误解已经被澄清了。
下面的内容都是在讲什么是P 问题,什么是NP问题,什么是NPC问题,你如果不是很感兴趣就可以不看了。
接下来你可以看到,把NP问题当成是NPC问题是一个多大的错误。
还是先用几句话简单说明一下时间复杂度。
时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。
也就是说,对于高速处理数据的计算机来说,处理某一个特定数据的效率不能衡量一个程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序运行时间是否还是一样,或者也跟着慢了数百倍,或者变慢了数万倍。
不管数据有多大,程序处理花的时间始终是那么多的,我们就说这个程序很好,具有O(1)的时间复杂度,也称常数级复杂度;数据规模变得有多大,花的时间也跟着变得有多长,这个程序的时间复杂度就是O(n),比如找n个数中的最大值;而像冒泡排序、插入排序等,数据扩大2倍,时间变慢4倍的,属于O(n^2)的复杂度。
还有一些穷举类的算法,所需时间长度成几何阶数上涨,这就是O(a^n)的指数级复杂度,甚至O(n!)的阶乘级复杂度。
不会存在O(2*n^2)的复杂度,因为前面的那个“2”是系数,根本不会影响到整个程序的时间增长。
同样地,O (n^3+n^2)的复杂度也就是O(n^3)的复杂度。
因此,我们会说,一个O(0.01*n^3)的程序的效率比O(100*n^2)的效率低,尽管在n很小的时候,前者优于后者,但后者时间随数据规模增长得慢,最终O(n^3)的复杂度将远远超过O(n^2)。
我们也说,O(n^100)的复杂度小于O(1.01^n)的复杂度。
什么是P问题、NP问题和NPC问题这或许是众多OIer最大的误区之一。
你会经常看到网上出现“这怎么做,这不是NP问题吗”、“这个只有搜了,这已经被证明是NP问题了”之类的话。
你要知道,大多数人此时所说的NP问题其实都是指的NPC问题。
他们没有搞清楚NP问题和NPC问题的概念。
NP问题并不是那种“只有搜才行”的问题,NPC问题才是。
好,行了,基本上这个误解已经被澄清了。
下面的内容都是在讲什么是P问题,什么是NP问题,什么是NPC 问题,你如果不是很感兴趣就可以不看了。
接下来你可以看到,把NP问题当成是NPC问题是一个多大的错误。
还是先用几句话简单说明一下时间复杂度。
时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。
也就是说,对于高速处理数据的计算机来说,处理某一个特定数据的效率不能衡量一个程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序运行时间是否还是一样,或者也跟着慢了数百倍,或者变慢了数万倍。
不管数据有多大,程序处理花的时间始终是那么多的,我们就说这个程序很好,具有O(1)的时间复杂度,也称常数级复杂度;数据规模变得有多大,花的时间也跟着变得有多长,这个程序的时间复杂度就是O(n),比如找n个数中的最大值;而像冒泡排序、插入排序等,数据扩大2倍,时间变慢4倍的,属于O(n^2)的复杂度。
还有一些穷举类的算法,所需时间长度成几何阶数上涨,这就是O(a^n)的指数级复杂度,甚至O(n!)的阶乘级复杂度。
不会存在O(2*n^2)的复杂度,因为前面的那个“2”是系数,根本不会影响到整个程序的时间增长。
同样地,O (n^3+n^2)的复杂度也就是O(n^3)的复杂度。
因此,我们会说,一个O(0.01*n^3)的程序的效率比O(100*n^2)的效率低,尽管在n很小的时候,前者优于后者,但后者时间随数据规模增长得慢,最终O(n^3)的复杂度将远远超过O(n^2)。
第9章怎样研究算法:遗传算法示例1、P类问题、NP类问题、NPC类问题是计算机科学领域关于可求解性可计算性很重要的概念。
关于P、NP和NPC类问题,回答下列问题。
(1)下列说法不正确的是_____。
(A) P类问题是计算机可以在有限时间内能够求解的问题;(B) NP类问题是计算机可以在有限时间内能够验证“解”的正确性的问题;(C) NPC类问题是对问题的每一个可能解,计算机都可以在有限时间内验证“解”的正确性的问题,被称为NP完全问题;(D)上述说法有不正确的;答案:D解释:本题考核P类问题、NP类问题、NPC类问题的概念。
P类问题指计算机可以在有限时间内求解的问题,(A)正确;NP类问题指虽然在多项式时间内难于求解但不难判断给定一个解的正确性问题,(B)正确;NPC问题指NP问题的所有可能答案都可以在多项式时间内进行正确与否的验算,称为NP-Complete问题,(C)正确;(A)(B)(C)都正确,所以(D)错误。
具体内容请参考第九章视频之“可求解与难求解问题”以及第九章课件。
(2)可解性问题是指能够找到多项式时间复杂性算法进行求解的问题,难解性问题是指找不到多项式时间复杂性算法进行求解的问题。
下列说法不正确的是_____。
(A) P类问题是可解性问题,NP类问题是难解性问题。
(B) NP类问题不一定是难解性问题,因为P类问题也一定是NP类问题;(C) NP类问题不确定是否是P类问题,但NPC类问题一定是难解性问题;(D)上述说法有不正确的;答案:A解释:本题考核对可解性问题和难解性问题概念的理解。
P类问题指计算机可以在有限时间内求解的问题,所以是可解性问题;NP类问题指虽然在多项式时间内难于求解但不难判断给定一个解的正确性问题,但P类问题是NP类问题的一个子集,所以NP类问题不一定是难解性问题;NPC问题指NP问题的所有可能答案都可以在多项式时间内进行正确与否的验算,称为NP-Complete问题,是难解性问题,综上,(A)错误。
P问题、NP问题、NP完全问题和NP难问题在讲P类问题之前先介绍两个个概念:多项式,时间复杂度。
(知道这两概念的可以⾃动跳过这部分)1、多项式:axn-bxn-1+c恩....就是长这个样⼦的,叫x最⾼次为n的多项式....咳咳,别嫌我啰嗦。
有些⼈说不定还真忘了啥是多项式了。
例如第⼀次看到的鄙⼈→_→2、时间复杂度我们知道在计算机算法求解问题当中,经常⽤时间复杂度和空间复杂度来表⽰⼀个算法的运⾏效率。
空间复杂度表⽰⼀个算法在计算过程当中要占⽤的内存空间⼤⼩,这⾥暂不讨论。
时间复杂度则表⽰这个算法运⾏得到想要的解所需的计算⼯作量,他探讨的是当输⼊值接近⽆穷时,算法所需⼯作量的变化快慢程度。
举个例⼦:冒泡排序。
在计算机当中,排序问题是最基础的,将输⼊按照⼤⼩或其他规则排好序,有利于后期运⽤数据进⾏其他运算。
冒泡排序就是其中的⼀种排序算法。
假设⼿上现在有n个⽆序的数,利⽤冒泡排序对其进⾏排序,①⾸先⽐较第1个数和第2个数,如果后者>前者,就对调他们的位置,否则不变②接着⽐较第2个数和第3个数,如果后者>前者,就对调他们的位置,否则不变③⼀直向下⽐较直到第n-1和第n个数⽐较完,第⼀轮结束。
(这时候最⼤的数移动到了第n个数的位置)④重复前三步,但是只⽐较到第n-1个数(将第⼆⼤的数移动到第n-1个数位置)⑤持续每次对越来越少的元素重复上⾯的步骤,直到没有任何⼀对数字需要⽐较。
举个实例:5,4,3,2,1,对其进⾏排序,先是⽐较5跟4变成4,5,3,2,1,第⼀轮结束后变成43215,可以计算,当对其排序完正好要经过4+3+2+1=10次⽐较,当然这是最复杂的情况,即完全反序。
可以知道对于n个数,⾄多要经过1+2+...+n-1即(n^2-n)/2次⽐较才能排好序。
这个式⼦⾥n的最⾼次阶是2,可知道当n→∞时,⼀次性对其⽐较次数影响很⼩,所以我们把这个算法的时间复杂度⽐作:o(n^2)。
取其最⾼次,可以看出,这是⼀个时间复杂度为多项式的表⽰⽅式。
NP问题综述摘要:N和NP问题作为理论计算机科学的核心问题,其声名早已经超越了这个领域。
它是Clay 研究所的七个百万美元大奖问题之一,在2006国际数学家大会上,它是某个1小时讲座的主题。
从数学的角度来说,它和其他历史上有名的数学问题一样,给与人们一个智力上重大的挑战。
而更为重要的是,在无数与计算有关的的学术领域中,NP-完全问题以各种不同形式层出不穷。
因此,这并不是一个纯粹的与世独立的智力游戏,而是对计算机科学有全面影响力的问题。
那究竟什么是N和NP问题呢?关键词:一、P类问题与NP类问题概念:为了了解NP难度问题,我们首先得了解什么是P类问题,什么是NP类问题,而在此之前,我们得知道问题的复杂性和算法的复杂性的区别,下面只考虑时间复杂性。
算法的复杂性是指解决问题的一个具体的算法的执行时间,这是算法的性质;问题的复杂性是指这个问题本身的复杂程度,是问题的性质。
比如对于排序问题,如果我们只能通过元素间的相互比较来确定元素间的相互位置,而没有其他的附加可用信息,则排序问题的复杂性是O(nlgn),但是排序算法有很多,冒泡法是O(n^2),快速排序平均情况下是O(nlgn)等等,排序问题的复杂性是指在所有的解决该问题的算法中最好算法的复杂性。
问题的复杂性不可能通过枚举各种可能算法来得到,一般都是预先估计一个值,然后从理论上证明。
下面引入P类问题的概念:如果一个问题可以找到一个能在多项式的时间里解决它的算法,那么这个问题就属于P问题。
接下来引入NP问题的概念。
这个就有点难理解了,或者说容易理解错误。
在这里强调,NP问题不是非P类问题。
NP问题是指可以在多项式的时间里验证一个解的问题。
NP问题的另一个定义是,可以在多项式的时间里猜出一个解的问题。
简单了说P指确定型图灵机上的具有多项式算法的问题集合,NP指非确定型图灵机上具有多项式算法的问题集合。
举例说明什么是NP问题,有些问题很难找到多项式时间的算法(或许根本不存在),比如找出无向图中的哈米尔顿回路问题,但是我们发现如果给了我们该问题的一个答案,我们可以在多项式时间内判断这个答案是否正确。
P问题、NP问题、NPC问题的概念这或许是众多OIer最大的误区之一。
你会经常看到网上出现“这怎么做,这不是NP问题吗”、“这个只有搜了,这已经被证明是NP问题了”之类的话。
你要知道,大多数人此时所说的NP问题其实都是指的NP C问题。
他们没有搞清楚NP问题和NPC问题的概念。
NP问题并不是那种“只有搜才行”的问题,NPC 问题才是。
好,行了,基本上这个误解已经被澄清了。
下面的内容都是在讲什么是P问题,什么是NP问题,什么是NPC问题,你如果不是很感兴趣就可以不看了。
接下来你可以看到,把NP问题当成是NPC问题是一个多大的错误。
还是先用几句话简单说明一下时间复杂度。
时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。
也就是说,对于高速处理数据的计算机来说,处理某一个特定数据的效率不能衡量一个程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序运行时间是否还是一样,或者也跟着慢了数百倍,或者变慢了数万倍。
不管数据有多大,程序处理花的时间始终是那么多的,我们就说这个程序很好,具有O(1)的时间复杂度,也称常数级复杂度;数据规模变得有多大,花的时间也跟着变得有多长,这个程序的时间复杂度就是O(n),比如找n个数中的最大值;而像冒泡排序、插入排序等,数据扩大2倍,时间变慢4倍的,属于O(n^2)的复杂度。
还有一些穷举类的算法,所需时间长度成几何阶数上涨,这就是O(a^n)的指数级复杂度,甚至O(n!)的阶乘级复杂度。
不会存在O(2*n^2)的复杂度,因为前面的那个“2”是系数,根本不会影响到整个程序的时间增长。
同样地,O(n^3+n^2)的复杂度也就是O(n^3)的复杂度。
什么是P、NP、NPC、NP优化问题在磕盐的时候经常会遇到,其中经常涉及到某某问题是NP的之类的论断,因此花了一点时间整理了一下NP问题的相关知识,在研究过程中看到一篇很好的文章,因此下面的整理主要基于这篇文章《什么是P问题、NP问题和NPC问题》,有兴趣的同学可以仔细阅读原文,时间紧张的话可以直接看下面我整理的内容。
author: @Huji预备知识时间复杂度表明问题规模扩大后,程序需要的时间长度增长得有多快。
程序的时间复杂度一般可以分为两种级别:- 多项式级的复杂度,如O(1),O(log(n))、O(n^a)等,- 非多项式级的,如O(a^n)、O(n!)等。
后者的复杂度计算机往往不能承受。
约化(Reducibility)简单的说,一个问题A可以约化为问题B的含义是,可以用问题B的解法解决问题A。
(个人感觉也就是说,问题A是B的一种特殊情况。
)标准化的定义是,如果能找到一个变化法则,对任意一个A 程序的输入,都能按照这个法则变换成B程序的输入,使两程序的输出相同,那么我们说,问题A可以约化为问题B。
例如求解一元一次方程这个问题可以约化为求解一元二次方程,即可以令对应项系数不变,二次项的系数为0,将A的问题的输入参数带入到B问题的求解程序去求解。
另外,约化还具有传递性,A可以化约为B,B可以约化为C,那么A也可以约化为C。
基本概念•P Problem: 对于任意的输入规模n,问题都可以在n的多项式时间内得到解决;•NP(Non-deterministic Polynomial)Problem: 可以在多项式的时间里验证一个解的问题;•NPC(Non-deterministic PolynomialComplete) Problem: 满足两个条件 (1)是一个NP问题(2)所有的NP问题都可以约化到它•NP-Hard Problem: 满足NPC问题的第二条,但不一定要满足第一条详解P Problem如果一个问题可以找到一个能在多项式的时间里解决它的算法,那么这个问题就属于P问题,即算法的时间复杂度是多项式级的。