问题的难度

news/2024/12/17 3:01:11/文章来源:https://www.cnblogs.com/qixingzhi/p/18611412

根据加速定理,我们明白了我们必须对算法定义复杂性而不能对问题定义复杂性。然而,直观上确实存在不同问题的难易程度(hardness)之分。有的问题只需要扫描一遍输入就可以求出,有的问题似乎除了暴力搜索之外没有好办法。那么我们应该如何比较不同问题之间的难度呢?(除非特殊说明,我们所说的“问题”就是指判定性问题,一个问题\(L\)\(\{0,1\}^\ast\)的一个子集)

归约

\(m\)-归约

\(\newcommand{\M}{\mathbb{M}}\)比较问题难度的最直接也是最本质的方法就是归约(reduction)。当我们要判定一个问题\(A\)时,如果我们能找到一个可计算全函数\(f\)使得\(x\in A\iff f(x)\in B\),那么我们就可以对于每个输入\(x\)做一步计算\(f(x)\)而把问题转化为\(B\)。如果这样的\(f\)存在,我们就称问题\(A\)能归约成问题\(B\)。这是最基本的归约形式,称为\(m\)-归约,记为\(A\leq_mB\)。如果\(A\leq_m B\),则说明只要我们有办法解决\(B\)就一定能解决\(A\),所以\(B\)是一个比\(A\)难或至少\(A\)不比\(B\)更难。

\(m\)-归约和我们直观上理解的“归约”还是有一些差距的。我们从图灵机的角度看\(m\)-归约,它说的实际上是:如果存在一个判定\(B\)的图灵机\(\M_B\),存在一个计算\(f\)的图灵机\(\M_f\),那么我们可以构造一台判定\(A\)的图灵机\(\M_A\),方法是对于每个输入\(x\),先调用子程序\(\M_f\)计算得到\(f(x)\),在把\(f(x)\)作为\(\M_B\)的输入,那么\(\M_B\)的输出刚好就是判定\(x\in A\)的正确答案。注意到在这个过程中,我们只允许\(\M_A\)调用一次子程序\(\M_B\),并且必须是在程序末尾调用。而在我们直观上理解的“归约”中,我们应当可以反复调用\(\M_B\)多次,并且不一定是在结尾时调用。

图灵归约

为了让归约的定义更加直观,我们引入神谕图灵机(oracle Turing machine)的概念。一台带有问题\(L\)的神谕图灵机可以在运行过程中用一步计算的代价询问是否有\(x\in L\)并获得正确回答(因此,这也是一个假想模型)。具体的,定义神谕图灵机\(\M^L\)上有一条神谕带,它有三个额外的运行状态\(q_{query},q_{yes},q_{no}\),某时刻如果神谕带上写着\(z\),并且图灵机进入状态\(q_{query}\),那么下一步如果\(z\in L\)就会进入状态\(q_{yes}\),否则就会进入状态\(q_{no}\)

如果存在一台神谕图灵机\(\M^B\)使得\(\M^B\)能够判定问题\(A\),就称\(A\)能图灵归约到\(B\),记为\(A\leq_T B\)。由此可见,图灵归约可以反复调用判定\(B\)的子程序,并且可以在调用的间隙做计算。这符合我们对归约的直观印象。

多项式归约

在复杂性中,我们特别关心多项式时间可完成的归约(高效归约)。

\(m\)-归约对应,我们定义Karp归约:如果存在一个多项式时间可计算全函数\(f\)使得\(x\in A\iff f(x)\in B\),那么就称问题\(A\)能Karp归约为问题\(B\)。记为\(A\leq_K B\)

