《计算复杂性:现代方法》——1.6 类P

1.6 类P

1.6.1 为什么模型选择无关紧要

我们用图灵机定义“可计算”语言的各种复杂性类及类P。如果选用其他计算模型,这些类会有区别吗?在发现了计算但采用其他模型而不是图灵机作为计算模型的高等外星人眼里,这些类会有区别吗?

我们已经遇到图灵机模型的各种变形,用其中最弱的模型来模拟最强的模型将导致运行时间平方增加。因此,作为可计算问题的集合,多项式时间在这些变形上是一样的。

在图灵和邱奇的工作发表之后的最初几十年中,很多其他的计算模型被发现,其中有些模型十分怪异。当时人们很容易地就证明了图灵机能够模拟其他计算模型,模拟过程至多使得运行时间多项式地变高。因此,在这些模型上类似地定义的类P不会比图灵机定义的P更大。

绝大多数科学家均相信邱奇图灵(CT)命题,它断言任何可被物理实现的计算装置均可以被图灵机模拟,不管这种装置是基于芯片、DNA、中子的还是基于外星人技术的。这就是说,任何其他模型上的可计算问题的集合不会比图灵机上可计算问题的集合更大。(CT命题不是定理,正如我们目前的理解,它仅仅是对世界的本质的一种信念。)

1.6.2 P的哲学意义



1.6.3 P的争议和解决争议的一些努力

现在,我们给出关于类P的定义的一些争议和解决这些争议的过程中出现的以下相关复杂性类。

最坏情况精确计算过于严格。类P的定义考虑的仅仅是在所有可能的输入上计算函数的算法。一个争议之处是,所有输入并不都出现在实际场合中,而算法只需对实际场合下出现的输入上有效即可。平均复杂性部分地解决了这一争议,并由此产生了平均复杂性意义下类似P的复杂性类,参见第18章。我们的观点是,限定在“实际场合”讨论P仅有纯技术意义。

类似地,在遇到像图的最大独立集这样大小的计算函数时,人们通常更愿意讨论问题的近似解。第11章和第22章对近似复杂性进行了严格处理。

其他可物理实现的模型。前面已经提到了强邱奇图灵命题,它断言在任意可物理实现的计算模型上类P不会更大,但其中还有一些微妙之处有待讨论。

(a) 精度问题。图灵机用离散符号进行计算,但现实生活中某些物理量可以取R中的实数。因此,人们也可以基于能操作实数的某些物理现象来构想执行实数计算的模型。由于存在精度问题,图灵机只能近似地模拟实数计算。即便这样,精度问题也不是图灵机遇到的本质性障碍(尽管有些研究者不认同这种观点)。毕竟,由于现实生活中设备存在噪音,因此物理量的测量只能精确到有限精度。因此,物理过程不可能涉及任意精度,继而图灵机当然可以用有限精度来完成模拟。27即便这样,我们仍将在第16章中考虑图灵机的一种修改,使其能够将实数运算当作基本操作。由此产生的复杂性类跟标准复杂性类之间的联系十分密切。

(b) 随机性的采用。前面定义的图灵机是确定型的。如果计算的领域中存在随机性,则人们也可以构想利用随机位源(如投掷硬币)的计算模型。第7章讨论了允许投掷硬币的图灵机并研究了复杂性类BPP,它是这种计算模型上与P类似的复杂性类。然而,我们在第19章和第20章将会看到,随机型计算模型极可能并不比确定型计算模型更强。

(c) 量子力学的采用。一个更聪明的计算模型使用了量子力学中违背直觉的一些性质。我们在第10章定义了复杂性类BQP,它是类P在量子计算模型中的推广。我们将看到BQP中的一些问题,目前还不知道它们是否属于P(尽管目前仍未证明BQP≠P)。然而,量子计算模型是否能被物理实现还是未知的。并且,量子计算机目前似乎也只能高效地求解为数不多的几个不属于P的问题。因此,研究P时获得的知识仍可能适用于量子计算机。

(d) 其他怪诞物理知识(如弦论)的采用。目前,许多物理理论似乎都得到同样的复杂性类BQP,尽管许多理论还有待深入理解。

判定问题的限制太强。有些计算问题不易表达成判定问题。事实上,本书将引入几个复杂性类来处理某些任务的计算复杂性,这些任务包括非布尔函数的计算、搜索问题的求解、优化问题的近似求解、交互式任务,等等。然而,判定问题的框架已被证明具有强大的表达能力,本书也经常使用这种框架。

1.6.4 埃德蒙兹的引言

我们用埃德蒙兹的引言[Edm65]结束本节。埃德蒙兹曾在其著名的论文中给出了求解最大匹配问题的多项式时间算法,他在论文中这样解释其研究结果的意义:

时间: 2024-09-25 18:38:10

《计算复杂性:现代方法》——1.6 类P的相关文章

java中看到类写在方法里面的类是什类啊

