http://blog.csdn.net/dansin/archive/2006/05/25/754255.aspx
当我们遇到一个问题时,我们总是很自然的开始恩考求解这个问题的算法.我们大多数人都没有注意到问题本身的可解性.其实很多问题很难想出一种有效算法的,当然,遍历算法除外.如果我们有一台超强的计算机,那么一切算法都是没有意义的,因为一切问题都可以用遍历来解.
算法的效率其实正是体现在问题的大规模输入上,所以,我们在比较算法的好坏时,通常考虑它在大规模输入时的运行时间,占用空间等.P与NP问题正是源自算法执行的效率.
我想绝大多数学计算机的人都听过P与NP问题,但我觉得,真正能说出它是怎么回事的,不在多数.至少在我仔细看资料之前,我是说不出P与NP问题到底是怎么回事,以及怎么证明一个问题是NP或NP完全的.所以,我想写一些自己对P与NP问题的理解.
在介绍P与NP之前,我想先介绍两个概念.
1.确定性算法
设A是求解问题B的一个算法,如果在展示问题B的一个实例时,在整个执行过程中每一步都只有一个选择,则称A是确定性算法.因此如果对于同样的输入,实例一遍又一遍地执行,它的输出从不改变.
通常我们在写程序时,用到的都是一些确定性算法,比如说排序算法,最优化算法等.
2.不确定性算法
一个不确定性算法由下列两个阶段组成.
猜测阶段:在这个阶段产生一个任意字任串Y,它可能对应于输入实例的一个解,也可以不对应解.事实上,它甚至可能不是所求解的合适形式,它可能在不确定性算法的不同次运行中不同.它仅仅要求在多项式步数内产生这个串.
验证阶段:在这个阶段,一个确定性算全证两件事.首先,它检查产生的解串Y是否有合适的形式,如果不是,则算法停下并回答NO;另一方面,如果Y是合适形式,那么算法继续检查它是否是问题实例X的解,如果它确实是实例X的解,那么它停下并且回答YES,否则它停下并回答NO.我们也要求这个阶段在多项式步数内完成.
可能很多人会认为随机算法是一种不确定性算法.其实随机算法也是一种确定性算法,因为它的随机性也是通过在输入中加入一个用于产生随机值的串实现的,同样的串得到的随机值相同.
下面给出P与NP的定义:
P是一个判定问题类,这些问题可以用一个确定性算法在多项式时间内判定或解出;
NP是一个判定问题类,这些问题可以用一个确定算法在多项式时间内检查或验证出它们的解;
P事实上很直观,我们通常在编程中求解的问题大多都是P类问题.比如说排序,找最短路径等.NP这
个类事实上也很有趣,它并不要求给出一个算法来求解问题本身,而只是要求给出一个确定性算法在多项式时间内验证它的解.
NP完全问题
NP完全事实上表求NP中判定问题的一个子类.这类问题也是很有趣的,即如果它们中的一个被证明
是多项式时间内确定性算法可解,那么所有属于这一类的其它问题也是多项式时间内确定性算法可解.
多项式时间归约:
设A和B是两个判定问题.如果存在一个确定性算法C,它的行为如下:当给C展示问题A的一个实例时,算法A可以把这个实例变换成问题B的一个实例,使得A的实例跟B的实例有相同的YES/NO应答,并且这个变换在多项式时间内完成.那么我们说A多项式时间归约到B.
事实上,我们可以将多项式时间归约看做是一个函数的映射,即F(A)=B.并且这个F是多项式时间内可计算的.也就是说问题A实现上可以通过它自身满足的条件,通过一些形式上的改变而变换到问题B.形象地讲,问题A事实上不比B难,而问题B也同样不比问题A难.
NP困难与NP完全
一个判定问题A称为是NP困难的,如果对于NP中的每个问题B,B多项式时间归约到A.
一个判定问题A称为是NP完全的,如果对于NP中的每个问题B,B多项式时间归约到A,并且A在NP类中.
NP完全问题的证明:
要证明一个判定问题是NP完全的,只要在NP完全类中找到一个问题A,将这个问题归约到待证明问题即可.要证明问题是NP完全是很困难的,因为很多问题之间的转化过程是很难想到的.第一个被证明的NP完全问题是可满足性问题,它是判定一个合取范式的布尔公式F是否存在真值指派的问题.在很多NP完全问题的证明中,我们都可以用这个问题来归约,这里不再详述.
分享到:
相关推荐
在2010年,HP实验室的研究员Vinay Deolalikar发表了一篇论文,声称证明了复杂度类P与NP之间的分离问题(P≠NP),即证明了不存在能够在多项式时间内解决所有NP完全问题的算法。这一成果引起了计算机科学界的广泛关注,...
NP 问题可以分为两类:P 问题和 NPC 问题。P 问题是指可以在多项式时间内解决的问题,如 O(1)、O(log(n))、O(n^a) 等。NPC 问题是指 NP 问题中可能性最小的或许可以被计算机在多项式时间内解决或验证的问题。 NPC ...
非确定性多项式问题(NP)是指一类计算问题,在这类问题中,如果存在一...寻找这些问题的多项式时间算法一直是理论计算机科学的重要研究方向,而NP=P的问题则构成了著名的P/NP问题,它是计算复杂性理论的核心难题之一。
首先,很容易证明三维匹配问题是NP问题。只需要判断集合T’的大小是否为n,且包含X,Y,Z中每个元素一次。证明三维匹配问题是NPC的,可以通过3-SAT≤p\leq_p≤p三维匹配证明。 【3-SAT≤p\leq_p≤p三维匹配证明】
7. NP(p)问题的介绍:NP(p)问题,即p阶Stieltjes矩阵函数类中的Nevanlinna-Pick插值问题,是数学中一个重要问题的延伸,与矩阵SM问题有着紧密联系。 8. 线性矩阵分式变换的应用:在求解矩阵SM问题和NP(p)问题时,...
P类问题是指可以用确定性算法在多项式时间内解决的问题,而NP类问题则是非确定性算法可以在多项式时间内验证其解的问题。如果NP等于P,那么所有的NP问题都有多项式时间的解决方案,但至今这尚未被证明。 计算复杂性...
9. **计算复杂性理论**:计算复杂性理论研究了算法运行时间和资源消耗的理论界限,如P类、NP类问题,以及P=NP问题,这些理论为评估算法的可行性提供了理论依据。 学习《哈工大算法设计与分析》不仅可以提升编程能力...
11. **近似算法与随机化算法**:对于NP难问题,往往需要设计近似算法寻找接近最优解的解决方案。随机化算法则引入随机因素,如鸽巢原理、拉姆齐理论等。 12. **复杂性理论**:了解P、NP、NPC等概念,理解计算复杂性...
描述中提到“N=NP能得到的结论当然是N=1或者P=0”,这是一种对问题的幽默化表达,暗示解题可能需要从二进制角度出发,因为“1”和“0”是二进制的基本元素。 结合“信息应该藏在像素中”这一线索,我们可以推断题目...
其中,\(P(x, y, z)\)表示数组\([0:x][0:y][0:z]\)所有元素的总和。 #### 复杂度分析 动态规划算法的时间复杂度主要取决于状态空间的大小和状态转移的复杂度。在这个问题中,状态空间的大小由长方体的尺寸决定,即...
在这项工作中,我们在B→K1(1270,1400)μ+ μ−中研究了可以解决b→s异常的两种流行类别的NP模型(即p夸克模型和Z'模型)的影响。 通过假设NP仅影响b→sμ+ μ−跃迁,我们发现非极化和极化的轻子风味通用性(LFU...
2. Z/p^2Z代数结构:文档中提到的代数是在Z/p^2Z上定义的代数,这里的Z/p^2Z表示模p^2的整数环。在数学中,代数结构通常包括加法和乘法运算,而且代数结构研究的是这些运算如何组合起来满足某些公理。 3. 幂零元与...
在密码学中,加密过程应该足够快,最好属于P类问题,解密过程也应该使用密钥属于P类问题,而对于攻击者而言,解密过程应当属于NP类问题。需要找到的问题是,解决方案的复杂性随着对密钥知识的增加而变得越来越困难。...
此外,计算复杂性和计算理论探讨了计算问题的本质限制,如P类问题和NP类问题的区别。 这个压缩包内的文件很可能是教材、讲义、课件或习题解答,覆盖了上述各方面的内容。可能包括了理论介绍、实例分析、编程练习等...
K = self.P.dot(h(self.sigma_points) - z_pred[:, np.newaxis]).dot(np.linalg.inv(Pz)) # 更新状态 self.x += K.dot(z - z_pred) # 更新协方差 self.P -= K.dot(Pz).dot(K.T) ``` #### 3. 定义状态转移...
GA Z68P-DS3.txt GA Z68X-UD3-B3.txt GA Z68X-UD3H-B3.txt GA Z68X-UD3P-B3.txt GA Z68X-UD3R-B3.txt GA Z68X-UD4-B3.txt GA Z68X-UD5-B3.txt GA Z68X-UD7-B3.txt GA Z68XP-D3.txt GA Z68XP-UD3-iSSD.txt GA Z68XP-...
同时,还会学习如何利用自动机进行语言识别,理解P和NP问题,以及图灵机的停机问题等核心概念。通过这些理论的学习,学生能够更好地理解和设计复杂的计算机算法,对于未来从事软件开发、系统设计、理论研究等工作...
self.P = np.dot(np.dot(self.F, self.P), self.F.T) + self.Q def update(self, z): y = z - np.dot(self.H, self.x) S = np.dot(np.dot(self.H, self.P), self.H.T) + self.R K = np.dot(np.dot(self.P, ...
K = np.dot(self.P, self.H.T) / (np.dot(self.H, self.P).dot(self.H.T) + self.R) self.x = self.x + np.dot(K, (z - np.dot(self.H, self.x))) I = np.eye(len(self.x)) self.P = np.dot((I - np.dot(K, self...
计算理论进一步探讨计算的复杂性和效率,比如P类和NP类问题。 7. **编码理论**:在通信和数据存储中,编码理论扮演着重要角色。它包括纠错码、信息论和数据压缩等,确保信息的准确传输和存储。 8. **形式语言和...