什么是np完全问题?为什么它在计算机科学中如此重要?
当前回答
I have heard an explanation, that is:" NP-Completeness is probably one of the more enigmatic ideas in the study of algorithms. "NP" stands for "nondeterministic polynomial time," and is the name for what is called a complexity class to which problems can belong. The important thing about the NP complexity class is that problems within that class can be verified by a polynomial time algorithm. As an example, consider the problem of counting stuff. Suppose there are a bunch of apples on a table. The problem is "How many apples are there?" You are provided with a possible answer, 8. You can verify this answer in polynomial time by using the algorithm of, duh, counting the apples. Counting the apples happens in O(n) (that's Big-oh notation) time, because it takes one step to count each apple. For n apples, you need n steps. This problem is in the NP complexity class.
如果一个问题可以证明它既NP-Hard,又在多项式时间内可验证,那么它就被归类为NP-complete。在不深入讨论NP-Hard的情况下,只要说明某些问题的多项式时间解还没有找到就足够了。也就是说,它需要n!(n !)步来解它们。然而,如果给你一个np完全问题的解,你可以在多项式时间内验证它。
np完全问题的一个经典例子是旅行商问题。”
作者:ApoxyButt 来自:http://www.everything2.com/title/NP-complete
其他回答
老实说,维基百科可能是寻找答案的最佳场所。
如果NP = P,那么我们就可以比我们之前认为的更快地解决非常困难的问题。如果我们在P(多项式)时间内只解决了一个np -完全问题,那么它可以应用于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完全问题的例子那么我建议你看一下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美元,更不用说全世界计算机科学家和数学家的尊重和钦佩了。
NP问题:-
NP问题是一类可以在非确定多项式时间内解决的问题。 非确定性算法分为两个阶段。 非确定性猜测阶段&&非确定性验证阶段。
Np问题的类型
NP完全 NP困难
NP完全问题:-
如果问题A具有以下两个性质,则称为NP完全问题
它属于NP类。 NP中的任何其他问题都可以在多项式时间内转化为P。
一些例子:
背包问题 子集和问题 顶点覆盖问题
这是一类问题,我们必须模拟每一种可能性,以确保我们有最优解。
对于一些np完全问题,有很多好的启发式方法,但它们充其量只是一个有根据的猜测。
推荐文章
- 段树、区间树、二叉索引树和范围树之间有什么区别?
- 给定一个数字,找出下一个与原始数字具有完全相同的数字集的更高的数字
- HSL到RGB的颜色转换
- 使用Java在原语数组中查找最大/最小值
- 好的Java图算法库?
- foreach和map有区别吗?
- 什么时候我应该使用Kruskal而不是Prim(反之亦然)?
- 取一个集中在中心的随机数
- PHP中接口的意义是什么?
- 设计模式:工厂vs工厂方法vs抽象工厂
- 如何计算圆周长上的一点?
- 为什么处理排序数组比未排序数组慢?
- 从整数流中找到运行中位数
- 在日历应用程序中建模重复事件的最佳方法是什么?
- 在任何情况下,您更喜欢高大o时间复杂度算法而不是低大o时间复杂度算法吗?