该文章为转载,更正了原作者的一些笔误

在讲P类问题之前先介绍两个个概念:多项式,时间复杂度。(知道这两概念的可以自动跳过这部分)

1. 多项式:axn−bxn−1+cax^n-bx^{n-1}+caxn−bxn−1+c

恩…就是长这个样子的,叫 xxx 最高次为 nnn 的多项式…

咳咳,别嫌我啰嗦。。有些人说不定还真忘了啥是多项式了。。例如第一次看到的鄙人→_→

2. 时间复杂度

我们知道在计算机算法求解问题当中,经常用时间复杂度和空间复杂度来表示一个算法的运行效率。空间复杂度表示一个算法在计算过程当中要占用的内存空间大小,这里暂不讨论。时间复杂度则表示这个算法运行得到想要的解所需的计算工作量,他探讨的是当输入值接近无穷时,算法所需工作量的变化快慢程度。

举个例子:冒泡排序。

在计算机当中,排序问题是最基础的,将输入按照大小或其他规则排好序,有利于后期运用数据进行其他运算。冒泡排序就是其中的一种排序算法。假设手上现在有n个无序的数,利用冒泡排序对其进行排序,

①首先比较第1个数和第2个数,如果后者>前者,就对调他们的位置,否则不变

②接着比较第2个数和第3个数,如果后者>前者,就对调他们的位置,否则不变

③一直向下比较直到第n-1和第n个数比较完,第一轮结束。(这时候最大的数移动到了第n个数的位置)

④重复前三步,但是只比较到第n-1个数(将第二大的数移动到第n-1个数位置)

⑤持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

举个实例:5,4,3,2,15,4,3,2,15,4,3,2,1 对其进行排序,先是比较 555 跟 444 变成 4,5,3,2,14,5,3,2,14,5,3,2,1 ,第一轮结束后变成 432154321543215,可以计算,当对其排序完正好要经过 4+3+2+1=104+3+2+1=104+3+2+1=10 次比较,当然这是最复杂的情况,即完全反序。可以知道对于 nnn 个数,至多要经过 1+2+...+n−11+2+...+n-11+2+...+n−1 即 (n2−n)2\frac{(n^2-n)}{2}2(n2−n)​ 次比较才能排好序。这个式子里 nnn 的最高次阶是 222 ,可知道当 n→∞n\rightarrow \inftyn→∞ 时,一次性对其比较次数影响很小,所以我们把这个算法的时间复杂度比作:O(n2)O(n^2)O(n2) 。取其最高次,可以看出,这是一个时间复杂度为多项式的表示方式。

时间复杂度排序 O(1)<O(lgn)<O(n)<O(n2)<O(na)<O(en)O(1)<O(lgn)<O(n)<O(n^2)<O(n^a)<O(e^n)O(1)<O(lgn)<O(n)<O(n2)<O(na)<O(en)( a>2a>2a>2 ,nnn 表示输入的数据个数,O(1)O(1)O(1) 为常数级别)

好了,介绍完上面的概念就可以开始讲关于什么叫 P 类问题了。以上个例子冒泡排序为例,我们知道了,在排序这个大问题里,是可以找到一种时间复杂度为多项式 O(n2)O(n^2)O(n2) 的算法(如冒泡排序法)来求解排序问题的,所以我们说排序问题是一个有多项式时间算法的问题。

所以我们称,

(1)P 类问题:存在多项式时间算法的问题。(P:polynominal,多项式)

然后扯个题外话,为什么我们要研究这个?因为计算机处理的输入常常不是那么几十个几千个那么一点点,想象一下,当计算机处理的数据达到100万个的时候,时间复杂度为 O(n2)O(n^2)O(n2) 和 O(en)O(e^n)O(en) 的算法,所需的运行次数简直是天壤之别, O(en)O(e^n)O(en) 指数级的可能运行好几天都没法完成任务,所以我们才要研究一个问题是否存在多项式时间算法。而我们也只在乎一个问题是否存在多项式算法,因为一个时间复杂度比多项式算法还要复杂的算法研究起来是没有任何实际意义的。

好了,接下来我们介绍 NP,先给定义,

(2)NP 类问题:能在多项式时间内验证得出一个正确解的问题。(NP:Nondeterministic polynominal,非确定性多项式)

P 类问题是 NP 问题的子集,因为存在多项式时间解法的问题,总能在多项式时间内验证他。

注意定义,这里是验证。NP 类问题,我用个人的俗话理解就是,不知道这个问题是不是存在多项式时间内的算法,所以叫non-deterministic非确定性,但是我们可以在多项式时间内验证并得出这个问题的一个正确解。举个例子,

