谈一谈|如何理解NP问题

简介: 谈一谈|如何理解NP问题


一概念引入

1.1时间复杂度

在计算机处理一个问题时,往往需要一定的时间,假设把这个问题复杂化(将这个问题进行扩展),那么把计算机处理这类问题的时间变化速率,称为解决这种问题所用算法的时间复杂度。例如,一个枚举一定范围内的数字的问题,计算机所用时间会随着范围的变化而线性变化,由于是简单的枚举,所以时间复杂度可以记为O(n)n可以代表这个范围大小。在计算机处理问题时,由于算法设计不同,对应的时间复杂度也不一定相同。


1.2多项式级时间和非多项式级时间

在众多的时间复杂度中,根据其表达式的特点,可以大致将它们划分为两个范畴,一个是多项式级一个是非多项式级。它们各自表示什么意思呢?还记得高中数学中学习的函数吗,在学习不同函数时,最常做的一件事是观察它们的图像变化,可以发现,x作为底数的图像和x作为指数的图像在后期的变化简直有天壤之别。这也正是需要将时间复杂度划分的原因(多项式级的时间复杂度在后期变化远小于非多项式级),将n作为底数的时间复杂度归为多项式级,n作为指数的归为非多项式级。例如O(n)O(log(n))O(n^a)等就是多项式级的时间复杂度,像O(n!)O(a^n)就是非多项式级的复杂度。对于计算机来说需要处理的问题往往是很庞大的,如果采用非多项式级复杂度的算法,那么将浪费很大的资源。


1.3 P问题

在解释了多项式级和非多项式级时间复杂度之后,P问题的概念就简单了。对于众多的问题,通常把能够使用多项式级时间复杂度算法解决的问题称为P问题。


二什么叫NP问题

2.1 约化

一般,问题A可以约化为问题的B的解释是可以用解决问题B的方法解决问题A。简单的说,也就是问题A是问题B的另一种形式,且问题A的复杂程度要小于等于问题B。就像解方程组的问题,假如你会解二元一次方程组,那么你一定会解一元一次方程,在这个例子中,一元一次方程就是问题A,二元一次方程组就是问题B,问题A可以看作是问题B中另一个自变量系数为零的特殊“二元一次方程组”。那么解二元一次方程组的问题是否可以约化成解三元一次方程组问题呢?答案很明显是可以,同理的,解一元一次方程也可以约化成解三元一次方程组问题。可以看出,约化是具有传递性的,且如果问题A可以约化成问题B,则问题B的时间复杂度一定大于等于问题A的时间复杂度。


2.2 P=NP?

有了约化这个概念之后,可以发现所有的P问题都可以约化成NP问题。因为一个问题既然可以在多项式级时间内解决,那么对于验证一个解的正确性是肯定可以做到的,因此,如果把P问题看作一个集合PNP问题看作另一个集合NP,则P包含于NP。那么P=NP吗?答案尚未确定,这也是现在所常研究的“NP问题”的实质,这是一道世界难题,一旦解决这个问题,那么就意味着可以找出具有多项式级时间复杂度的算法来解决NP问题。


三新的问题

3.1 NP与NPC问题

前文提到确定P=NP的问题是一道世界难题,这是因为已知的NP问题远远多于P问题,且运用约化的概念,是否所有的NP问题也可以约化成同一个问题呢?这个问题的答案早已被证实是可行的,而且这种问题还不止一个,它们被称为NPC问题。很明显,NPC问题具有两个特点:它满足NP问题的条件,且所有的NP问题都可以约化成它。既然所有的NP问题都可以约化成NPC问题,那么只要能够在多项式级的时间复杂度下解决一个NPC问题,所有的NP问题也都能用同样的方法解决了,那么NP问题也就成了P问题。但是给一个NPC问题找出一个多项式级时间复杂度的算法的工作至今仍在进行中,因此,还是很难证明P=NP


3.2 NPC案例

逻辑电路是一个典型的NPC问题,什么叫做逻辑电路呢?一个逻辑电路由若干个输入,一个输出,若干“逻辑门”和密密麻麻的线组成。在逻辑电路问题中,需要找到不同输入的组合,使得输出的结果满足要求。

3.1.1 逻辑电路示意图

逻辑电路之所以是一个NPC问题,是因为你无法在多项式级的时间复杂度内解决它,但是要想验证一个解的正确性是很简单的,无论这个逻辑电路多么复杂,仍然只需要将每个点的状态带入进去就可以验证,属于O(n)的时间复杂度。


