P/NP/NP-Complete/NP-Hard

本文详细介绍了计算复杂度理论中的P问题、NP问题、NPC问题及NP-Hard问题的概念,并通过具体示例帮助理解这些概念之间的区别与联系。
部署运行你感兴趣的模型镜像

记得学计算理论的时候,似乎对这五个问题很清晰,但当时也不知道这个有什么用,所以很快又忘掉了。

现在想想,这个理论基础还是必须的,至少在划分算法复杂度上这是一个理论基石。

 

先看他们的定义:

 

P问题:可以通过确定性图灵机在多项式时间内求解。

NP问题:可以通过非确定性图灵机在多项式时间内求解。 或者说,可以在多项式时间内验证一个解。

              NP 中的 N 是指非确定的(non-deterministic)算法,这是这样一种算法:(1)猜一个答案。(2)验证这个答案是否正确。  (3)只要存在某次验证,答案是正确的,则该算法得解。 NP (non-deterministic polynomial)问题就是指,用这样的非确定的算法,验证步骤(2)有多项式时间的计算复杂度的算法。 
              NP问题的例子,Hamilton回路(在图中找一条环路,它经过且只经过一次每一个点)。
              非NP问题,无法在多项式时间内验证解。例子:问一个图是否不存在Hamilton回路。(除非穷举所有可能,否则无法验证)

NPC问题:它满足如下两个条件:
                1.是NP问题。
                2.所有的NP问题都能规约为它。具体参考百度百科NPC问题
               俗语就是,到现在还找不到多项式时间解法的NP问题,只能用指数级甚至阶乘级的复杂度的搜索。
               因为所有的NP问题都能规约为NPC问题,如果一个NPC问题存在多项式时间的解法,那么会得出P=NP=NPC,所以,目前人们不相信NPC问题存在多项式时间的解法。
                NPC问题的例子:逻辑电路问题。给定一个逻辑电路(比如输入接上若干与非门),是否存在一个输入使其输出为True?

NP-Hard问题:所有的NP问题都能规约到它,但它不一定是NP问题。具体参考百度百科NP-hard。“旅行推销员问题”,简称“TSP”。即“已给一个n个点的完全图,每条边都有一个长度,求总长度最短的经过每个顶点正好一次的封闭回路”。还有一个典型的例子,就是输出n个元素的全排列。即使是非确定机,也不能在多项式时间内解决,这是一个NP-hard问题。

 

P和NP给出两个基本概念,而NPC才是我们实际情况遭遇到的问题,NP-hard是比NPC更大的一个范畴,是否对于只能通过穷举才能解决的问题,我们都可以说这是NP-hard呢?如果P!=NP就可以这样说。

NP-hard问题和NP-C问题都是在NP问题的基础上定义的, NPC是NP-hard和NP的交集,目前认为NP-hard的大型实例不存在精确解法,只能近似求解。

 

问题的归约
这……我该用什么术语来解释呢?集合?太难说清了……如果你还记得函数的映射的话就比较容易想象了。
大致就是这样:找从问题1的所有输入到问题2的所有输入的对应,如果相应的,也能有问题2的所有输出到问题1的所有输出的对应,则若我们找到了问题2的解法,就能通过输入、输出的对应关系,得到问题1的解法。由此我们说问题1可归约到问题2。

 

 主要参考:

http://wenda.tianya.cn/wenda/thread?tid=2c7e8813511b9f81

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### P类问题 P类问题是指能够在多项式时间内解决的问题。这意味着存在一个算法,可以在输入规模为 \(n\) 的情况下,在 \(O(n^k)\) 的时间复杂度内解决问题,其中 \(k\) 是某个常数[^5]。 ```python # 示例:排序问题属于P类问题 def bubble_sort(arr): n = len(arr) for i in range(n): for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] return arr ``` ### NP问题 NP问题是指其解可以在多项式时间内被验证的问题。换句话说,如果给出一个候选解,可以迅速判断该解是否正确。例如,子集求和问题是典型的NP问题[^5]。 ```python # 示例:验证子集求和问题的解 def verify_subset_sum(subset, target): return sum(subset) == target ``` ### NP-Hard问题 NP-Hard问题是指所有NP问题都可以在多项式时间内归约为这类问题。也就是说,为了解决一个问题A,可以先将问题A归约为另一个问题B,并通过解决B间接解决A。需要注意的是,NP-Hard问题不一定属于NP问题,因为它可能不存在多项式时间内的验证方法[^2]。 ### NP-Complete问题 NP-CompleteNPC)问题既是NP问题,也是NP-Hard问题。这意味着NPC问题不仅可以在多项式时间内验证解的正确性,而且所有NP问题都可以在多项式时间内归约为NPC问题[^3]。 ```python # 示例:SAT问题是第一个被证明的NPC问题 def sat_problem(variables, constraints): # 检查是否存在满足约束的变量赋值 pass ``` ### 区别与联系 1. **P类问题**是NP问题的一个子集,即所有P类问题都属于NP问题,但反之不成立。 2. **NP-Hard问题**不一定属于NP问题,而**NP-Complete问题**必须同时属于NP问题NP-Hard问题[^4]。 3. 如果能够找到一个NP-Complete问题的多项式时间解法,则所有NP问题都可以在多项式时间内解决[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值