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

相关文章

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

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

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

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