NP难问题的概念
计算概论知识点总结
计算概论知识点总结一、基本概念1. 计算概论的概念计算概论是一门研究计算的基本理论和方法的学科。
它是计算机科学的基础,包括了算法、数据结构、分析技术、计算复杂性理论等内容。
计算概论的研究对象是计算的过程和方法,它研究计算机问题的抽象和形式化描述、计算机问题的求解方式、计算机问题求解的复杂性以及计算机问题求解的效率等问题。
2. 算法的概念算法是解决问题的一种有序的数学过程,它包括了从问题描述到问题求解的所有步骤。
算法是对问题求解的精确描述,是计算机问题求解的基础,因此算法的设计和分析是计算概论中的重要内容。
3. 数据结构的概念数据结构是一种用来组织和存储数据的方式,它包括了数据的逻辑组织和物理存储。
数据结构是算法的载体,它的设计和选择对算法的效率有很大的影响,因此数据结构的研究也是计算概论的重要内容之一。
4. 复杂性理论的概念复杂性理论是研究计算问题的复杂性和可解性的学科。
它研究计算问题求解的时间和空间资源的需求与问题规模之间的关系,同时也研究计算问题的难解性和不可解性等问题。
二、算法分析1. 时间复杂度算法的时间复杂度是描述算法在求解问题时所需的时间资源的度量。
它通常用算法的基本操作数量与问题规模的关系来描述。
时间复杂度是算法效率的重要指标,它决定了算法在不同规模的问题上所需的时间资源。
2. 空间复杂度算法的空间复杂度是描述算法在求解问题时所需的空间资源的度量。
它通常用算法所需的额外空间与问题规模的关系来描述。
空间复杂度是算法效率的另一个重要指标,它决定了算法在不同规模的问题上所需的空间资源。
3. 算法的渐进分析算法的渐进分析是描述算法复杂度的一种常用方法,它用来描述算法在问题规模趋近无穷时的复杂度情况。
渐进分析包括了最坏情况复杂度、平均情况复杂度和均摊情况复杂度等。
4. 算法的正确性算法的正确性是指算法对于所有输入数据都能得到正确的输出。
算法正确性是算法设计的基本要求,同时也是算法分析的关键内容。
np问题 通俗解释
np问题通俗解释
NP问题是指“非确定性多项式时间”问题,也称为不可解问题。
它是计算机科学中的一个重要问题类别。
通俗来说,NP问题是指那些可以在多项式时间内验证是否解
答正确的问题,但尚未找到可以在多项式时间内解决的算法。
也就是说,虽然我们可以在多项式时间内检查一个给定解是否正确,但我们目前还没有找到一种高效的方法来找到一个解。
在计算理论中,NP问题是与P问题相对的一个概念。
P问题
是指可以在多项式时间内解决的问题。
一个经典的例子是旅行商问题。
在旅行商问题中,我们需要找到一条路径,使得旅行商可以经过多个城市,每个城市只到达一次,并且回到起点,同时总路径长度最短。
虽然我们可以在多项式时间内计算出给定路径的总长度,但当前还没有找到一种可以在多项式时间内找到最短路径的方法。
目前来说,还没有找到一种通用的解决NP问题的方法。
因此,研究人员一直在努力寻找解决这些问题的有效算法,或者找到一种方法来证明这些问题不存在多项式时间解决的算法。
NP的原理及定义和解释
NP的原理及定义和解释NP是非确定性多项式(Non-deterministic Polynomial)的简称,是计算机科学中的一个复杂性类。
NP问题是指可以在多项式时间内验证解的正确性的问题。
NP问题的解可以通过非确定性多项式算法在多项式时间内验证,但没有有效的多项式算法可以在多项式时间内求解。
因此,NP问题的求解是非常困难的,往往需要使用暴力或近似算法等方法。
定义:NP问题的定义可以分为两个方面:1. 证书存在性:对于一个给定的问题,如果存在一个证书(certificate),可以在多项式时间内验证其正确性,则该问题属于NP 问题。
2.多项式时间验证:对于给定的问题和一个潜在的解,可以在多项式时间内验证这个解是否是正确的。
NP问题的解法可以由以下两种形式描述:1.非确定性算法:对于一个给定的问题,非确定性算法可以通过猜测和尝试的方式,在多项式时间内找到问题的解。
这个算法可以通过多次猜测和尝试来验证潜在的解是否是正确的,但并没有给出一个确定性的步骤来找到解。
2.多项式时间验证算法:对于一个给定的问题和一个潜在的解,可以通过一个多项式时间的验证算法,验证这个解是否是正确的。
原理:NP问题的原理基于两个关键概念:证书存在性和多项式时间验证。
证书存在性是指对于一个给定的问题,存在一个证书(或称为证明)可以在多项式时间内验证其正确性。
证书可以是一组状态、数字、字符串等,通过这个证书可以验证一个给定的解是否正确。
这个证书可以被看作是一个“快速验证器”,它能够在多项式时间内验证问题的解的正确性。
多项式时间验证是指对于给定的问题和一个潜在的解,可以在多项式时间内验证这个解是否是正确的。
多项式时间验证算法可以通过一系列的计算和判断,来验证一个给定的解是否满足问题的条件。
这个验证算法的运行时间是一个多项式,在实际应用中可以被认为是“快速”的。
基于以上两个概念,可以得到一个重要的结论:如果一个问题是NP 问题,那么可以把它的解转换成一个证书,并使用多项式时间验证算法,来验证这个证书的正确性。
NP-Hard问题和NP-Complete问题
NP-Hard问题和NP-Complete问题对 NP-Hard问题和NP-Complete问题的⼀个直观的理解就是指那些很难(很可能是不可能)找到多项式时间的问题。
因此⼀般初学算法的⼈都会问这样⼀个问题:NP-Hard和NP-Complete有什么不同?简单的回答是根据定义,如果所有NP问题都可以多项式归约到问题A,那么问题A就是 NP-Hard;如果问题A既是NP-Hard⼜是NP,那么它就是NP-Complete。
从定义我们很容易看出,NP-Hard问题类包含了NP-Complete类。
但进⼀步的我们会问,是否有属于NP-Hard但不属于NP-Complete的问题呢?答案是肯定的。
例如停机问题,也即给出⼀个程序和输⼊,判定它的运⾏是否会终⽌。
停机问题是不可判的,那它当然也不是NP问题。
但对于SAT这样的NP-Complete问题,却可以多项式归约到停机问题。
因为我们可以构造程序A,该程序对输⼊的公式穷举其变量的所有赋值,如果存在赋值使其为真,则停机,否则进⼊⽆限循环。
这样,判断公式是否可满⾜便转化为判断以公式为输⼊的程序A是否停机。
所以,停机问题是NP-Hard⽽不是NP-Complete。
NP问题就是指其解的正确性可以在多项式时间内被检查的⼀类问题。
⽐如说数组求和,得到⼀个解,这个解对不对呢,显然是可以在多项式时间内验证的。
再⽐如说SAT,如果得到⼀个解,也是能在多项式时间内验证正确性的。
所以SAT和求和等等都是NP问题。
然后呢,有⼀部分NP问题的解已经可以在多项式时间内找到,⽐如数组求和,这部分问题就是NP中⽐较简单的⼀部分,被命名为P类问题。
那么P以外的NP问题,就是⽬前还不能够在多项式时间内求解的问题了。
会不会将来某⼀天,有⼤⽜发明了⽜算法,把这些问题都在多项式时间内解决呢?也就是说,会不会所有的NP问题,其实都是P类问题呢,只是⼈类尚未发现呢?NP=P吗?可想⽽知,证明NP=P的路途是艰难的,因为NP问题实在太多了,要⼀⼀找到多项式算法。
谈一谈如何理解NP问题
谈⼀谈如何理解NP问题⼀概念引⼊1.1时间复杂度在计算机处理⼀个问题时,往往需要⼀定的时间,假设把这个问题复杂化(将这个问题进⾏扩展),那么把计算机处理这类问题的时间变化速率,称为解决这种问题所⽤算法的时间复杂度。
例如,⼀个枚举⼀定范围内的数字的问题,计算机所⽤时间会随着范围的变化⽽线性变化,由于是简单的枚举,所以时间复杂度可以记为O(n),n可以代表这个范围⼤⼩。
在计算机处理问题时,由于算法设计不同,对应的时间复杂度也不⼀定相同。
1.2多项式级时间和⾮多项式级时间在众多的时间复杂度中,根据其表达式的特点,可以⼤致将它们划分为两个范畴,⼀个是多项式级⼀个是⾮多项式级。
它们各⾃表⽰什么意思呢?还记得⾼中数学中学习的函数吗,在学习不同函数时,最常做的⼀件事是观察它们的图像变化,可以发现,x作为底数的图像和x作为指数的图像在后期的变化简直有天壤之别。
这也正是需要将时间复杂度划分的原因(多项式级的时间复杂度在后期变化远⼩于⾮多项式级),将n作为底数的时间复杂度归为多项式级,n作为指数的归为⾮多项式级。
例如O(n)、O(log(n))、O(n^a)等就是多项式级的时间复杂度,像O(n!)和O(a^n)就是⾮多项式级的复杂度。
对于计算机来说需要处理的问题往往是很庞⼤的,如果采⽤⾮多项式级复杂度的算法,那么将浪费很⼤的资源。
1.3 P问题在解释了多项式级和⾮多项式级时间复杂度之后,P问题的概念就简单了。
对于众多的问题,通常把能够使⽤多项式级时间复杂度算法解决的问题称为P问题。
⼆什么叫NP问题2.1 约化⼀般,问题A可以约化为问题的B的解释是可以⽤解决问题B的⽅法解决问题A。
简单的说,也就是问题A是问题B的另⼀种形式,且问题A的复杂程度要⼩于等于问题B。
就像解⽅程组的问题,假如你会解⼆元⼀次⽅程组,那么你⼀定会解⼀元⼀次⽅程,在这个例⼦中,⼀元⼀次⽅程就是问题A,⼆元⼀次⽅程组就是问题B,问题A可以看作是问题B中另⼀个⾃变量系数为零的特殊“⼆元⼀次⽅程组”。
复杂度的量级分类
复杂度的量级分类复杂度的量级分类复杂度是算法分析中的一个重要概念,它用来描述算法运行时间或空间资源的需求。
通常情况下,我们使用“大 O 记号”(Big O Notation)来表示一个算法的复杂度。
在计算机科学中,我们将算法的复杂度分为不同的量级,以便于比较和评估不同算法之间的性能差异。
一、常数时间复杂度常数时间复杂度(O(1))指算法执行所需时间不随输入规模增加而增加。
例如,给定两个整数 a 和 b,计算它们的和 a+b 的时间复杂度是O(1),因为无论 a 和 b 的值如何变化,计算它们的和所需时间都是相同的。
二、线性时间复杂度线性时间复杂度(O(n))指算法执行所需时间随输入规模n 线性增长。
例如,在一个长度为 n 的数组中查找某个元素是否存在需要遍历整个数组,因此其时间复杂度是 O(n)。
三、对数时间复杂度对数时间复杂度(O(log n))指算法执行所需时间随输入规模 n 增加而增长但增长速率逐渐减慢。
例如,在一个有序数组中查找某个元素是否存在可以使用二分查找算法,其时间复杂度是 O(log n)。
四、平方时间复杂度平方时间复杂度(O(n^2))指算法执行所需时间随输入规模 n 的平方增长。
例如,在一个长度为 n 的数组中进行冒泡排序需要进行 n^2 次比较和交换操作,因此其时间复杂度是 O(n^2)。
五、指数时间复杂度指数时间复杂度(O(2^n))指算法执行所需时间随输入规模 n 指数级增长。
例如,在一个长度为 n 的集合中求其所有子集需要枚举所有可能的组合,因此其时间复杂度是 O(2^n)。
六、多项式时间复杂度多项式时间复杂度(O(n^k))指算法执行所需时间随输入规模 n 的 k 次幂增长。
例如,在一个长度为 n 的矩阵中进行矩阵乘法需要进行n^3 次乘法和加法操作,因此其时间复杂度是 O(n^3)。
七、指数级别的递归调用在某些情况下,递归调用会导致指数级别的运行时间。
例如,在斐波那契数列中,递归计算第n 个斐波那契数会导致指数级别的运行时间。
P问题、NP难问题详解
NPC问题(补充) 问题(补充) 问题
NPC问题存在吗 问题存在吗? 问题存在吗
•?
NPC问题(补充) 问题(补充) 问题
• 逻辑电路问题 给定一个逻辑电路,问是否存在一种输入 逻辑电路问题: 给定一个逻辑电路, 使输出为True。 使输出为 。 • 这是第一个 这是第一个NPC问题。其它的 问题。 问题 其它的NPC问题都是由这个问题约 问题都是由这个问题约 化而来的。因此,逻辑电路问题是NPC类问题的“鼻祖”。 类问题的“ 化而来的。因此,逻辑电路问题是 类问题的 鼻祖” • 我们知道,一个逻辑电路由若干个输入,一个输出,若干 我们知道,一个逻辑电路由若干个输入,一个输出, 逻辑门”和密密麻麻的线组成,如下图: “逻辑门”和密密麻麻的线组成,如下图: •
浅谈P问题、NP问题、 NPC问题及NP难问题
王培磊
Contents
1 2 3 4
P问题 问题
NP问题、 问题、 问题
NPC问题 问题
NP难问题 难问题
时间复杂度
• 时间复杂度并不是表示一个程序解决问题需要花多少时间, 而是当问题规模扩大后,程序需要的时间长度增长得有多 快。 • 不管数据有多大,程序处理花的时间始终是那么多的,我 们就说这个程序很好,具有O(1)的时间复杂度,也称常数 级复杂度;数据规模变得有多大,花的时间也跟着变得有 多长,这个程序的时间复杂度就是O(n)。
NPC问题(补充) 问题(补充) 问题
• 有输出无论如何都不可能为 有输出无论如何都不可能为True的逻辑电路吗? 的逻辑电路吗? 的逻辑电路吗
NPC问题(补充) 问题(补充) 问题
其大概意思是说任意一个NP问题的 其大概意思是说任意一个 问题的 输入和输出都可以转换成逻辑电路 的输入和输出( 的输入和输出(想想计算机内部也 的运算), 不过是一些 0和1的运算),因此对 和 的运算),因此对 于一个NP问题来说 问题来说, 于一个 问题来说,问题转化为了 求出满足结果为True的一个 求出满足结果为 的一个 输 即一个可行解)。 入(即一个可行解)。 • 逻辑电路问题属于NPC问题——它显然属于NP问题,并且 可以证明所有的NP问题都可以约化到它 。
世界七大数学难题之NP问题的证明(NP≠P)和一些相关知识
世界七大数学难题之NP问题的证明(NP≠P)和一些相关知识摘要:本文提出算法公理:公理目标集合不存在非约化约简;判断某类公理待被判断集合问题所需的计算复杂度类最少操作次数,一定大于或等于相应公理目标集合被最简约化后的操作类二级元素的数量。
基于算法公理和本文提出的单点连入问题,本文证明了NPC问题都不存在多项式算法,因此NPC∉P,NP≠P。
关键词:算法公理;单点连入问题;NPC问题;多项式算法;NP≠P第一章定义定义1:“对于一条以A1点为起点、A n点为终点的路、处在该路之外的B点和该路中的两个以上非路上相邻点与B点之间的边来讲,是否存在一种连接方式使该路和该点能够被合并成一条新的以A1点为起点、A n点为终点的路”这一问题又被称为单点连入问题,其中A1点与A n点不同时与B点相连。
上述“路上相邻”指在仅考虑路上的点和边时的相邻;非路上相邻点(边)指除路上相邻点(边)之外的点(边)。
上述路又被称为待连路;上述点又被称为待连点。
上述“被合并成一条新的以A1点为起点、A n点为终点的路”又被称为被连入。
上述“存在一种连接方式使该路和该点能够被合并成一条新的以A1点为起点、A n点为终点的路”又被称为能使待连点被连入;反之则又被称为不能使待连点被连入。
由单点连入问题的所有点和所有边所构成的图又被称为该单点连入问题图。
定义2:待连路的起点又被称为待连路的左固定点或左端点;待连路的终点又被称为待连路的右固定点或右端点;两者又被合称为待连路的固定点和端点。
待连路中除固定点之外的点又被称为待连路的非固定点。
待连路中路上相邻两点之间的边又被称为待连路的内边;待连路中非路上相邻两点之间的边又被称为待连路的外边;待连点被连入后的新路中相应地也有内边和外边。
待连点与待连路中的点之间的边又被称为待连边。
定义3:待连路的起点又被称为该待连路的第1个点;待连路的起点之后的第1个点又被称为该待连路的第2个点;相应地有该待连路的第3个点等。
nphard问题的解释
nphard问题的解释
NP-hard问题是计算复杂性理论中的一个重要概念,它描述了一类特殊的问题。
在解释NP-hard问题之前,我们需要先理解几个基本概念。
P问题:指的是那些其解可以在多项式时间内被验证的问题。
NP问题:指的是那些解的正确性可以在多项式时间内被验证的问题。
NP-complete问题(NPC问题):既是NP问题也是NP-hard问题的特殊情况,即那些既困难又完整的問題,也就是说,如果一个问题是NP问题,那么它一定可以被多项式时间规约到一个已知的NPC问题上。
NP-hard问题的定义是:一个问题如果是NP-hard的,那么这个问题至少和已知的某个NP-complete问题是等价的。
也就是说,任何一个NP-hard问题都可以在多项式时间内归约(映射)到一个已知的NP-complete问题上。
因此,NP-hard问题是一类非常困难的问题,它们比一般的N P问题更加困难,因为它们不仅要求解的问题能在多项式时间内被验证,而且还要求解的问题至少和某个已知的NPC 问题是等价的。
直观地说,如果我们在解决一个问题时,发现没有任何
已知的有效算法,即便使用现有的最先进的算法也无法在合理的时间内得到解决,那么这个问题就可能是NP-hard的。
例如,著名的“停机问题”(Halting Problem)就是一个典型的NP-hard问题,它问的是给定一个程序和输入,能否在有限时间内判断该程序是否终止。
这个问题已经被证明是NP-hard的,因为它无法在多项式时间内被解决。
总结一下,NP-hard问题是一类非常难以解决的问题,它们至少和已知的某个NPC问题是等价的,这意味着找到这类问题的多项式时间算法非常困难。
np 难问题的定义和分类
np 难问题的定义和分类
NP难问题在计算机科学中是一个重要的概念,涉及到多项式时间复杂性和确定性算法的问题。
具体来说,NP难问题指的是那些没有多项式时间复杂度的确定性算法来解决,但在多项式时间内能够验证解是否正确的问题。
NP问题是指非确定性多项式时间问题,即无法在多项式时间内找到确定性的解法,但可以在多项式时间内验证某个解是否正确的问题。
NP难问题通常被分为两类:NP完全问题和NP难问题。
NP完全问题是NP问题中最为困难的一类,指的是既是NP问题又是NP难问题的集合。
它们的特点是,即使利用了所有已知的算法和技巧,也无法在多项式时间内找到确定性的解法。
相比之下,NP难问题虽然没有多项式时间的确定性算法,但它们的难易程度可能不如NP完全问题。
在NP难问题的分类中,还有一些其他的问题类型,例如NP类问题、NP完全类问题和NP半完全问题等。
这些问题的分类主要是基于它们在NP问题中的关系和性质。
总之,NP难问题是计算机科学中的一个重要概念,涉及到多项式时间复杂性和确定性算法的问题。
它们通常被分为NP完全问题和NP难问题两类,其中NP完全问题是最为困难的一类。
解决这些问题的难度很高,但研究它们的性质和结构有助于更好地理解计算复杂性和算法设计等领域的知识。
什么是P、NP和NPC复杂性问题
什么是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)。
P问题、NP问题、NPC问题、NP难问题的概念
你会经常看到网上出现“这怎么做,这不是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问题和NP难问题的概念
容易看出,前面的几类复杂度被分为两种级别,其中后者的复杂度无论如何都远远大于前者:一种是O(1),O(log(n)),O(n^a)等,我们把它叫做多项式级的复杂度,因为它的规模n出现在底数的位置;另一种是O(a^n)和O(n!)型复杂度,它是非多项式级的,其复杂度计算机往往不能承受。当我们在解决一个问题时,我们选择的算法通常都需要是多项式级的复杂度,非多项式级的复杂度需要的时间太多,往往会超时,除非是数据规模非常小。
很显然,约化具有一项重要的性质:约化具有传递性。如果问题A可约化为问题B,问题B可约化为问题C,则问题A一定可约化为问题C。这个道理非常简单,就不必阐述了。
现在再来说一下约化的标准概念就不难理解了:如果能找到这样一个变化法则,对任意一个程序A的输入,都能按这个法则变换成程序B的输入,使两程序的输出相同,那么我们说,问题A可约化为问题B。
P问题、NP问题、NPC问题的概念
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)的复杂度。
np难问题
NP难问题求解综述彭茗菁2008221104210521[摘要]:上世纪70年代开始,诞生了一种许多数学家及电子计算器学家所关心的大问题—NP难问题, “P=NP?”这个问题,作为理论计算机科学的核心问题,其声名早已经超越了这个领域。
它是Clay研究所的七个百万美元大奖问题之一,在2006国际数学家大会上,它是某个1小时讲座的主题。
[关键词]: NP难问题,NP完全问题,计算复杂性,多项式函数NP难问题,不确定性图灵机在P时间内能解决的问题,是世界七大数学难题之一。
NP 问题排在百万美元大奖的首位,足见他的显赫地位和无穷魅力。
NP的英文全称是Non-deterministic Polynomial的问题,即多项式复杂程度的非确定性问题。
简单的写法是NP=P?,问题就在这个问号上,到底是NP等于P,还是NP不等于P。
一、NP难问题和P类问题的介绍NP问题属于“计算复杂性”研究的课题。
计算复杂性通俗来说就是用计算机求解问题的难易程度。
其度量标准:一是计算所需的步数或指令条数(即时间复杂度),二是计算所需的存储单元数量(即空间复杂度)。
它不是对一个具体问题去研究它的计算复杂性,而是依据难度去研究各种计算问题之间的联系,按复杂性把问题分成不同的类,即复杂性类。
如果一个判定性问题的复杂度是该问题的一个实例的规模n的多项式函数,则这种可以在多项式时间内解决的判定性问题属于P类问题。
P类问题就是所有复杂度为多项式时间的问题的集合。
通俗的称所有复杂度为多项式时间的问题为易解的问题类否则为难解的问题。
然而有些问题很难找到多项式时间的算法(或许根本不存在),但是如果给了该问题的一个答案,可以在多项式时间内判断这个答案是否正确,这种可以在多项式时间内验证一个解是否正确的问题称为NP问题,亦称为易验证问题类。
1971年古克(Stephen A. Cook) 发表了《The Complexity of Theorem Proving Procedures》才把P 之外约问题归成了三大类,即NP, NP-complete 及NP-hard。
NP难问题的概念
P问题、NP问题、NPC问题、NP难问题的概念NP困难: NP-hardNP: Non-deterministic Polynomial(非确定型多项式)NP问题: 用非确定性图灵机能在多项式时间内验证的一类问题.NP困难问题: 若NP中的每个问题R都能多项式归约到S,则S是NP困难问题. NP完全问题: 若NP中的每个问题R都能多项式归约到S且S是NP问题,则S 是NP完全问题.从上面定义可知,NP困难问题可以是NP完全问题,也可以不是NP完全问题.但NP完全问题一定是NP困难的.还是先用几句话简单说明一下时间复杂度。
时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。
也就是说,对于高速处理数据的计算机来说,处理某一个特定数据的效率不能衡量一个程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序运行时间是否还是一样,或者也跟着慢了数百倍,或者变慢了数万倍。
不管数据有多大,程序处理花的时间始终是那么多的,我们就说这个程序很好,具有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)的复杂度。
什么是NP问题
什么是P问题、NP问题和NPC问题●先用几句话简单说明一下时间复杂度1.时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。
2.也就是说,对于高速处理数据的计算机来说,处理某一个特定数据的效率不能衡量一个程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序运行时间是否还是一样,或者也跟着慢了数百倍,或者变慢了数万倍。
3.不管数据有多大,程序处理花的时间始终是那么多的,我们就说这个程序很好,具有O(1)的时间复杂度,也称常数级复杂度;4.数据规模变得有多大,花的时间也跟着变得有多长,这个程序的时间复杂度就是O(n),比如找n个数中的最大值;5.而像冒泡排序、插入排序等,数据扩大2倍,时间变慢4倍的,属于O(n^2)的复杂度。
6.还有一些穷举类的算法,所需时间长度成几何阶数上涨,这就是O(a^n)的指数级复杂度,甚至O(n!)的阶乘级复杂度。
7.不会存在O(2*n^2)的复杂度,因为前面的那个“2”是系数,根本不会影响到整个程序的时间增长。
8.同样地,O (n^3+n^2)的复杂度也就是O(n^3)的复杂度。
9.因此,我们会说,一个O(0.01*n^3)的程序的效率比O(100*n^2)的效率低,尽管在n很小的时候,前者优于后者,但后者时间随数据规模增长得慢,最终O(n^3)的复杂度将远远超过O(n^2)。
我们也说,O(n^100)的复杂度小于O(1.01^n)的复杂度。
10.容易看出,前面的几类复杂度被分为两种级别,其中后者的复杂度无论如何都远远大于前者:1)一种是O(1),O(log(n)),O(n^a) 等,我们把它叫做多项式级的复杂度,因为它的规模n出现在底数的位置;2)另一种是O(a^n)和O(n!)型复杂度,它是非多项式级的,其复杂度计算机往往不能承受。
11.当我们在解决一个问题时,我们选择的算法通常都需要是多项式级的复杂度,非多项式级的复杂度需要的时间太多,往往会超时,除非是数据规模非常小。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
P问题、NP问题、NPC问题、NP难问题的概念2010-04-15 21:35 | (分类:默认分类)转自/view/3e968900a6c30c2259019e8f.html你会经常看到网上出现“这怎么做,这不是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)的复杂度。
容易看出,前面的几类复杂度被分为两种级别,其中后者的复杂度无论如何都远远大于前者:一种是O(1),O(log(n)),O(n^a)等,我们把它叫做多项式级的复杂度,因为它的规模n出现在底数的位置;另一种是O(a^n)和O(n!)型复杂度,它是非多项式级的,其复杂度计算机往往不能承受。
当我们在解决一个问题时,我们选择的算法通常都需要是多项式级的复杂度,非多项式级的复杂度需要的时间太多,往往会超时,除非是数据规模非常小。
自然地,人们会想到一个问题:会不会所有的问题都可以找到复杂度为多项式级的算法呢?很遗憾,答案是否定的。
有些问题甚至根本不可能找到一个正确的算法来,这称之为“不可解问题”(Undecidable Decision Problem)。
The Halting Problem就是一个著名的不可解问题,在我的Blog上有过专门的介绍和证明。
再比如,输出从1到n这n个数的全排列。
不管你用什么方法,你的复杂度都是阶乘级,因为你总得用阶乘级的时间打印出结果来。
有人说,这样的“问题”不是一个“正规”的问题,正规的问题是让程序解决一个问题,输出一个“YES”或“NO”(这被称为判定性问题),或者一个什么什么的最优值(这被称为最优化问题)。
那么,根据这个定义,我也能举出一个不大可能会有多项式级算法的问题来:Hamilton回路。
问题是这样的:给你一个图,问你能否找到一条经过每个顶点一次且恰好一次(不遗漏也不重复)最后又走回来的路(满足这个条件的路径叫做Hamilton回路)。
这个问题现在还没有找到多项式级的算法。
事实上,这个问题就是我们后面要说的NPC问题。
下面引入P类问题的概念:如果一个问题可以找到一个能在多项式的时间里解决它的算法,那么这个问题就属于P问题。
P是英文单词多项式的第一个字母。
哪些问题是P类问题呢?通常NOI和NOIP不会出不属于P类问题的题目。
我们常见到的一些信息奥赛的题目都是P问题。
道理很简单,一个用穷举换来的非多项式级时间的超时程序不会涵盖任何有价值的算法。
接下来引入NP问题的概念。
这个就有点难理解了,或者说容易理解错误。
在这里强调(回到我竭力想澄清的误区上),NP问题不是非P类问题。
NP问题是指可以在多项式的时间里验证一个解的问题。
NP问题的另一个定义是,可以在多项式的时间里猜出一个解的问题。
比方说,我RP很好,在程序中需要枚举时,我可以一猜一个准。
现在某人拿到了一个求最短路径的问题,问从起点到终点是否有一条小于100个单位长度的路线。
它根据数据画好了图,但怎么也算不出来,于是来问我:你看怎么选条路走得最少?我说,我RP很好,肯定能随便给你指条很短的路出来。
然后我就胡乱画了几条线,说就这条吧。
那人按我指的这条把权值加起来一看,嘿,神了,路径长度98,比100小。
于是答案出来了,存在比100小的路径。
别人会问他这题怎么做出来的,他就可以说,因为我找到了一个比100 小的解。
在这个题中,找一个解很困难,但验证一个解很容易。
验证一个解只需要O(n)的时间复杂度,也就是说我可以花O(n)的时间把我猜的路径的长度加出来。
那么,只要我RP好,猜得准,我一定能在多项式的时间里解决这个问题。
我猜到的方案总是最优的,不满足题意的方案也不会来骗我去选它。
这就是NP问题。
当然有不是NP问题的问题,即你猜到了解但是没用,因为你不能在多项式的时间里去验证它。
下面我要举的例子是一个经典的例子,它指出了一个目前还没有办法在多项式的时间里验证一个解的问题。
很显然,前面所说的Hamilton回路是NP问题,因为验证一条路是否恰好经过了每一个顶点非常容易。
但我要把问题换成这样:试问一个图中是否不存在Hamilton回路。
这样问题就没法在多项式的时间里进行验证了,因为除非你试过所有的路,否则你不敢断定它“没有Hamilton回路”。
之所以要定义NP问题,是因为通常只有NP问题才可能找到多项式的算法。
我们不会指望一个连多项式地验证一个解都不行的问题存在一个解决它的多项式级的算法。
相信读者很快明白,信息学中的号称最困难的问题——“NP问题”,实际上是在探讨NP问题与P类问题的关系。
很显然,所有的P类问题都是NP问题。
也就是说,能多项式地解决一个问题,必然能多项式地验证一个问题的解——既然正解都出来了,验证任意给定的解也只需要比较一下就可以了。
关键是,人们想知道,是否所有的NP问题都是P类问题。
我们可以再用集合的观点来说明。
如果把所有P类问题归为一个集合P中,把所有NP问题划进另一个集合NP中,那么,显然有P属于NP。
现在,所有对NP问题的研究都集中在一个问题上,即究竟是否有P=NP?通常所谓的“NP问题”,其实就一句话:证明或推翻P=NP。
NP问题一直都是信息学的巅峰。
巅峰,意即很引人注目但难以解决。
在信息学研究中,这是一个耗费了很多时间和精力也没有解决的终极问题,好比物理学中的大统一和数学中的歌德巴赫猜想等。
目前为止这个问题还“啃不动”。
但是,一个总的趋势、一个大方向是有的。
人们普遍认为,P=NP不成立,也就是说,多数人相信,存在至少一个不可能有多项式级复杂度的算法的NP问题。
人们如此坚信P≠NP是有原因的,就是在研究NP问题的过程中找出了一类非常特殊的NP问题叫做NP-完全问题,也即所谓的NPC问题。
C是英文单词“完全”的第一个字母。
正是NPC问题的存在,使人们相信P≠NP。
下文将花大量篇幅介绍NPC问题,你从中可以体会到NPC问题使P=NP变得多么不可思议。
为了说明NPC问题,我们先引入一个概念——约化(Reducibility,有的资料上叫“归约”)。
简单地说,一个问题A可以约化为问题B的含义即是,可以用问题B的解法解决问题A,或者说,问题A可以“变成”问题B。
《算法导论》上举了这么一个例子。
比如说,现在有两个问题:求解一个一元一次方程和求解一个一元二次方程。
那么我们说,前者可以约化为后者,意即知道如何解一个一元二次方程那么一定能解出一元一次方程。
我们可以写出两个程序分别对应两个问题,那么我们能找到一个“规则”,按照这个规则把解一元一次方程程序的输入数据变一下,用在解一元二次方程的程序上,两个程序总能得到一样的结果。
这个规则即是:两个方程的对应项系数不变,一元二次方程的二次项系数为0。
按照这个规则把前一个问题转换成后一个问题,两个问题就等价了。
同样地,我们可以说,Hamilton回路可以约化为TSP问题(Travelling Salesman Problem,旅行商问题):在Hamilton回路问题中,两点相连即这两点距离为0,两点不直接相连则令其距离为1,于是问题转化为在TSP问题中,是否存在一条长为0的路径。
Hamilton 回路存在当且仅当TSP问题中存在长为0的回路。
“问题A可约化为问题B”有一个重要的直观意义:B的时间复杂度高于或者等于A的时间复杂度。
也就是说,问题A不比问题B难。
这很容易理解。
既然问题A能用问题B来解决,倘若B的时间复杂度比A的时间复杂度还低了,那A的算法就可以改进为B的算法,两者的时间复杂度还是相同。
正如解一元二次方程比解一元一次方程难,因为解决前者的方法可以用来解决后者。
很显然,约化具有一项重要的性质:约化具有传递性。
如果问题A可约化为问题B,问题B可约化为问题C,则问题A一定可约化为问题C。
这个道理非常简单,就不必阐述了。
现在再来说一下约化的标准概念就不难理解了:如果能找到这样一个变化法则,对任意一个程序A的输入,都能按这个法则变换成程序B的输入,使两程序的输出相同,那么我们说,问题A可约化为问题B。
当然,我们所说的“可约化”是指的可“多项式地”约化(Polynomial-time Reducible),即变换输入的方法是能在多项式的时间里完成的。
约化的过程只有用多项式的时间完成才有意义。
好了,从约化的定义中我们看到,一个问题约化为另一个问题,时间复杂度增加了,问题的应用范围也增大了。
通过对某些问题的不断约化,我们能够不断寻找复杂度更高,但应用范围更广的算法来代替复杂度虽然低,但只能用于很小的一类问题的算法。
再回想前面讲的P和NP问题,联想起约化的传递性,自然地,我们会想问,如果不断地约化上去,不断找到能“通吃”若干小NP问题的一个稍复杂的大NP问题,那么最后是否有可能找到一个时间复杂度最高,并且能“通吃”所有的NP问题的这样一个超级NP问题?答案居然是肯定的。
也就是说,存在这样一个NP问题,所有的NP问题都可以约化成它。
换句话说,只要解决了这个问题,那么所有的NP问题都解决了。