What is an NP-complete in computer science?
什么是NP完全问题?为什么它在计算机科学中如此重要?
什么是NP?
np是所有决策问题(有是或否答案的问题)的集合,对于这些问题,"是"的答案可以用确定图灵机在多项式时间(o(n k),其中n是问题大小,k是常量)中进行验证。多项式时间有时用作快速或快速的定义。
什么是P?P是由一个确定性图灵机在多项式时间内解决的所有决策问题的集合。由于它们可以在多项式时间内求解,因此也可以在多项式时间内进行验证。因此p是np的一个子集。
什么是NP完全?np中的问题x也是np完备的,前提是np中的所有其他问题都能快速(即在多项式时间)转换为x。
换言之:
所以,使NP完全如此有趣的是,如果要快速解决其中任何一个NP完全问题,那么所有的NP问题都可以快速解决。
另见帖子"p=np"是什么?为什么这个问题这么有名?
什么是NP硬?NP难是至少和NP中最难的问题一样难的问题。注意,NP完全问题也是NP硬问题。然而,并非所有的NP硬问题都是NP(甚至是决策问题),尽管
np代表非确定性多项式时间。
这意味着可以使用非确定性图灵机(如常规图灵机,但也包括非确定性"choice"函数)在多项式时间内解决问题。基本上,一个解决方案必须在多时间内可测试。如果是这样的话,一个已知的NP问题可以用带修正输入的给定问题来解决(一个NP问题可以简化为给定问题),那么这个问题就是NP完全问题。
从一个NP完全问题中去掉的主要问题是它不能用任何已知的方法在多项式时间内求解。np-hard/np-complete是一种表示某些问题在现实时间内无法解决的方法。
编辑:正如其他人所指出的,NP完全问题通常有近似解。在这种情况下,近似解通常用特殊的符号给出一个近似界,它告诉我们近似有多接近。
NP完成意味着一些非常具体的事情,你必须小心,否则你会得到错误的定义。首先,NP问题是"是/否"问题,这样
问题x是np完全如果
如果x是np完全的,并且存在一个确定的多项式时间算法,能够正确地解决x的所有实例(0%的误报,0%的误报),那么np中的任何问题都可以在确定的多项式时间内解决(通过减少到x)。
到目前为止,还没有人提出这种确定性多项式时间算法,但没有人证明它不存在(任何人都有一百万美元可以做到:这是p=np问题)。这并不意味着你不能解决一个NP完全(或NP硬)问题的特定实例。它只是意味着你不能有一些东西在所有问题的实例上都能可靠地工作,就像你能可靠地对整数列表排序一样。你很可能会想出一个算法,在所有NP难题的实际情况下都能很好地工作。
NP完全是一类问题。
类
类
一些例子是布尔可满足性(或SAT)问题,或哈密顿循环问题。在NP类中有许多已知的问题。
它对计算机科学很重要,因为已经证明了NP中的任何问题都可以转化为NP完全中的另一个问题。这意味着任何一个NP完全问题的解都是所有NP问题的解。
许多安全算法依赖于一个事实,即对于NP硬问题不存在已知的解。如果找到一个解决方案,它肯定会对计算产生重大影响。
基本上,这个世界的问题可以分为
&1)无法解决的问题&2)棘手问题&3)NP问题&4)P问题
&第一个问题无法解决。&2)第二个是需求指数时间(即上面的o(2^n))。&3)第三个称为NP。&第四个问题很容易解决。
P:多项式时间问题的一个解。
NP:是指尚未找到解的多项式时间。我们不确定是否存在多项式时间解,但是一旦你提供了一个解,这个解就可以在多项式时间中得到验证。
NP完全:指在多项式时间内,我们还没有找到一个解,但它可以在多项式时间内得到验证。NP中的问题npc是一个比较困难的问题,所以如果我们能证明我们有npc问题的p解,那么在p解中就可以找到np问题。
NP难:指多项式时间尚未找到解,但它肯定无法在多项式时间中得到验证。NP难题超过NPC难题。
如果你想找一个NP完全问题的例子,我建议你看一下3-SAT。
基本前提是你有一个连接正规形式的表达式,这是说你有一系列由ORS连接的表达式,所有这些表达式都必须是真的:
1 | (a or b) and (b or !c) and (d or !e or f) ... |
3-sat问题是找到一个满足表达式的解决方案,其中每个or表达式正好有3个布尔值要匹配:
1 | (a or !b or !c) and (!a or b or !d) and (b or !c or d) ... |
这个问题的解决方案可能是(a=t,b=t,c=f,d=f)。然而,在多项式时间的一般情况下,还没有发现能解决这一问题的算法。这意味着,解决这个问题的最佳方法就是从本质上进行一次强力猜测和检查,并尝试不同的组合,直到找到一个有效的组合。
关于3-sat问题的特别之处在于,任何np完全问题都可以简化为3-sat问题。这意味着,如果你能找到一个多项式时间算法来解决这个问题,那么你将得到100万美元,更不用说世界各地的计算机科学家和数学家的尊敬和钦佩了。
这是一类问题,我们必须模拟各种可能性,以确保我们得到最优解。
对于一些NP完全问题有很多很好的启发式方法,但它们充其量只是一个有教育意义的猜测。
老实说,维基百科可能是寻找答案的最佳地方。
如果np=p,那么我们可以比以前想象的更快地解决非常困难的问题。如果我们在P(多项式)时间内只解决一个NP完全问题,那么它就可以应用于NP完全范畴内的所有其他问题。
我们需要把算法和问题分开。我们编写解决问题的算法,它们以某种方式扩展。尽管这是一种简化,但是如果缩放足够好,我们还是用"p"来标记算法;如果缩放不够好,则用"np"来标记算法。
了解我们试图解决的问题,而不是我们用来解决问题的算法,这是很有帮助的。所以我们会说,所有有一个好的比例算法的问题都是"在P中"。而比例算法较差的则是"在np中"。
这意味着许多简单的问题也是"NP"中的问题,因为我们可以编写糟糕的算法来解决简单的问题。知道NP中哪些问题是真正棘手的问题是很好的,但我们不想说"这是我们没有找到好算法的问题"。毕竟,我可以想出一个问题(称之为X),我认为需要一个超级神奇的算法。我告诉全世界,我能想出的解决x尺度问题的最佳算法,所以我认为x是一个非常困难的问题。但是明天,也许有比我聪明的人发明了一种算法,它能解X,并且在P中,所以这不是一个很好的困难问题的定义。
尽管如此,NP中存在许多问题,没有人知道一个好的算法。所以,如果我能证明x是一个特定的问题:一个很好的解决x的算法,也可以用一些迂回的方式,为np中的所有其他问题提供一个好的算法。现在人们可能更相信x是一个真正棘手的问题。在这种情况下,我们称之为x np complete。
上面NP完全问题的定义是正确的,但是我认为我可能会对它们的哲学重要性保持抒情,因为还没有人解决这个问题。
几乎所有你遇到的复杂问题都是NP完全的。这个类有一些非常基本的东西,它在计算上与容易解决的问题不同。它们有自己的味道,不难辨认。这基本上意味着任何中等复杂的算法都不可能精确地解决——调度、优化、打包、覆盖等。
但如果你遇到的问题是NP完全的,并不是所有的都会丢失。有一个广阔的,非常技术的领域,人们研究近似算法,这将给你保证接近一个NP完全问题的解决方案。其中一些是非常强大的保证——例如,对于3SAT,您可以通过一个非常明显的算法获得7/8的保证。更好的是,在现实中,有一些非常强的启发式方法,它们擅长给出很好的答案(但不能保证!)为了这些问题。
注意,两个非常著名的问题——图同构和因子分解——不知道是p或np。
我听到一个解释,那就是:"NP完备性可能是算法研究中比较神秘的概念之一。"np"代表"不确定多项式时间",是问题可以属于的复杂度类的名称。NP复杂度类的重要内容是,该类中的问题可以通过多项式时间算法进行验证。举个例子,考虑一下计算东西的问题。假设桌子上有一堆苹果。问题是"有多少苹果?"我们为您提供了一个可能的答案8。你可以使用,duh,计算苹果的算法在多项式时间内验证这个答案。计算苹果是在O(n)(这是大的哦符号)时间内进行的,因为计算每个苹果需要一个步骤。对于N个苹果,您需要N个步骤。这个问题在NP复杂性类中。
如果一个问题能证明它在多项式时间内是NP困难的并且是可验证的,那么它就被归类为NP完全问题。在不深入讨论np困难的情况下,可以说有些问题没有找到多项式时间解。也就是说,它需要像N这样的东西!(n阶乘)求解它们的步骤。但是,如果你得到一个NP完全问题的解,你可以用多项式时间来验证它。
一个NP完全问题的典型例子是旅行商问题。"
作者:ApoxyButt发件人:http://www.everything2.com/title/np-complete
NP问题:
NP问题的类型
NP完全问题:
如果决策问题A具有以下两个性质,则称为NP完全问题:
一些EX:
- 背包问题
- 子集和问题
- 顶点覆盖问题
NP完全问题是一组问题,每个问题都有其他的NP问题可以在多项式时间内约简,其解仍然可以用多项式时间进行验证。也就是说,任何NP问题都可以转化成NP完全问题。–非正式地说,一个NP完全问题是一个NP问题,至少是"困难"的。和NP中的其他问题一样。
NP问题是在多项式时间内生成一个验证解的计算机算法。
一个NP完全问题是NP,但是如果你能用多项式时间(称为P)来解决它,那么所有的NP问题都是P。
所以抓紧时间。