什么是np完全问题?为什么它在计算机科学中如此重要?


当前回答

什么是NP?

NP是所有决策问题(答案是或否的问题)的集合,其中“是”答案可以通过确定性图灵机在多项式时间(O(nk),其中n是问题大小,k是常数)验证。有时用多项式时间来定义快或快。

P是什么?

P是由确定性图灵机在多项式时间内解决的所有决策问题的集合。由于它们可以在多项式时间内求解,因此也可以在多项式时间内验证。因此P是NP的子集。

什么是np完全?

NP中的问题x也属于NP完全,当且仅当NP中的所有其他问题都可以快速地(即。在多项式时间内)转换成x。

换句话说:

x在NP中,并且 NP中的每个问题都可约为x

所以,NP完全问题的有趣之处在于,如果任何一个NP完全问题可以快速解决,那么所有NP问题都可以快速解决。

另见帖子“P=NP”是什么?为什么这是一个如此著名的问题?

什么是NP-Hard?

NP- hard是指至少和NP中最难的问题一样难的问题。注意,np完全问题也是np难的。然而,并非所有NP难问题都是NP问题(甚至是决策问题),尽管有NP作为前缀。NP-hard中的NP并不意味着非确定性多项式时间。是的,这令人困惑,但它的用法根深蒂固,不太可能改变。

其他回答

NP-Complete指的是非常具体的东西,你必须小心,否则你会弄错定义。首先,NP问题是一个是/否问题

对于答案为"是"的问题的每个实例都有多项式时间证明,即答案为"是",或者(等价地) 存在一种多项式时间算法(可能使用随机变量),如果问题实例的答案是“是”,那么它有非零概率回答“是”,如果答案是“否”,则它会在100%的时间内回答“否”。换句话说,该算法的假阴性率必须小于100%,并且没有假阳性。

问题X是np完全的,如果

X在NP中,并且 对于NP中的任何问题Y,都有一个从Y到X的“约简”:一个多项式时间算法,将Y的任何实例转换为X的实例,当且仅当X实例的答案是“是”时,Y实例的答案是“是”。

如果X是NP完全的,并且存在一个确定性的多项式时间算法,可以正确地解决X的所有实例(0%假阳性,0%假阴性),那么NP中的任何问题都可以在确定性多项式时间中解决(通过归约到X)。

So far, nobody has come up with such a deterministic polynomial-time algorithm, but nobody has proven one doesn't exist (there's a million bucks for anyone who can do either: the is the P = NP problem). That doesn't mean that you can't solve a particular instance of an NP-Complete (or NP-Hard) problem. It just means you can't have something that will work reliably on all instances of a problem the same way you could reliably sort a list of integers. You might very well be able to come up with an algorithm that will work very well on all practical instances of a NP-Hard problem.

NP代表非确定性多项式时间。

这意味着使用非确定性图灵机(就像常规图灵机,但也包括非确定性“选择”函数)可以在多项式时间内解决问题。基本上,解必须在多边形时间内可测试。如果是这样的话,一个已知的NP问题可以用修改输入的给定问题来解决(一个NP问题可以简化为给定问题),那么这个问题就是NP完全的。

从np完全问题中得到的主要东西是,它不能以任何已知的方式在多项式时间内解决。NP-Hard/NP-Complete是一种表明某些类型的问题在现实时间内无法解决的方法。

编辑:正如其他人所注意到的,np完全问题通常有近似解。在这种情况下,近似解通常给出一个近似界,用特殊的符号告诉我们这个近似有多接近。

我们需要把算法和问题分开。我们编写算法来解决问题,它们以某种方式扩展。虽然这是一种简化,但如果缩放足够好,我们就用“P”来标记算法,如果缩放不够好,就用“NP”来标记算法。

了解我们试图解决的问题,而不是我们用来解决它们的算法,是有帮助的。所以我们说,所有具有良好伸缩算法的问题都是"在P内"的。而那些有一个糟糕的缩放算法的是“NP”。

That means that lots of simple problems are "in NP" too, because we can write bad algorithms to solve easy problems. It would be good to know which problems in NP are the really tricky ones, but we don't just want to say "it's the ones we haven't found a good algorithm for". After all, I could come up with a problem (call it X) that I think needs a super-amazing algorithm. I tell the world that the best algorithm I could come up with to solve X scales badly, and so I think that X is a really tough problem. But tomorrow, maybe somebody cleverer than me invents an algorithm which solves X and is in P. So this isn't a very good definition of hard problems.

尽管如此,NP中仍有许多问题,没有人知道一个好的算法。因此,如果我能证明X是一个特定的问题:一个解决X的好算法也可以用某种迂回的方式,为NP中的所有其他问题提供一个好算法。现在人们可能更相信X是一个棘手的问题。在这种情况下,我们称X为np完全。

老实说,维基百科可能是寻找答案的最佳场所。

如果NP = P,那么我们就可以比我们之前认为的更快地解决非常困难的问题。如果我们在P(多项式)时间内只解决了一个np -完全问题,那么它可以应用于np -完全范畴内的所有其他问题。

据我所知

P是可以用确定性TM在多项式时间内解决的问题集。

NP是需要在多项式时间内解决非确定性TM的问题集。 这意味着我们可以用多项式时间并行检查每个实例的所有不同变量组合。如果问题是可解决的,那么至少有一个平行的TM实例会以“是”而停止。 这也意味着如果你能对变量/解做出正确的猜测,那么你只需要在多项式时间内检查它的有效性。

NP- hard是指问题比NP更难的集合。这意味着NP- hard问题比NP集中的任何问题都要难。即使使用图灵机的非确定性,这些问题也是指数级的。所以并行计算在解决这些问题时没有帮助。

NP- complete是NP和NP- hard的交集集。根据我的理解,

NP完全中的问题至少和NP集中最难的问题一样难。 所有np -完全问题的类都是等价的,即np -完全集中的一个问题可以简化为任何其他的np -完全问题。这意味着,如果任何一个np完全问题都有一个有效的解,那么所有的np完全问题都可以用相同的解来解决。

如果np -完全集中的任何问题在多项式时间内确定可解,则整个np -完全集在多项式时间内确定可解。此外,由于NP-完全问题至少与NP集中最难的问题一样难,NP集中的所有问题(等于或容易于NP-完全集中的问题)将被确定性多项式的运行时间所限制,将P集扩展到NP集中,从而得到P=NP。

如果我弄错了,请告诉我。