著名的 NP 类问题:旅行家推销问题(TSP)。即有一个推销员,要到 nnn 个城市推销商品,他要找出一个包含所有 nnn 个城市的环路,这个环路路径小于 aaa 。我们知道这个问题如果单纯的用枚举法来列举的话会有 (n−1)!(n-1)!(n−1)! 种,已经不是多项式时间的算法了,(注:阶乘算法比多项式的复杂)。那怎么办呢?我们可以用猜的,假设我人品好,猜几次就猜中了一条小于长度 aaa 的路径,我画画画画,好的,我得到了一条路径小于 aaa 的环路,问题解决了,皆大欢喜。可是,我不可能每次都猜的那么准,也许我要猜完所有种呢?所以我们说,这是一个 NP 类问题。也就是,我们能在多项式的时间内验证并得出问题的正确解,可是我们却不知道该问题是否存在一个多项式时间的算法,每次都能解决他(注意,这里是不知道,不是不存在)。

所以这就引出了这类讨论的一个千年问题:是否 NP 类问题 = P 类问题 ?

即,是否所有能在多项式时间内验证得出正确解的问题,都是具有多项式时间算法的问题呢?

太让人震惊了,要是解决了这个问题,那岂不是所有的 NP 问题都可以通过计算机来解决?

圣战的结果是,有的存在,有的不存在。=_=

在这场圣战中,人们还发现了很多的东东,也就是我们接下来要介绍的 NPC 问题(啊喂,我不是游戏 NPC ) 和 NPH 问题。

(PS :网络上经常有人说,这不是个 NP 问题吗,其实很多时候他们说的应该是 NPC 问题,而不是 NP 问题)

为了证明这个千古难题,科学家想出了很多办法。其中之一就是问题的约化。所谓问题约化就是,可以用问题B的算法来解决A ,我们就说问题 A 可以约化成问题 B。举个例子,一元一次方程的求解,跟二元一次方程的求解,我们知道,只要能求解二元一次方程,那就可以用二元一次方程的解法来求解一元一次方程,只需要将一元一次方程加上 yyy ,并附加一个方程 y=0y=0y=0 就可以将一元一次方程变形为一个二元一次方程,然后用二元一次方程的解法来求解这个方程。注意,这里二元一次方程的解法会比一元一次的复杂。所以我们说,只需要找到解二元一次方程的规则性解法,那就能用这个规则性解法来求解一元一次方程。从这里也可以看出,约化是具有传递性的,如A约化到B,B约化到C,A就可以约化到C,同时不断约化下去,我们会发现一个很惊人的特性,就是他一定会存在一个最大的问题,而我们只需要解决了这个问题,那其下的所有问题也就解决啦!这就是我们所说的 NPC 问题的概念!!!

引到 NP 问题里就是,对于同一类的所有的 NP 类问题,若他们都可以在多项式时间内约化成最难的一个 NP 类问题,(我们直观的认为,被约化成的问题应具有比前一个问题更复杂的时间复杂度)当我们针对这个时间复杂度最高的超级 NP 问题要是能找到他的多项式时间算法的话,那就等于变向的证明了其下的所有问题都是存在多项式算法的,即 NP = P !!!!给出 NPC 问题定义。

(3)NPC 类问题(Nondeterminism Polynomial complete):存在这样一个 NP 问题,所有的 NP 问题都可以约化成它。换句话说,只要解决了这个问题,那么所有的 NP 问题都解决了。其定义要满足2个条件:

首先,它得是一个 NP 问题;

然后,所有的 NP 问题都可以约化到它。

要证明 NPC 问题的思路就是:

先证明它至少是一个 NP 问题,再证明其中一个已知的 NPC 问题能约化到它。

(4)NP 难问题(NP-hard 问题)

NP-Hard 问题是这样一种问题,它满足NPC问题定义的第二条但不一定要满足第一条(就是说,NP-Hard 问题要比 NPC 问题的范围广,NP-Hard 问题没有限定属于 NP ),即所有的 NP 问题都能约化到它,但是他不一定是一个 NP 问题。

NP-Hard 问题同样难以找到多项式的算法,但它不列入我们的研究范围,因为它不一定是 NP 问题。即使 NPC 问题发现了多项式级的算法, NP-Hard 问题有可能仍然无法得到多项式级的算法。事实上,由于 NP-Hard 放宽了限定条件,它将有可能比所有的 NPC 问题的时间复杂度更高从而更难以解决。

以上四个问题他们之间的关系可以用下图来表示:
这里写图片描述

