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

相关文章

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

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

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig