让我们从“不确定性”开始。确定性机器一次可以处于一种状态。我们实际上可以制造它们。非确定性机器是一种理论构造,一次可以处于多个状态。 (此处与量子计算有相似之处,但出于我们的目的,它们具有误导性。忽略它们。)
如果我们想用确定性机器解决问题,我们启动它,它会通过一系列步骤来尝试找到问题。如果我们使用非确定性机器进行建模,它可以同时执行所有可能的一系列步骤。
我们要关注的一组问题是决策问题:给定一个问题陈述,要么有解决方案,要么没有解决方案。找到解决方案或报告没有解决方案。例如,假设你有一组逻辑语句:A or not-B, B or C or D, not-D or A or B, .... 给定一个任意集合,你能找到所有变量的真值吗?这样所有的陈述都是真的吗?
现在,让我们考虑 P。假设我们用 n 表示问题的大小。大小可以是旅行商问题中的城市数量,上述问题中逻辑语句的数量,等等。给定某个 n,在给定系统上解决问题将需要一定数量的资源。现在,如果我们将资源或计算能力加倍,我们可以解决的问题规模会发生什么变化?如果问题是多项式复杂性,这意味着在 P 中,大小会增加一定比例。它可能会翻倍,或上涨 40% 或 10%。相反,如果它具有指数复杂性,则大小会增加一定数量。我们通常认为 P 问题是可解决的,而指数问题则随着问题变大而无法解决,尽管这是一种简化。从非正式的角度来看,多项式复杂性能够按顺序解决问题,而指数式则必须查看所有可能的组合。
假设我们可以在确定性机器上以多项式时间解决问题。问题在 P 中。假设我们可以在非确定性机器上以多项式时间解决它,这与能够在确定性机器上以多项式时间验证提出的解决方案相同。那么问题就出在NP上。这里的诀窍是我们不能制造真正的非确定性机器,因此问题存在于 NP 中的事实并不意味着它可以解决。
现在进入 NP-complete。 P中的所有问题都在NP中。对于 NP 中的问题 A 和 B,我们可以说如果 A 在 P 中,那么 B 也是。这是通过找到一种方法将 B 重述为 A 类问题来完成的。 NP 完全问题是这样一个问题,如果它在 P 中,那么 NP 中的每个问题都在 P 中。正如您可能猜到的那样,找到一种方法将每个可能的问题重述为一个特定的问题并不容易,我会只是说上面的逻辑语句问题(可满足性问题)是第一个被证明的 NP 完全问题。之后就容易多了,因为只需要证明如果问题 C 在 P 中,那么可满足性也是。
人们普遍认为 NP 中存在问题但 P 中没有问题,并且最近发布了一个证明(这可能会或可能不会被证明是有效的)。在这种情况下,NP 完全程序是 NP 中最难的一类问题。
有些问题不适合这种模式。旅行商问题,正如通常所提出的,是找到连接所有城市的最便宜的路线。这不是决策问题,我们无法直接验证任何提议的解决方案。我们可以把它重述为一个决策问题:给定成本 C,有没有比 C 更便宜的路线?这个问题是 NP 完全的,只需一点点工作,我们就可以像修改后的 NP 完全形式一样简单地求解原始 TSP。因此,TSP 是 NP 难的,因为它至少与 NP 完全问题一样难。