3.3 NPC与NP-Hard问题

NP-Hard问题和NPC问题的不同在于NP-Hard问题不一定是NP问题,因此,NP-hard问题的范围要大于NPC问题,同时,要为NP-Hard问题找到一个多项式级时间复杂度的算法也更加困难,这也是“Hard”的含义,可能NPC问题能够找到多项式级时间复杂度算法的时候NP-Hard问题仍然还无法完成这项工作。


PNPNPCNP-Hard问题的关系

在上述介绍中,可以知道,P问题包含于NP问题中,NPC问题同时包含于NP问题和NP-Hard问题,也就是它们的交集,则它们的关系可以如下表示。

4.1 PNPNPCNP-hard问题关系图

目录
相关文章
|
安全
软件体系结构 - Bell-LaPadula模型
软件体系结构 - Bell-LaPadula模型
507 4
|
JavaScript
Ant designe vue中有关<a-list>组件中 实现分页以及复选框效果
Ant designe vue中有关<a-list>组件中 实现分页以及复选框效果
918 0
|
7月前
|
传感器 人工智能 数据可视化
AI 驱动的 AR眼镜巡检技术方案:让工业缺陷识别更精准高效|阿法龙XR云平台​
针对电力、化工、制造等高风险场景,传统人工巡检效率低、漏检率高。我们推出AI+AR智能巡检方案,集成高清视觉与多传感器数据,采用轻量化YOLOv8-Nano和ResNet50模型实现缺陷实时检测与分级,结合ORB-SLAM3空间定位,在AR眼镜中精准叠加缺陷标注,识别准确率超95%,效率提升50%以上,助力巡检智能化、可视化、可追溯。
|
算法 容器
最详细版本|UI2Code智能生成Flutter代码——机器生成代码
作者: 闲鱼技术-上叶,余晏 背景   在《UI2CODE--整体设计》篇中,我们提到UI2Code工程的整体流程。前步图片分析之后,我们可以得到对应的DSL布局描述。利用DSL的资讯,结合IntelliJ Plugin介面工具,面向使用者提供生成对应Flutter代码。
13198 0
|
11月前
|
存储 关系型数据库 MySQL
NestJS 配置 TypeORM 进阶教程
本文介绍了在 NestJS 项目中配置 TypeORM 的三种方式:初级阶段直接在 AppModule 中配置;进阶阶段抽离出独立的 DatabaseModule;进一步使用自定义命名空间将数据库配置分离到单独文件,提升可维护性与模块化程度。
497 3
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
84_负提示:控制hallucination
在大语言模型(LLM)应用的浪潮中,我们常常惊叹于这些模型展现出的强大能力——它们能够进行复杂推理、生成高质量内容、回答专业问题,甚至进行创意写作。然而,与此同时,LLM也面临着一个显著的挑战:幻觉(hallucination)问题。这些"胡言乱语"或"无中生有"的内容不仅可能误导用户,还可能在关键应用场景中造成严重后果。
711 0
|
测试技术 API 开发工具
ElasticSearch7.6.x 模板及滚动索引创建及注意事项
ElasticSearch7.6.x 模板及滚动索引创建及注意事项
304 8
|
消息中间件 安全 Linux
深入探索Linux操作系统的内核机制
本文旨在为读者提供一个关于Linux操作系统内核机制的全面解析。通过探讨Linux内核的设计哲学、核心组件、以及其如何高效地管理硬件资源和系统操作,本文揭示了Linux之所以成为众多开发者和组织首选操作系统的原因。不同于常规摘要,此处我们不涉及具体代码或技术细节,而是从宏观的角度审视Linux内核的架构和功能,为对Linux感兴趣的读者提供一个高层次的理解框架。
|
数据挖掘 测试技术 BI
正交缺陷分类(ODC)流程简介及应用经验分享
正交缺陷分类(ODC)是一种缺陷分析方法,合理的把它运用在项目中,可以帮助测试、开发团队改进工作,从而提高产品质量。明确 ODC 的流程及各阶段的工作重点,并借鉴本文中提到的经验建议,会让读者在运用 ODC 时更加得心应手。
955 7
正交缺陷分类(ODC)流程简介及应用经验分享
|
存储 Python
Python while循环语句
Python while循环语句
601 0