[机器学习]P问题、NP问题、NP完全问题和NP难问题相关推荐

  1. [机器学习] 第一章 绪论 1.P问题、NP问题、NP完全问题和NP难问题

    参考:https://zhuanlan.zhihu.com/p/73953567 参考:https://blog.csdn.net/qq_21768483/article/details/804305 ...

  2. P、NP、NP完全问题、NP难问题

    可以在多项式时间内求解的问题称为易解的,而不能在多项式时间内求解的问题称为难解的. P类问题:多项式类型,是一类能够用(确定性的)算法在多项式的时间内求解的判定问题. 只有判定问题才属于P 不可判定问 ...

  3. NP-Hard?大白话学习P问题、NP问题、NP完全问题和NP难问题

    ## 该笔记自用为主,记录一些日常学习过程中看到的不熟悉的知识和从未接触过的知识,用于回看和记录.其中有一些个人理解,如有错误请讨论指正. 前言 在讨论这一串问题之前,我们需要复习两个概念. 1.多项 ...

  4. 什么是NP问题,什么是NP hard问题,什么是NP完全问题。

    http://www.cs.pitt.edu/~ztliu/wordpress/2011/05/np-problem/ 首先解释一下什么是NP问题,什么是NP hard问题,什么是NP完全问题. 看下 ...

  5. 【释义】NP complete概念浅析(涵盖:P问题,NP问题,NP完全问题,NP难问题)

    文章目录 前言 正文 1.P问题 2.NP问题 3.NP-complete问题(即:NP完全问题) 4.NP完全问题可能不会长久存在 5.示例 6.NP-Hard问题(即:NP难问题) 7.关系 小结 ...

  6. 排序 np_P问题、NP问题、NP完全问题和NP难问题理解

    P 问题 P类问题(P:polynominal,多项式):存在多项式时间算法的问题.以排序为例,在排序这个大问题里,是可以找到一种时间复杂度为多项式o(n^2),o(nlogn)的算法(如冒泡排序法, ...

  7. 【看了就懂】P问题、NP问题、NP完全问题和NP难问题

    为了避免对这四个问题有一定理解基础的人看的很烦,个人简单理解的四个问题: P问题:有多项式时间算法,算得很快的问题. NP问题:算起来不确定快不快的问题,但是我们可以快速验证这个问题的解. NP-co ...

  8. P问题、NP问题、NP完全问题和NP难问题概念梳理

    非"正规"问题 不可解问题:不存在解决算法的问题 例子:停机问题 不可能有复杂度O(多项式)问题 例子:输出从1到n这n个数的全排列(因为把结果打印出来也是O(n!)的复杂度) & ...

  9. pandas使用replace函数将所有的无穷大值np.inf替换为缺失值np.nan、使用pandas的fillna函数用经验固定值填充缺失值np.nan

    pandas使用replace函数将所有的无穷大值np.inf替换为缺失值np.nan(replace all infinities with a missing value).使用pandas的fi ...

最新文章

  1. ROS发行版列表完整版
  2. Excel VBA林木冠幅、分枝胸径字符串的拆解
  3. SmartOS之以太网精简协议栈TinyIP
  4. P1040,jzoj1167-加分二叉树【树形dp】
  5. 【javascript高级教程】JavaScript Array(数组) 对象
  6. redhat5中架设DHCP服务器与DHCP中继
  7. android+水滴粘性动画,Android控件实现水滴效果
  8. 【应用篇】WCF学习笔记(一):Host、Client、MetadataExchage
  9. 数组复制速度 System.arraycopy()clone() Arrays.copyof() for()探究
  10. Java中的ASCII码与Unicode码
  11. 解决Linux下Tomcat日志目录下的catalina.log日志文件过大的问题
  12. jquery1.8.3和1.11.3的用法区别
  13. Unity3D基础35:五彩砖块
  14. ACM 学习笔记(二) 位运算、并查集、模拟、枚举、递推、递归
  15. java学生管理系统遇到的难题_学生信息管理系统错误总结
  16. Android Shape 详细使用
  17. c语言pow函 新闻,c语言pow函数(C语言pow函数)
  18. 技嘉ide模式怎么改,电脑BIOS中怎么设置硬盘为IDE模式
  19. [Sdoi2008] Sue的小球
  20. 视频教程-微信公众号编辑器开发-微信公众号开发11-微信开发php-微信开发

热门文章

  1. 美颜sdk对于移动端视频直播的优化效果研究报告
  2. 利用CSS设置背景图片不显示的问题
  3. 国密SM2算法与RSA算法对比分析
  4. i77700hq跑matlab,I7 7700HQ 神舟笔记本出现这个代码...无解
  5. 回归问题中的MAE,MSE,MAPE与R方
  6. 通达信指标公式常用绘图函数(1)——DRAWNULL、NODRAW、PLOYLINE、DRAWSL
  7. indexDB本地存储
  8. 用JavaSwing 实现一个计算器
  9. 在Debian11 基础上安装 Proxmox VE 7 虚拟化平台
  10. 金九银十面试即将到来!字节内部数据结构与算法笔记,限时上线,Java程序员们准备好了吗?