【算法基础】P问题、NP问题、NP-Hard问题、NP-Complete问题

news2025/8/3 13:10:53

P问题、NP问题、NP-Hard问题、NP-Complete问题

  • 前提
    • 1. 时间复杂度:
    • 2. 约化(Reducibility)
  • P问题
  • NP问题
  • NPHard问题
  • NP-Complete问题
  • 其它:

前提

1. 时间复杂度:

在这里插入图片描述

2. 约化(Reducibility)

  • 如果能找到一个变化法则,对任意一个A程序的输入,都能按照这个法则变换成B程序的输入,使两程序的输出相同,那么我们说,问题A可以约化为问题B。
  • 一个问题A可以约化为问题B的含义是,可以用问题B的解法解决问题A。(也可以简单理解,问题A是B的一种特殊情况。)
  • 例如求解一元一次方程这个问题可以约化为求解一元二次方程,即可以令对应项系数不变,二次项的系数为0,将A的问题的输入参数带入到B问题的求解程序去求解。
  • 约化还具有传递性,A可以化约为B,B可以约化为C,那么A也可以约化为C

P问题

  • 可以在多项式时间内,解决的问题
  • 复杂度在以下区间内:
    在这里插入图片描述
  • 该算法的时间复杂度是多项式级的,比如n个数中间找到最大值,或者n个数排序。

NP问题

  • 可以在多项式时间内,验证一个解的问题
  • (Non-deterministic Polynomial非确定性多项式问题)
  • 理解:
  • 不知道这个问题存不存在一个多项式时间的算法,所以叫非确定性(non-deterministic),但是我们可以在多项式时间内验证并得出这个问题的一个正确解。举例:

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

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

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

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

为了证明这个千古难题,科学家想出了很多办法。其中之一就是问题的约化。所谓问题约化就是,可以用问题B的算法来解决A ,我们就说问题A可以约化成问题B。约化是具有传递性的,如A约化到B,B约化到C,A就可以约化到C,同时不断约化下去,我们会发现一个很惊人的特性,就是他一定会存在一个最大的问题,而我们只需要解决了这个问题,那其下的所有问题也就解决啦!这就是我们所说的NPC问题的概念

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

  • P一定属于NP
    多项式时间内解决,那多项式时间内一定能验证
  • NP-Complete一定是NP
  • 是NP的NP-Hard是NP-Complete,也有不是NP的NP-Hard

(2)右图

  • P一定是NP
    多项式时间内解决,那多项式时间内一定能验证
  • NP-Complete一定是NP
  • 是NP的NP-Hard是NP-Complete

NPHard问题

  • 所有NP问题都能多项式时间内归约(可理解为转化)到X(复杂度大于等于原NP问题)问题,X是NP-Hard问题
  • 所有的NP问题都能约化到它,但是它不一定是一个NP问题

NP-Complete问题

  • 所有NP问题都能多项式时间内归约(可理解为转化)到X(复杂度大于等于原NP问题)问题,且X是NP问题,X是NP-Complete问题

  • 定义要满足2个条件: 它得是一个NP问题;所有的NP问题都可以约化到它

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

  • 常见的NP-Complete问题:
    逻辑电路,Hamilton问题、旅行商问题
    在这里插入图片描述

其它:

  • P一定是NP
    多项式时间内解决,那多项式时间内一定能验证
  • NP是否为P未解决

https://www.bilibili.com/video/BV1Wz4y1d7wb/?spm_id_from=333.337.search-card.all.click
https://zhuanlan.zhihu.com/p/73953567
https://zhuanlan.zhihu.com/p/99515528

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/34831.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【华为OD机试真题 python】 转骰子【2022 Q4 | 200分】

■ 题目描述 【转骰子】 骰子是一个立方体,每个面一个数字,初始为左1,右2,前3(观察者方向),后4,上5,下6,用123456表示这个状态,放置在平面上, 可以向左翻转(用L表示向左翻转1次), 可以向右翻转(用R表示向右翻转1次), 可以向前翻转(用F表示向前翻转1次), 可以…

力扣(LeetCode)71. 简化路径(C++)

模拟 对于路径 pathpathpath ,遇到 ′/′/′/′ 则操作,遇到其他字符则保存名字。操作有如下几种: 1.名字是 "."".""." 或 """""" 不操作,前者表示在当前目录,后者…

代码管理工具知多少?来看看Git怎么用吧

一. 代码管理工具简介 说到代码工具,许多工作了的小伙伴一定很有发言权。因为我们在实际开发环境中,就代码的复杂度和逻辑度,对于开发工程师来说,都是极具挑战性的。如果单靠个人来完成单个项目的整体开发,那无疑是难…

baostock均线数据怎么描出图形表示?

baostock主要是用量化交易者的一个开放数据的源头系统,其功能可以提供大量准确、完整的证券历史行情数据、上市公司财务数据等服务。利用python API获取证券数据信息,满足量化交易投资者、数量金融爱好者、计量经济从业者数据需求等,同样&…

重点,一文掌握ReentrantLock加解锁原理!|原创

本文详细讲解了 ReentrantLock 加锁和释放锁的原理,以及和 Synchronized 的对比。本文较长,建议收藏!点击上方“后端开发技术”,选择“设为星标” ,优质资源及时送达简要总结 ReentrantLock实现原理:volati…

Arduino ESP32使用U3115S芯片控制H桥驱动有刷直流电机

Arduino ESP32实现互补PWM输出 问题提出半桥驱动电路必须是PWM互补输入才能工作Arduino ESP32的互补PWM控制问题提出 直流有刷电机控制使用U3115S芯片。芯片是电压高达300V的半H桥驱动电路,管脚说明: NumberSymbolDescription1VCC低侧固定逻辑电源输入…

牛客网——verilog练习题思路汇总

目录 基础语法 VL1 四选一多路器 VL2 异步复位的串联T触发器 VL3 奇偶校验 VL4 移位运算与乘法 VL5 位拆分与运算 VL6 多功能数据处理器 VL7 求两个数的差值 VL8 使用generate…for语句简化代码 VL9 使用子模块实现三输入数的大小比较 VL10 使用函数实现数据大小端转…

智慧城市建设的原则及规划目标

一、建设原则 智慧城市建设过程中必须把握以下原则: (一) 遵循市信息化建设总体规划与发展框架。遵循 “十二五” 信息化规划确定的“紧紧围绕国家西部大开发战略目标,强化信息技术和信息化在我市加快推进新型工业化进程中的战略…

数据库周期表整体设计方案

这是学习笔记的第 2442篇文章数据库周期表是我们自定义的名称,从数据视角来说,通常会有三类数据表:字典表,状态表,日志表,其中周期表从定位上更侧重于日志表。为什么叫周期表,主要是因为日志数据…

看着2022年世界杯,我无比怀念98世界杯

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 断断续续看了2022年世界杯部分比赛,我无比怀念1998年世界杯!该文权当本人的一点回忆文字,没有经过严谨认证&#xff0…

2023年第三届智能制造与自动化前沿国际会议(CFIMA 2023)

2023年第三届智能制造与自动化前沿国际会议(CFIMA 2023) 重要信息 会议网址:www.cfima.org 会议时间:2023年6月9-11日 召开地点:中国大理 截稿时间:2023年4月20日 录用通知:投稿后2周内 收录检索:EI,…

IDEA创建父子项目

一、搭建父项目 创建第一个maven项目作为父项目 创建完之后建议删掉src文件夹 pom.xml <packaging>POM</packaging><!--依赖版本的锁定--><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</pr…

Linux-Nginx前端项目部署

目录 一、Nginx简介 负载均衡 动静分离 二、Nginx安装 Tomcat负载均衡 准备2个tomcat 修改此三处 修改后保存 启动两个Tomcat 修改Tomcat主界面​编辑 Nginx配置 查看nginx.conf配置 添加/更改配置​编辑 重启Nginx服务&#xff0c;让配置生效 出现权限问题 测试N…

计算机组成原理4小时速成:I/O系统,IO指令,编址方式,串行并行,程序查询传送,中断程序传送,DMA传送,接口组成

计算机组成原理4小时速成&#xff1a;I/O系统&#xff0c;IO指令&#xff0c;编址方式&#xff0c;串行并行&#xff0c;程序查询传送&#xff0c;中断程序传送&#xff0c;DMA传送&#xff0c;接口组成 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#x…

verilog generate

Verilog 生成块generate块允许乘以模块实例或执行任何模块的条件实例化。它提供了基于 Verilog 参数构建设计的能力。当需要多次重复相同的操作或模块实例&#xff0c;或者必须根据给定的 Verilog 参数有条件地包含某些代码时&#xff0c;这些语句特别方便。generate块不能包含…

centos7 clamav 杀毒软件安装

壹&#xff1a;编译安装 1&#xff0c;官网获取源码包 clamav官网地址 2&#xff0c;创建clamav 用户和存放病毒库目录 a, 创建clamav 用户和用户组 groupadd clamav && useradd -g clamav clamav && id clamavb,日志存放目录 mkdir -p /henan/clamav/lo…

Spring中的ApplicationContext所体现出来的工厂模式

Spring初体验 通常我们写代码时&#xff0c;先定义一个Class&#xff0c;然后再别的地方实例化&#xff0c;再进行调用&#xff0c;比如下边的Hello World的例子&#xff0c;类Hello有一个say()方法&#xff0c;用于打印出“Hello World”的字符串&#xff0c;另一个类App&…

python和R绘制箱线图+抖动点

python和R绘制箱线图抖动点 散点箱线图 IPCC AR6 https://www.ipcc.ch/ 通过散点展示数据的直观分布 x轴刻度标签如果是“连续”数据&#xff0c;可添加渐变背景。通过渐变来体现升温幅度&#xff0c;美观形象。 python版本&#xff1a; 先手搓数据&#xff1a; import pan…

【构建ML驱动的应用程序】第 11 章 :监控和更新模型

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

c++11 unique_lock 使用

我们知道c11 提供了很多的类模板供我们使用&#xff0c;其中就有 lock_guard&#xff0c;这个用法也很简单&#xff0c;像这样&#xff1a; std::mutex m_mutex; std::lock_guard<std::mutex> guard(m_mutex); mutex 的 lock 和 unlock 完全是自动的&#xff0c;无需我…