与 P 和 NP 问题相关的混淆

计算科学 算法
2021-12-20 05:00:55

我有这种与 P 和 NP 问题有关的困惑。为什么 P 是 NP 的子集?我没明白。P 问题可以在多项式时间内解决。然而,NP 问题只能验证一个解是否正确,而不是在多项式时间内。那么为什么 P 是 NP 的子集呢?

1个回答

你的想法的缺陷是这样的陈述:“NP问题不能[在多项式时间内解决]”。换句话说,您似乎认为 NP 是 P 的对立面。这是不正确的。

NP 类包含所有可以在多项式时间内验证检查其解决方案的问题——但它没有为问题的解决难度设置任何条件也就是说,NP 类的标准比 P 类更容易满足。

老实说,关于该主题的Wikipedia 页面对此事提供了相对不错的概述。他们给出的 NP 问题示例是“子集和问题”:

考虑子集和问题,这是一个易于验证的问题示例,但其答案可能难以计算。给定一组整数,它们中的某个非空子集的总和是否为 0?例如,集合 {−2, −3, 15, 14, 7, −10} 的子集加起来是否为 0?答案“是的,因为 {−2, −3, −10, 15} 加起来为零”可以通过三个加法快速验证。但是,没有已知的算法可以在多项式时间内找到这样的子集(但是,在指数时间内有一个算法,它包括2n1尝试),并且确实只有当 P = NP 时才能存在这样的算法;因此这个问题存在于 NP 中(可快速检查),但不一定存在于 P 中(可快速解决)。

如果给定一组非常大的整数,那么找到一个加起来为零的非空子集非常昂贵;但是给定一个潜在的解决方案,验证它是否是一个有效的解决方案是非常简单的。