当前位置: 首页 > news >正文

计算机考研之数据结构:P 问题和 NP 问题

在算法的时间复杂度估算中,通常教材和题目中的估算结果包括: O ( 1 ) , O ( log ⁡ n ) , O ( n ) , O ( n ) , O ( n log ⁡ n ) , O ( n 2 ) , O ( n 3 ) , O ( log ⁡ log ⁡ n ) O(1),O(\log{n}),O(\sqrt{n}),O(n),O(n\log{n}),O(n^2),O(n^3),O(\log\log n) O(1),O(logn),O(n ),O(n),O(nlogn),O(n2),O(n3),O(loglogn) 等,这些时间复杂度之间,存在如下定性的大小关系:
O ( 1 ) < O ( log ⁡ log ⁡ n ) < O ( log ⁡ n ) < O ( n ) < O ( n ) < O ( n log ⁡ n ) < O ( n 2 ) < O ( n 3 ) O(1)\lt O(\log\log{n})\lt O(\log{n})\lt O(\sqrt{n})\lt O(n)\lt O(n\log{n})\lt O(n^2)\lt O(n^3) O(1)<O(loglogn)<O(logn)<O(n )<O(n)<O(nlogn)<O(n2)<O(n3)
其中, O ( log ⁡ log ⁡ n ) , O ( log ⁡ n ) , O ( n ) , O ( n ) , O ( n log ⁡ n ) , O ( n 2 ) , O ( n 3 ) O(\log\log{n}), O(\log{n}), O(\sqrt{n}), O(n), O(n\log{n}), O(n^2), O(n^3) O(loglogn),O(logn),O(n ),O(n),O(nlogn),O(n2),O(n3) 等称为多项式时间复杂度(Polynomial Time Complexity),可以统一表示为 O ( f ( n ) ) O(f(n)) O(f(n)) ,且 f ( n ) f(n) f(n) 为多项式。

如果从纯粹应付考试的角度来讲,知道上述内容就足够了。但是,如果作为一个未来的开发者,不能将仅仅以“考什么学什么”来要求自己,特别是在基础知识复习的时候,务必要多了解一些。本文即是对一般辅导资料的补充。

在算法复杂度理论中,多项式级的运行时间往往被认为是可接受的。某问题若可以用多项式复杂度的算法求解,则称该问题是可有效求解的,或者易解的。这样的问题也称为 P 问题(P,即 Polynomial,多项式)。

除了 P 问题之外,还有另外一类问题,只能用指数时间复杂度(Exponential Time Complexity)的算法求解,称为 NP 问题(即 Non-deterministic Polynomial Problem,非确定多项式问题),例如,计算斐波那契数列的一种算法的时间复杂度就是指数时间复杂度,即 T ( n ) = O ( a n ) , ( a > 1 ) T(n)=O(a^n),(a\gt1) T(n)=O(an),(a>1) 。一般认为,指数时间复杂度的算法无法真正应用于实际问题中,这类算法不是有效的算法。

P 问题

P 问题是指能够在多项式时间内解决的问题。这里的 “解决” 意味着存在一个算法,对于该问题的任何规模为 n n n 的输入实例,都能在 O ( n k ) O(n^k) O(nk) k k k 为常数)的时间内给出正确的答案。

例如,判断一个整数是否为偶数就是一个 P 问题。我们可以设计一个简单的算法,只需要检查该整数的最后一位是否为 0、2、4、6 或 8,这个操作的时间复杂度为 O ( 1 ) O(1) O(1) ,属于多项式时间复杂度。比如判断整数 1234,只看最后一位 4,就能在极短时间内得出它是偶数的结论。再如,计算两个矩阵的乘积也是一个 P 问题。通过标准的矩阵乘法算法,对于两个 n × n n \times n n×n 的矩阵,其时间复杂度为 O ( n 3 ) O(n^3) O(n3) ,同样在多项式时间内可解。像 3 × 3 3\times3 3×3 矩阵相乘,按照算法步骤就能在符合 O ( n 3 ) O(n^3) O(n3) 时间复杂度的情况下得出结果。

计算一组数字的平均值也是 P 问题。假设有 n n n 个数字,先将这 n n n 个数字相加,时间复杂度为 O ( n ) O(n) O(n) ,再除以 n n n ,这一步时间复杂度为 O ( 1 ) O(1) O(1) ,整体时间复杂度为 O ( n ) O(n) O(n) ,属于多项式时间复杂度。例如有 5 个数字 1、2、3、4、5,相加操作执行 5 次,然后除以 5,很快就能得出平均值 3。