和图灵归约对应,我们定义Cook归约:如果存在一台多项式运行时间的神谕图灵机\(\M_P^B\)使得\(\M_P^B\)能够判定问题\(A\),就称\(A\)能Cook归约到\(B\),记为\(A\leq_C B\)。(如果我们定义复杂性类\(\text{P}^L\)为所有带神谕\(L\)的多项式时间图灵机能判定的问题集合,那么“存在一台多项式运行时间的神谕图灵机\(\M_P^B\)使得\(\M_P^B\)能够判定问题\(A\)”可以写为\(A\in \text{P}^B\)

显然,归约有传递性。因此我们可以良好的比较问题间的大小。比较的方式可以是\(m\)-归约,也可以是图灵归约、多项式归约。不同的比较方法会导致不同的难易指标。

时间意义的难度

在时间复杂性中,研究\(\text{P}\)是否等于\(\text{NP}\)时,我们可以采取这样的思路:如果在多项式归约意义下\(\text{NP}\)中最难的那个问题能被多项式解决,那么我们也就证明了\(\text{P}=\text{NP}\)

如果存在问题\(B\)使得\(\forall A\in \text{NP}\)\(A\leq_K B\),那么就称\(B\)是一个NP-hard问题(注意这里我们用的是Karp归约,也即只能调用一次子程序的多项式归约)。如果\(BL\)是NP-hard的并且\(B\in \text{NP}\),那么就称\(B\)是NP-complete的。定义问题类\(\text{NPC}\)是所有NP-complete问题的集合。

Cook-Levin定理指出,SAT问题是NP-complete的。证明:证毕。

Karp证明了SAT问题可以Karp归约到21个组合问题,包括3SAT、图的点覆盖问题、01整数规划等等耳熟能详的问题。只要证明这些问题中的任何一个有多项式算法,就能证明\(\text{P}=\text{NP}\)

一个有趣的问题是,如果\(\text{P}\neq\text{NP}\),那么\(\text{NP}\setminus\text{P}\)中是否含有除了NP-complete问题以外的其它问题?Ladner定理指出,\(\text{NP}\setminus\text{P}\)中确实含有除了NP-complete问题以外的其它问题,并且这样的问题数量是无穷多的。证明:证毕。

空间意义的难度

类比时间复杂性,在那里我们可以用最小的时间资源类\(\text{P}\)来定义归约,从而能够比较不同问题在时间复杂性意义下的难度。那么对于空间复杂性,我们能否用最小的空间资源类\(\text{L}\)来定义归约,从而比较不同问题在空间复杂性意义下的难度呢?

如果存在一个对数空间可计算的全函数\(f\)使得\(x\in A\iff f(x)\in B\),那么就称问题\(A\)能对数空间归约为问题\(B\)。记为\(A\leq_L B\)

以上定义等价于:如果存在一个隐式对数空间可计算(implicitly logspace computable)全函数\(f\)使得\(x\in A\iff f(x)\in B\),那么就称问题\(A\)能对数空间归约为问题\(B\)。记为\(A\leq_L B\)。其中,\(f\)是隐式对数空间可计算的当且仅当 ①\(\forall x,|f(x)|\)是关于\(|x|\)的多项式长的;②输入\(x,i\),判定是否成立\(i\leq |f(x)|\)的问题只需要对数空间;③输入\(x,i\),判定是否成立\(f(x)\)的第\(i\)位是1只需要对数空间。这三点定义“隐式地”保证了\(f\)的计算只需要用到对数空间,因为对于每个\(x\),计算\(f(x)\)的每一位以及计算\(f(x)\)的位数都只需要对数空间。

如果存在问题\(B\)使得\(\forall A\in \text{L}\)\(A\leq_L B\),那么就称\(B\)是一个L-hard问题。如果\(B\)是L-hard的并且\(B\in \text{L}\),那么就称\(B\)是L-complete的。类似的,可以定义NL-hard,NL-complete,PSPACE-hard,PSPACE-complete等等(都是用对数空间归约定义)。

可达性问题(Reachability Problem)是指:给定一张有向图和有向图上两个节点,判定两点间是否存在一条可达路径。可以证明,可达性问题是NL-complete问题,也即所有非确定性图灵机能在对数空间判定的问题都可以归约为可达性问题,并且可达性问题本身也只需要非确定性图灵机在对数空间内判定。

量化布尔公式问题(Quantified Boolean Formula Problem, QBF Problem)是指:。Stockmeyer-Meyer定理指出,QBF问题是PSPACE-complete的。

Savitch定理指出:对于空间可构造函数\(S(n)\),始终成立\(\text{NSPACE}(S(n))\subseteq \text{SPACE}((S(n))^2)\)。也即非确定性图灵机在空间\(S(n)\)下能判定的问题一定能用确定性图灵机在\(S(n)^2\)的空间内判定。这里的平方使得我们能把多项式空间的确定性图灵机和多项式空间的非确定性图灵机等价起来。当我们要证明一个问题可以用确定性图灵机在多项式空间内判定时,只需证明这个问题可以用非确定性图灵机在多项式空间内判定。这意味着\(\text{PSPACE}=\text{NPSPACE}\)。这是一个有点反直觉的结论,侧面反映出多项式空间类已经是一个极其广大的类了。

根据Savitch定理,设\(\text{NPSPACE}\)在全集\(\{0,1\}^*\)下的补集

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 安装talib ta-lib

ta-lib的whl轮子文件下载地址在这里 https://github.com/cgohlke/talib-build/releases根据自己电脑版本下载 pip install ./ta_lib-0.5.1-cp312-cp312-win_amd64.whl

第7次作业

第7次作业 一、实验名称:安装PKI平台熟悉PKI 证书申请、证书签发等操作过程 二、实验目的 通过这个实验加深对非对称加密、数字签名、数字证书等一些基本概念的了解 三、实验原理与理论基础 数字证书:采用公钥密码体制,即利用一对互相匹配的密钥进行加密、解密。每个用户拥有…

java 选择排序,涵盖工作原理、算法分析、实现细节、优缺点以及一些实际应用场景

选择排序的详细解析更深入地探讨选择排序的各个方面,包括其工作原理、算法分析、实现细节、优缺点以及一些实际应用场景。 动画演示 1. 基本概念选择排序是一种简单的比较排序算法。它的核心思想是将数组分为两个部分:已排序部分和未排序部分。每一轮从未排序部分找到最小(…

云浮知识付费系统课程数据

本文将深入探讨在线教育与知识付费行业的现状与发展趋势,并以实际数据和案例加以说明,特别关注教育和软件行业所面对的机遇和挑战。文章将以专业知识背景和技术应用为导向,展示在线学习平台如何在提高效率和实现个性化教育方面扮演关键角色。图源 www.tuzhi.ltd随着互联网和…

【Java脚本】如何在java程序中调用python脚本

以python代码来实现将pdf文档转换为word文档为例,我们想要在Java程序中调用Python脚本,并实现文件的传递与返回,可以采用以下几种方法: 1.使用ProcessBuilder或Runtime.getRuntime().exec() Java可以通过ProcessBuilder或Runtime.getRuntime().exec()来启动一个外部进程,因…

java 冒泡排序,涵盖背景、算法步骤、代码示例、复杂度分析、优化方式及其优缺点

冒泡排序的背景知识冒泡排序是一种简单的排序算法,由于其简单易懂的特点,它通常被用作教学目的。冒泡排序在最坏情况下的效率并不高,但在某些特定条件下,它的表现可以相对较好。下面是更深入的细节。 动画演示1. 算法步骤详解1.1 基本逻辑冒泡排序的核心逻辑是比较和交换。…

【DA梦数据库系列】SQL注入小记

一、判断DMSQL二、基础语法2.1 注释2.2 常用运算符三、函数特性3.1 进制转换3.2 字符串截取3.3 字符串拼接3.4 其他四、SQLi 获取数据4.1 基本信息4.2 查询全局变量4.3 查询系统表4.4 查询视图五、联合查询注入六、报错注入6.1 除0错误6.2 溢出错误七、布尔盲注八、时间盲注九、…

ABC384E题通过历程

在赛时的时候,我们写出了一份非常牛逼的代码: # include <bits/stdc++.h> using namespace std; #define int long long const int N = 510; int a[N][N]; int vis[N][N]; struct node {bool operator()(int a, int b) {return a > b;} }; int dx[] = {0,1,-1,0}; i…

java学习12.16

springboot+vue3前后端分离的新技术的大部分写项目时的明显bug已经找到问题并纠正,可以赶上旧技术的进度了。再写几个项目就能在速度上超越旧的技术。

11CSS属性-颜色表示-chrome调试-浏览器渲染

一、今日内容 首先对这些属性进行一个演练 想要深刻理解所有常用的CSS属性,最好先学会以下几个最基础最常用的CSS属性font-size 文字大小 color前景色(文字颜色) background-color背景色 width宽度 height高度二、对CSS常用属性进行演练 1、字体的默认大小是16px的还可以看到…

使用win10 wsl子系统将 rust 程序静态编译为linux可执行文件

chapter Ⅰ 事情起因 最近在学习rust, 想把一部分java服务迁移至rust编写,但由于公司服务器都是linux系统,所以在找windows下交叉编译为linux可执行文件的方法,把bing首页搜索的结果试了个遍都不行, 始终报错“musl-gcc”无法找到,搜遍全网都无法解决。 最终在我不断尝试的…

Spring Cloud 负载均衡配置 (@LoadBalanced)

一、负载均衡 目前是两种 Ribbon 和 spring-cloud-loadbalancer - Ribbon已经闭源 配置策略较多 :轮询,随机,权重,自定义 四种负载均衡方案 配置方式yml 注解- spring-cloud-loadbalancer属于springcloud,项目兼容性更好 配置策略: 更注重 自定义(默认为轮询) 配置方式注…