什么是 NP 和 NP 完全问题? [关闭]

Posted

技术标签:

【中文标题】什么是 NP 和 NP 完全问题? [关闭]【英文标题】:What are NP and NP-complete problems? [closed] 【发布时间】:2011-10-18 11:20:34 【问题描述】:

我很难理解什么是非确定性多项式时间问题和 NP 完全问题。我了解多项式时间可解决的问题是什么,并在***中看到了关于 NP 问题。在阅读完这篇文章后,我试图思考一些示例问题。据我了解,无向中的深度优先搜索是 NP 完全的,因为如果图很大(引用一个是如果图很小,则为多项式。)

谁能在不使用太多数学的情况下用简单的例子简要解释所有这些 NP 术语?

【问题讨论】:

DFS 肯定在 P 中,就像每次搜索一样。您可以使用队列并在 O(n) 时间内检查所有 n 个节点。 @Brian Gordon:这使得它在节点数上是线性的,但节点数本身是指数级的。 @S.L.巴特指数的参数是什么? 请阅读***.com/questions/how-to-ask @Brian Gordon 在我脑海中浮现,节点拥有的属性数量呈指数级增长。 (我在这里称它们为属性以避免与术语参数混淆)。 【参考方案1】:

我在大学里学到了一条经验法则:如果给定一个解决方案,可以快速验证该解决方案(即在多项式时间内),那么问题就是 NP。

【讨论】:

而且 NP 完全问题也必须是 NP 难的。【参考方案2】:

我将尝试解析您的示例,希望借助网络上的所有其他资源,您可以取得进展。

几个问题

DFS 不是 NP-Hard 问题,因此它不是 NP-complete。 NP 完全性必须用决策问题来表述 - 我不知道您所说的做出错误决策是什么意思 输入的大小与 NP 完全性或硬度无关。每个问题都有一个运行时间作为问题大小的函数,该函数的大小是决定多时间的方式(即,它是多项式还是指数)

【讨论】:

NP-hardness 是 NP-completeness 的必要条件 抱歉,将 NP-complete 误读为 NP。【参考方案3】:

关于 NPNP 完整性的思考方式有很多种。我将从 NP 的定义开始,然后是 NP-hardness,最后是 NP-completeness。

在高层次上,PNP 是一类问题。 P 中的问题是一个是或否的问题(a decision problem),并且有一些算法可以在多项式时间内解决该问题。例如,“你能在这张图中从节点 u 到节点 v 吗?”的问题?属于 P 因为你可以用深度优先搜索来解决它。 (请注意,DFS 本​​身不在 P 中,因为 DFS 是一个算法,而不是一个问题)。 P 中的另一个问题示例是检查序列是否按排序顺序。

NP 中存在问题,如果它是一个可以验证正确答案的是或否问题(decision problem em> 在多项式时间内。例如,一个经典的 NP 问题是查看给定一组已知权重的权重,您是否可以选择一组重量正好为某个量 k 的权重(这称为subset sum problem)。确定是否存在具有该属性的一组权重可能很棘手,但如果我给你一组我说我知道是正确的权重,你可以很容易地检查我是否给你正确的一组权重,只需将它们相加并查看它们是否总计为 k。

NP 被称为“非确定多项式”的原因是,对 NP 的另一种思考方式是考虑一种能够以某种方式猜测正确答案的魔法算法多项式时间内的问题。也就是说,如果您可以编写一个允许对问题的答案进行猜测并在多项式时间内运行的算法,那么您正在解决的问题属于 NP。回到我们的权重示例,我们可以为这个问题编写这样一个猜测算法,如下所示。首先,在线性时间内猜测哪一组权重是正确的一组权重,然后将它们全部加起来,看看它们的总和是否为 k。如果是,请报告答案为“是”。否则,说“不”。如果这个程序总是保证做出正确的猜测,那么给定任何有解决方案的问题的输入,它总是会找到一个并报告“是”,如果没有解决方案,它总是会猜错并报告“否”。

目前计算机科学中最基本和最重要的问题之一是,已知存在于 NP 中的任何问题是否也存在于 P 中。也就是说,如果我们可以轻松地验证有效地(在多项式时间内)解决问题的答案,那么我们是否总是可以有效地解决该问题(在多项式时间内)?众所周知,P中的任何问题也是NP中的问题,因为您可以使用多项式时间算法产生答案,然后检查它是否正确,但没有有人曾经找到一种在多项式时间内解决 NP 中的任意问题的方法。

原因是 NP 中的一些问题被称为 NP-complete,这意味着(非正式地)它们至少与NP。如果我们能够有效地解决这些问题(多项式时间),那么我们就可以在多项式时间内解决 NP 中的所有问题。这将是一件大事,因为 NP 中存在许多极其重要的问题,而我们目前还没有好的、快速的算法可以解决这些问题。这也是P = NP question 的魅力所在,因为只需要一种算法就可以证明大量被认为难以解决的问题实际上可以有效地解决。

更正式地说,NP 中的问题称为 NP-完全如果在多项式时间内,您可以转换任何其他 NP 的任何实例> 问题转化为该问题的一个实例。上面的权重问题就是这样一个问题,确定whether a boolean formula has a satisfying assignment,解决整数上的某些优化问题(integer programming),确定访问一组位置的最快路线(traveling salesman),或者确定如何使用最少的频率(graph coloring)在城市中分配蜂窝塔。即使确定是否有可能解决像Sudoku 和minesweeper 这样的游戏,对于任意棋盘大小都是NP-完成的。

(有些问题具有后一种性质 - NP 中的任何问题都可以有效地转换为该问题 - 但它们本身并不属于 NP。这些问题被称为NP-很难。)

从实际的角度来看,如果您曾被要求解决已知为 NP-complete 或 NP-hard 的问题,请不要期望找到在任何合理的时间内得到精确的解决方案。在某些情况下,甚至不可能在任何精度内有效地近似解。你最好寻找一个替代问题来尝试解决,或者让自己接受一个在大多数但不是所有情况下都表现良好的启发式解决方案。

至于你最初认为 DFS 是 NP-complete 的,只有 problems 可以是 NPNP强>-完成;算法不能。 DFS 是一种解决图可达性问题的算法——给定图中的两个节点,是否有从第一个节点到第二个节点的路径?这个问题在 NP 中,因为如果有一条路径很容易检查,但它(可能)不是 NP 完整的,因为我们知道我们可以在多项式时间内使用DFS。

希望这会有所帮助!

【讨论】:

如果预言机可以保证生成正确的答案,那么您为什么需要能够验证它们呢? :) @Brian Gordon- 这个想法是非确定性算法总是能正确猜测如果有正确答案。输入问题可能根本没有解决方案。因此,算法需要他们验证它的答案是否正确,这样如果没有正确的猜测,它可以检测到它所做的猜测是无效的。

以上是关于什么是 NP 和 NP 完全问题? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

什么是NP完全问题

MAS 714笔记: NP完全问题

所有的 NP 问题也是 NP 完全的吗?

NP和co-NP有啥区别

numpy.exp() 到底是做啥的? [关闭]

对于 np.array 中的每个元素,找到具有相同元素值的最大索引 [关闭]