P 问题集合涵盖了大量我们日常遇到且能够有效解决的问题。这些问题可以通过现有的计算资源和算法,在合理的时间范围内得到解答。

NP 问题

NP 即非确定性多项式(non-deterministic polynomial)时间,NP 问题是指可以在多项式时间内通过非确定性算法验证其解是否正确的问题。这里的 “非确定性算法” 可以理解为在算法执行的某些步骤中,允许出现不确定的选择,并且如果一个问题存在至少一种可能的解能够在多项式时间内被验证,那么这个问题就属于 NP 问题。

一个经典的 NP 问题例子是 “子集和问题”。给定一个整数集合 S S S 和一个目标整数 t t t ,判断是否存在 S S S 的一个子集,使得子集中所有元素的和等于 t t t 。假设我们得到了一个声称是该问题解的子集 S ′ S' S ,要验证这个解是否正确,只需要对 S ′ S' S 中的元素进行求和,然后检查和是否等于 t t t 。这个验证过程的时间复杂度与子集 S ′ S' S 的大小成正比,对于给定的输入规模(集合 S S S 的大小为 n n n ),验证时间是多项式时间 O ( n ) O(n) O(n) 。例如,集合 S = { 1 , 3 , 5 , 7 , 9 } S = \{1, 3, 5, 7, 9\} S={1,3,5,7,9} ,目标 t = 15 t = 15 t=15 ,若给出一个解子集 S ′ = { 1 , 5 , 9 } S' = \{1, 5, 9\} S={1,5,9} ,我们将 S ′ S' S 中元素相加 1 + 5 + 9 = 15 1 + 5 + 9 = 15 1+5+9=15 ,与 t t t 相等,验证了该解正确,且这个验证过程很快,时间复杂度符合 O ( n ) O(n) O(n) ,这里 n n n 为子集 S ′ S' S 的元素个数 3。然而,找到这个解本身可能并不容易,目前没有已知的多项式时间算法能够直接找出满足条件的子集。

另一个著名的 NP 问题是 “旅行商问题”。假设有一个旅行商需要访问 n n n 个城市,每个城市之间都有一定的距离,旅行商需要找到一条最短的路径,使得他能够遍历所有城市且每个城市只访问一次并最终回到出发城市。如果给定一条路径,我们可以在多项式时间内计算出这条路径的总长度,从而验证它是否是最短路径的候选解。例如有 4 个城市 A、B、C、D,假设各城市间距离为:A 到 B 为 5,A 到 C 为 3,A 到 D 为 7,B 到 C 为 2,B 到 D 为 4,C 到 D 为 6。若给定一条路径 A - B - C - D - A,计算路径长度为 5 + 2 + 6 + 7 = 20 5 + 2 + 6 + 7 = 20 5+2+6+7=20 ,计算过程简单,时间复杂度低。但要从所有可能的路径组合中找到最短路径,计算量随着城市数量 n n n 的增加而呈指数级增长,目前还没有找到多项式时间的求解算法。

“哈密顿回路问题” 也是 NP 问题。对于一个给定的图,判断是否存在一条路径,从某个顶点出发,不重复地经过图中每个顶点恰好一次,最后回到起始顶点。若给出一条声称满足条件的路径,验证这条路径是否真的遍历了所有顶点且不重复,只需要依次检查路径上的顶点,时间复杂度与路径长度成正比,属于多项式时间。例如在一个有 6 个顶点的图中,给定路径 v 1 − v 2 − v 3 − v 4 − v 5 − v 6 − v 1 v_1 - v_2 - v_3 - v_4 - v_5 - v_6 - v_1 v1v2v3v4v5v6v1 ,逐个检查顶点是否符合要求,能快速完成验证,但要找到这样一条回路却非常困难,没有多项式时间算法。

P 问题与 NP 问题的关系

P 问题和 NP 问题之间的关系是计算机科学领域中一个尚未完全解决的重大问题,即 “P 是否等于 NP”。直观上看,P 问题集合是 NP 问题集合的一个子集,因为如果一个问题能够在多项式时间内被解决,那么它的解必然可以在多项式时间内被验证。也就是说,所有的 P 问题都是 NP 问题。然而,目前还不清楚是否所有的 NP 问题也都是 P 问题,即是否存在一个通用的方法,能够将所有 NP 问题在多项式时间内转化为 P 问题来求解。

如果 P = NP,那么这意味着许多目前被认为难以解决的问题(如旅行商问题、子集和问题等)实际上都存在多项式时间的求解算法,这将对计算机科学以及众多依赖计算的领域产生革命性的影响。但目前为止,尽管经过了大量的研究,还没有人能够证明 P = NP,同时也没有人能够证明 P ≠ NP。

多项式时间复杂度、P 问题和 NP 问题是计算机科学中理解算法效率和问题难度的关键概念。多项式时间复杂度为我们评估算法性能提供了重要依据,P 问题代表了可有效求解的问题类别,NP 问题则涵盖了那些解的验证相对容易但求解可能困难的问题。而 P 与 NP 之间的关系,作为计算机科学领域的核心未解之谜,持续吸引着众多研究者不断探索和研究。

相关文章:

计算机考研之数据结构:P 问题和 NP 问题

在算法的时间复杂度估算中&#xff0c;通常教材和题目中的估算结果包括&#xff1a; O ( 1 ) , O ( log ⁡ n ) , O ( n ) , O ( n ) , O ( n log ⁡ n ) , O ( n 2 ) , O ( n 3 ) , O ( log ⁡ log ⁡ n ) O(1),O(\log{n}),O(\sqrt{n}),O(n),O(n\log{n}),O(n^2),O(n^3),O(\log…...

新数据结构(13)——I/O

字符流 字符输入流&#xff08;Reader&#xff09; 字符输入流用于从数据源&#xff08;如文件、字符串等&#xff09;读取字符数据。Reader 是所有字符输入流的抽象基类。 常用实现类 FileReader 用于从文件中读取字符数据。 InputStreamReader 将字节流转换为字符流&…...

PySide6学习专栏(四):用多线程完成复杂计算任务

如果计程序中要处理一个非常庞大的数据集中的数据&#xff0c;且数据处理计算很复杂&#xff0c;造成数据处理占用大量时间和CPU资源&#xff0c;如果不用多线程&#xff0c;仅在主进程中来处理数据&#xff0c;将会使整个程序卡死&#xff0c;必须采用多线程来处理这些数据是唯…...

Python多线程编程理解面试题解析

一、多线程介绍 Python 的多线程是一种实现并发编程的方式&#xff0c;允许程序同时执行多个任务。然而&#xff0c;由于 Python 的全局解释器锁&#xff08;GIL&#xff09;的存在&#xff0c;多线程在某些场景下可能无法充分利用多核 CPU 的性能。以下是对 Python 多线程的理…...

Flutter - 初体验

项目文件目录结构介绍 注&#xff1a;创建 Flutter 项目名称不要包含特殊字符&#xff0c;不要使用驼峰标识 // TODO 开发中运行一个 Flutter 三种启动方式 Run 冷启动从零开始启动Hot Reload 热重载执行 build 方法Hot Restart 热重启重新运行整个 APP 先看效果&#xff0c…...

使用最广泛的Web应用架构

目前互联网中没有一种绝对使用最广泛的Web应用架构&#xff0c;不同的架构在不同的场景和企业中都有广泛应用&#xff0c;但微服务架构和Serverless架构是当前较为主流和广泛使用的架构。以下是对这两种架构的具体分析&#xff1a; 微服务架构 适用场景广泛 大型互联网公司&a…...

YOLOv11-ultralytics-8.3.67部分代码阅读笔记-split_dota.py

split_dota.py ultralytics\data\split_dota.py 目录 split_dota.py 1.所需的库和模块 2.def bbox_iof(polygon1, bbox2, eps1e-6): 3.def load_yolo_dota(data_root, split"train"): 4.def get_windows(im_size, crop_sizes(1024,), gaps(200,), im_rate_t…...

Unity shader glsl着色器特效之 模拟海面海浪效果

一个简单的海浪效果&#xff0c;通过波的叠加实现水面起伏的动效&#xff0c;根据波峰斜率来为浪花着色&#xff0c;再根据法线贴图和水花贴图来和调整uv的平滑移动来增强海浪移动的细节。如果需要更逼真的效果可以考虑在满足浪花触发的地方添加粒子系统 前置效果图 因为是很久…...

`AdminAdminDTO` 和 `userSession` 对象中的字段对应起来的表格

以下是将更正后的表格放在最前面的回答&#xff0c;表格包含序号列&#xff0c;合并了后端 AdminAdminDTO 和前端 userSession 的所有字段&#xff0c;并标注对方没有的字段。token 字段值用省略号&#xff08;...&#xff09;表示&#xff1a; 序号字段名AdminAdminDTO (后端…...

sqlserver查询内存使用情况的方法

查询 这个SQL查询用于获取当前数据库实例中各个数据库在缓冲池&#xff08;buffer pool&#xff09;中的数据页所占用的内存大小。 select isnull(db_name(database_id),ResourceDb) AS DatabaseName,CAST(COUNT(row_count) * 8.0 /(1024.0) AS DECIMAL(28,2)) AS [size (MB…...

rust笔记7-生命周期显式标注

Rust 的生命周期(Lifetimes)是 Rust 内存安全模型的核心部分,用于确保引用始终有效,避免悬垂引用(Dangling References)。下面我们从生命周期的设计出发点、标注语法以及在不同上下文中的应用(函数、方法、结构体、trait 等)来详细介绍。 1. 生命周期设计的出发点 Rus…...

SQL Server 导入Excel数据

1、选中指定要导入到哪个数据库&#xff0c;右键选择 》任务 》导入数据 2、数据源 选择Excel&#xff0c;点击 下一步(Next) 3、目前 选择OLE DB Provider &#xff0c;点击 下一步&#xff08;Next&#xff09; 4、默认 &#xff0c;点击 下一步&#xff08;Next&#xff09;…...

【笔记】LLM|Ubuntu22服务器极简本地部署DeepSeek+联网使用方式

2025/02/18说明&#xff1a;2月18日~2月20日是2024年度博客之星投票时间&#xff0c;走过路过可以帮忙点点投票吗&#xff1f;我想要前一百的实体证书&#xff0c;经过我严密的计算只要再拿到60票就稳了。一人可能会有多票&#xff0c;Thanks♪(&#xff65;ω&#xff65;)&am…...

【面试题】2025.02.19-前端面试题汇总

杭州三汇 1. 自我介绍 2. 你们前端项目为什么要用微前端&#xff1f; 减少由于程序更新导致的问题影响面积&#xff1b;缩小前端包体积&#xff0c;加快页面开发速度&#xff1b;便于统一多家医院某几个系统的程序一直&#xff1b; 3. 详细介绍一个项目&#xff0c;项目干什…...

小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025)

小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统&#xff0c;不需要降级 v1.0.91 &#xff08;2025&#xff09; 本文内容需要你有一定的 Linux 操作基础&#xff0c;最好是程序员那种&#xff0c;英文水平足够用才行。一般人不需要使用这么复杂的路由器操作系统&#xff0c…...

火语言RPA--Excel插入空行

【组件功能】&#xff1a;在Excel内指定的位置插入空行 配置预览 配置说明 在第n行之前 支持T或# 填写添加插入第n行之前行号。 插入n行 支持T或# 插入多少行。 Sheet页名称 支持T或# Excel表格工作簿名称。 示例 Excel插入空行 描述 在第3行之后插入3行。 配置 输…...

具有整合各亚专科医学领域知识能力的AI智能体开发纲要(2025版)

整合各亚专科医学领域知识能力的AI代理的开发与研究 一、引言 1.1 研究背景 在科技飞速发展的当下,人工智能(AI)已成为推动各行业变革的关键力量,医疗领域也不例外。近年来,AI 在医疗行业的应用取得了显著进展,从医学影像诊断到疾病预测,从药物研发到个性化医疗,AI 技…...

【Java 优选算法】位运算

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 基础位运算符: &: 有 0 就是 0 | : 有 1 就是 1 ^ :相同为0,相异为1(无进位相加) 1.给一个数 n, 确定它的二进制表示中的第x位是 0 还是 1 . 使用公式(n >> x) &…...

细分数字货币钱包的不同种类

文章目录 一、中心化钱包1.1 中心化钱包架构1.2 中心化钱包业务细节流程 二、去中心化钱包(HD 钱包)2.1 去中心化钱包架构2.2 去中心化钱包细节业务流程 三、硬件钱包3.1 硬件钱包架构3.2 硬件钱包细节业务流程 四、MPC 托管钱包五、多签钱包 中心化钱包 &#xff1a;钱包私钥一…...

Nginx Embedded Variables 嵌入式变量解析(4)

Nginx Embedded Variables 嵌入式变量解析(4) 相关链接 nginx 嵌入式变量解析目录nginx 嵌入式变量全目录nginx 指令模块目录nginx 指令全目录 一、目录 1.1 变量目录 1.1.24 ngx_stream_core_module $binary_remote_addr $bytes_received $bytes_sent $connection $hos…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...