问题描述 java中看到类写在方法里面的类是什类啊 java中看到类写在方法里面的类是什类啊 void func (){class lei } 解决方案 方法内部的内部类的可见性更小,它只在方法内部可见,在外部类(及外部类的其它方法中)中都不可见了.同时,它有一个特点,就是方法内的内部类连本方法的成员变量都不可访问,它只能访问本方法的final型成员.同时另一个需引起注意的是方法内部定义成员,只允许final修饰或不加修饰符,其它像static等均不可用. 解决方案二: 内部类(匿名内部类) 解

app上线后出现BUG怎么处理?开发中用什么方法预防这类问题发生? 跪求大神解答!

问题描述 app上线后出现BUG怎么处理?开发中用什么方法预防这类问题发生? 跪求大神解答! app上线后出现BUG怎么处理?开发中用什么方法预防这类问题发生? 跪求大神解答! 解决方案 出现bug就发布新的版本,客户端自动检查你的服务器,自动下载升级.另外开发过程中注意测试,减少bug

java中方法是某个类的属性,那么方法是某个类的对象的属性么

问题描述 java中方法是某个类的属性,那么方法是某个类的对象的属性么 java中方法是某个类的属性,那么方法是某个类的对象的属性么 它们之间的关系是什么 解决方案 方法和变量统称为属性,方法是类的方法.如果是静态类就可以用类去调用,如果是普通类,需要先实例化,也就是new,用类的对象来调用. 解决方案二: java中类,对象,方法和属性 对象是定义类出来的. A a=new A(): a就是A类的对象. 方法是在类里面定义出来的 public class A(){ int b=3; publi

C+++中的基类的虚方法在派生类中设为虚的还是非虚方法好?

问题描述 C+++中的基类的虚方法在派生类中设为虚的还是非虚方法好? //brass.h -- bank account classes#ifndef BRASS_H_#define BRASS_H_#include //brass account classclass Brass{private: std::string fullName; //x姓名 long acctNum; //账号 double balance; //当前结余public: Brass(const std::strin

static-类的方法调用与类对象的方法调用的区别?

问题描述 类的方法调用与类对象的方法调用的区别? public class A { public static A a=new A(); public void text() {} } public class B { A.a.test(); A a1=new A(); a1.test() //这两种的调用方法的差别请问是什么啊? public static int c; public int c1; //就是一个用Static变量和没有用static声明一个变量的差别吗? //如果非得那么实现

java中this.对象 表示本类的对象,那this.方法 表示本类的方法吗

问题描述 java中this.对象 表示本类的对象,那this.方法 表示本类的方法吗 java中this.对象 表示本类的对象,那this.方法 表示本类的方法吗 解决方案 你的理解是正确的,可以指向本类方法,还有个SUPER,可以指向父类方法 解决方案二: this表示本类,调用方法是一般对象.方法,即调用某个类的某个方法 解决方案三: this在java中我见过比较好的理解是这样的: java中的this翻译成中文意思都可以理解为"我的"的意思,在你定义的那个类里面,不管你在哪里

python魔法方法-属性转换和类的表示详解_python

类型转换魔法 类型转换魔法其实就是实现了str.int等工厂函数的结果,通常这些函数还有类型转换的功能,下面是一些相关的魔法方法: •__int__(self) •转换成整型,对应int函数. •__long__(self) •转换成长整型,对应long函数. •__float__(self) •转换成浮点型,对应float函数. •__complex__(self) •转换成 复数型,对应complex函数. •__oct__(self) •转换成八进制,对应oct函数. •__hex__(s

浅谈Python类里的__init__方法函数,Python类的构造函数_python

如果某类里没有__init__方法函数,通过类名字创建的实例对象为空,切没有初始化:如果有此方法函数,通常作为类的第一个方法函数,有点像C++等语言里的构造函数. class Ca: def __init__(self, v): # 注意前后各两个下划线 self.name = v def pr(self): print "a--->", self.name ia = Ca("Jeapedu") # 本质调用的是__init__方法函数 ia.pr() Ca.

详解Ruby中的单件方法和单件类_ruby专题

单件方法 Ruby允许给单个对象增加方法,这种只针对单个对象生效的方法,称为单件方法 示例代码 str = "just a regular string" def str.title? self.upcase == self end str.title? # => false str.methods.grep(/title?/) # => [:title?] str.singleton_methods #=> [:title?] str.class # => S

VB.NET如何得到调用当前过程的方法名称和类名称

本文讲述VB.NET(VB 2008, VB 2005) 如何得到调用当前过程的方法名称(Calling method)和类(Calling Class) 的名称. 主要用到 System.Diagnostics.StackTrace 和 System.Diagnostics.StackFrame,以及 StackFrame的方法:GetFileName,GetFileLineNumber,GetMethod.Name, GetMethod.ReflectedType.Name. 示例代码 如下