NP 完全性理论 - 算法学习前的引论 or 算法学习后的展望

2023-12-30 02:18

本文主要是介绍NP 完全性理论 - 算法学习前的引论 or 算法学习后的展望,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文参考自:https://blog.csdn.net/liusiqian0209/article/details/49837447

这就是一个对问题解决算法进行讨论的根本理论,主要关注所有问题是否都存在能够在多项式时间内解决的算法的问题。

一、基本概念:

1. P 问题:利用多项式时间能解决的问题。

2. NP 问题:利用多项式时间能够验证问题的一个解是否正确的问题。

3. 归约:对问题进行一般性质的归纳,可以对问题要求的结果进行一定逻辑上的转换。

               若归约后的问题能在多项式时间内解决,则原问题也可以。

注:

多项式时间就是指算法时间复杂度能由多项式表示

显然有 P⊆ NP,即能在多多项式时间内解决的问题一定能在多项式时间内验证

P问题称为多项式问题,NP问题称为非确定性多项式问题

二、NP 完全问题:

NPC 问题(NP 完全问题):所有 NP 问题都可以归约到的问题。解决了该问题,就解决了所有的 NP 问题。

NPC 问题示例:

  • 可满足性问题:对于N个布尔类型的变量,它们之间采用“与”,“或”,“非”这样的逻辑运算符连接,那么这些变量能否找到一组合适的取值,使得最终的运算结果为真。
  • 团问题:对于任意两个人,要么是好友,要么不是好友。那么能否找到一个人数为50个人的团体,使得他们两两之间彼此都是好友?
  • 哈密顿回路
  • 旅行商问题
  • 最大割问题

三、 P=NP 与 P ≠ NP:

P 是否等于 NP 是目前还没得出结论的一个问题。

简单来说,由于 P⊆ NP ,我们只需考虑 NP 是否 ⊆ P,即能用多项式时间验证的问题是否一定有多项式时间内解决的方法

要确定上述问题,需要用(二)中提到的方法对所有 NP 问题进行归约,得到 NPC 问题,并对其进行证明。

1. P = NP:

要证明 P=NP ,只需给出任意一个 NPC 问题的多项式复杂度的解决方案即可。

2. P ≠ NP:

需要证明所有 NPC 问题都不存在多项式时间的解决方案。

展望:

        现在的很多设计都是基于P≠NP之上的,那么假如某一天证明了P=NP。我们的生活将发生巨大的改变:在生物学方面,我们能够很快地完成基因测序工作;对于一个机器学习系统,能够很快的得到令人满意的特征选择;如果从犯罪现场提取到罪犯的DNA,我们能在第一时间确定他是谁。不过,这也同样会带来问题:比如当前信息在网络传输中使用MD5来校验,以检查是否在中途被篡改,不过在P=NP之后,这种校验方式就不再可靠了。同样,对于RSA加密算法,也可以很快地计算出密钥。
       人们在证明P≠NP的道路上已经走过了数十年,目前仍没有得到一个有说服力的答案。如果要证明不存在有效的算法解决那些 NP 完全问题,不仅要指明现有的算法无法解决,还要论证未来发明的算法也无法解决,那么如何证明一个还没有出现的东西就必将失败呢?
       也许终有一天,有一位旷世奇才找到了打开宝箱的钥匙。不过在那之前,所有的科学家们还需要在这条荆棘路上摸索很长一段时间。

补充:NP 难问题

NP 难问题:无法通过多项式时间验证的问题或通过 NPC 问题归约到的问题

对于 NP 难问题,即使 P=NP, 也不一定存在有效的解决方案。 

NP 难问题示例:

  • 围棋问题:在一个围棋棋盘上摆出一个残局=,现在问如果执黑棋的选手每一步都选择在最优的位置下子,那么他是否一定能赢?这个问题没有人能在多项式时间内猜到一个必胜的下子位置并且证明它是对的,因为你的决策与对方的下子位置有关。而你的决策又会对对方下一步的下子位置产生影响,因此如此走下去,需要大量的时间和巨大的存储空间进行推导。
  • 机器学习中的特征选择问题:当发现你的学习系统存在过拟合时,你可能会考虑要减少特征的数量。如果当前的输入特征数为n,那么需要从这些特征中选择一个子集。对于其中每一个特征,我们都可以选择留下它或者抛弃,那么一共会产生2ⁿ种方案。对于其中任意一种方案,通过训练样本,然后进行交叉验证得到一个效果的衡量,但我们很难通过这个衡量来验证这个方案是不是全局最优的,即一般性误差(generalization error)最小。因此普遍认为选取全局最优的特征子集是一个NP难问题。

解决 NP 难问题:

  • 对原问题进行一定的条件约定
  • 退而求其次:如上面提到的机器学习中的特征选择问题,通常采取的做法是使用前向搜索这样的启发式算法:每次从所有未选择的特征中选择一个使评价结果最佳的特征,加入到备选子集中,直到加入任何特征时评价结果无法更好,或者达到了限定的特征数。这样做不能保证达到全局最优,不过却使得实现起来变得可能。

这篇关于NP 完全性理论 - 算法学习前的引论 or 算法学习后的展望的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/551401

相关文章

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert