什么是np完全问题?为什么它在计算机科学中如此重要?
当前回答
如果你想找一个np完全问题的例子那么我建议你看一下3-SAT。
基本前提是你有一个合取范式的表达式,这是一种说法,你有一系列由or连接的表达式,它们都必须为真:
(a or b) and (b or !c) and (d or !e or f) ...
3- sat问题是找到一个满足表达式的解,其中每个or表达式恰好有3个布尔值可以匹配:
(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问题。这意味着如果你能找到一个多项式时间算法来解决这个问题,那么你就能得到1,000,000美元,更不用说全世界计算机科学家和数学家的尊重和钦佩了。
其他回答
基本上这个世界的问题可以分为
1)无法解决的问题 2)棘手问题 3) np问题 4) P-Problem
1)第一个是没有解决问题的办法。 2)其次是需要指数时间(即O (2 ^ n)以上)。 3)第三个是NP。 4)第四个问题很简单。
P:多项式时间问题的解。
NP:指多项式时间尚未找到一个解决方案。我们不确定有没有多项式时间的解决方案,但一旦你提供了一个解决方案,这个解决方案可以在多项式时间验证。
NP完全:是指在多项式时间中我们还没有找到一个解,但它可以在多项式时间中得到验证。NP中的NPC问题是比较困难的问题,所以如果我们能证明NPC问题有P个解,那么NP问题就能在P个解中找到。
NP困难:指多项式时间尚未找到解决方案,但它肯定无法在多项式时间内得到验证。NP难的问题超过NPC难的问题。
上面NP完全问题的定义是正确的,但我想我可能会对它们的哲学重要性进行抒情,因为还没有人解决这个问题。
几乎你遇到的所有复杂问题都是NP完全的。这门课有一些非常基础的东西,从计算上看和容易解决的问题是不同的。它们有自己的味道,而且不难辨认。这基本上意味着任何适度复杂的算法都不可能精确地解决——调度、优化、包装、覆盖等。
But not all is lost if a problem you'll encounter is NP Complete. There is a vast and very technical field where people study approximation algorithms, which will give you guarantees for being close to the solution of an NP complete problem. Some of these are incredibly strong guarantees -- for example, for 3sat, you can get a 7/8 guarantee through a really obvious algorithm. Even better, in reality, there are some very strong heuristics, which excel at giving great answers (but no guarantees!) for these problems.
请注意,两个非常著名的问题——图同构和因式分解——不知道是P或NP。
np完全问题是一组问题,其中每一个问题都是任意的 其他np问题可以在多项式时间内约简,其解 仍然可以在多项式时间内验证。也就是说,任何NP问题都可以 转化为np完全问题。 非正式地说,NP完全问题是一个NP问题,至少是“难” 和NP中的其他问题一样。
NP代表非确定性多项式时间。
这意味着使用非确定性图灵机(就像常规图灵机,但也包括非确定性“选择”函数)可以在多项式时间内解决问题。基本上,解必须在多边形时间内可测试。如果是这样的话,一个已知的NP问题可以用修改输入的给定问题来解决(一个NP问题可以简化为给定问题),那么这个问题就是NP完全的。
从np完全问题中得到的主要东西是,它不能以任何已知的方式在多项式时间内解决。NP-Hard/NP-Complete是一种表明某些类型的问题在现实时间内无法解决的方法。
编辑:正如其他人所注意到的,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.
推荐文章
- 段树、区间树、二叉索引树和范围树之间有什么区别?
- 给定一个数字,找出下一个与原始数字具有完全相同的数字集的更高的数字
- HSL到RGB的颜色转换
- 使用Java在原语数组中查找最大/最小值
- 好的Java图算法库?
- foreach和map有区别吗?
- 什么时候我应该使用Kruskal而不是Prim(反之亦然)?
- 取一个集中在中心的随机数
- PHP中接口的意义是什么?
- 设计模式:工厂vs工厂方法vs抽象工厂
- 如何计算圆周长上的一点?
- 为什么处理排序数组比未排序数组慢?
- 从整数流中找到运行中位数
- 在日历应用程序中建模重复事件的最佳方法是什么?
- 在任何情况下,您更喜欢高大o时间复杂度算法而不是低大o时间复杂度算法吗?