到目前为止,在这门课程中,我们主要关心的是问题是否可以确定。在实践中,还有另一个考虑。一些可决定的语言有非常有效的决定器。一个低效的决策者会采取大量的步骤来决定它的一些输入。在某些情况下,所需的步骤数量非常大,以至于决策器实际上变得不可用。
下一个主要的区别是我们可以找到有效决策者的语言和没有有效决策者的可决定语言之间的区别。这个过程的第一步是定义我们所说的“高效决策者”。第二步是建立一个理论框架,使我们能够证明某些可决定的语言没有有效的决定器。
这是我们的第一个重要定义。
定义语言L是多项式时间可决定的,如果存在一个图灵机M,对于每个输入字符串w,它在f(|w|)步或更少的时间内决定语言,其中f(x)是其输入的多项式函数。
这里还有另一个重要的、密切相关的定义。
定义语言L在P类中,如果存在一个多项式时间决定器。
在第四章中,我们看到了几个图灵机程序决定简单语言的例子。这些例子中的许多语言都属于P类。
例如,我们看到语言
L = {ww | w∈Σ*}
都可以由图灵机决定图灵机的工作经历了三个阶段。以下是这些阶段,以及给定长度为n的输入,每个阶段所需的步骤数:
这个分析表明,在这种语言中,决定输入w作为n = |w|的函数所需的步骤数是f(n) = 2n2 + 2n。
在计算机科学中,有许多现实世界的问题可以被证明具有多项式时间解。在大多数情况下,挑战是在计算理论的一般框架内表达问题。这是一个典型的问题。假设你有一个有向图,你想确定是否存在从一个顶点s到另一个顶点t的路径。这个问题可以用语言来表达:
PATH = {
在7.2节中,作者构造了一个可以在多项式时间内确定PATH的图灵机。
当输入
该算法的大部分工作在第2步。为了执行边缘扫描,我们必须读取g的描述。步骤2中所需的轮数以边缘的数量为限,边缘的数量以整个输入的长度为限。这使得第2部分所需的步骤数的上限为n·n = n2。这支配了计算时间,因此决定这种语言所需的步骤数是输入长度的多项式。
计算理论的核心问题之一是确定一种可决定的语言是否属于p类,正如我们将在下面看到的,没有已知的算法来做这件事。与此同时,理论家怀疑有许多可确定的语言不在P语言中。
考虑到我们无法确定一种语言是否在P中,我们必须满足于一个理论框架,这个框架至少有可能证明存在不在P中的可确定语言,建立这个框架的第一步是引入一类语言,它们被广泛认为是P之外的下一个东西。
对于这类语言,我们可以给出两种可能的定义。下面我们将说明这些定义是等价的。
定义如果存在一个多项式时间的不确定性图灵机来决定L,则可决定语言L属于NP类。
定义可判定语言L在NP类中,如果该语言是多项式时间可验证的。语言的验证器是图灵机程序V,当给定一对
这些定义是等价的。
定义1⇒定义2:假设一个语言L在多项式时间可决定的不确定性图灵机M .验证器将作为输入一个字符串w和州的列表,M将在受理通过计算w。验证人只是确认当M是开始与w的磁带的顺序给代表一个有效的接受计算M .这可以在多项式时间内完成。
定义2⇒定义1:假设一种语言可以在多项式时间内被某个验证者v验证。这里是一个可以决定L的不确定性图灵机M的描述:
输入w:
公式可满足性问题是确定布尔公式是否具有令人满意的赋值的问题。
布尔公式是由布尔变量和布尔逻辑算子∧、∨、和¬组成的表达式。如果存在一组为真或为假的变量赋值,使得整个表达式的值为真,则公式是可满足的。这里有一个例子。这个公式
(x∧y)∨(x∧z)
是可满足的通过赋值x = F, y = T, z = F。
这个问题可以用语言来表达
SAT = {φ | φ是一个赋值满意的布尔公式}
SAT的验证器将接受一个公式φ以及φ中变量的真、假值列表作为其输入。验证器可以在多项式时间内验证,当我们将给定的真、假值代入变量时,公式的计算结果为真。
在图论中,无向图G中大小为k的团是图中k个顶点的集合,使得集合中的每个顶点都与集合中的其他顶点相连。这可以用一种语言来表示:
CLIQUE = {
这种语言的验证器将把一对
计算理论中最著名的猜想是P和NP代表不同的语言类别的猜想。为了证明这个猜想,我们必须提出一种NP语言,然后证明它没有多项式时间决定器。不幸的是,没有人能够提出这样的证明,使这成为一个非常重要的未经证明的猜想。
这些注释的其余部分列出了与这个猜想有关的其他一些定义和结果。
定义函数f(x)是一个可计算函数,如果存在某种图灵机,当它的纸带上写有x时,当它的纸带上写有f(x)时停止运行。
定义如果存在一个可计算函数f使得x∈A当且仅当f(x)∈B,则语言A映射可约到语言B(记为A≤m B)。
这里有一对密切相关的定义,建立了多项式时间可约性的关系。
定义函数f(x)是一个多项式时间可计算函数,如果存在某种图灵机,当它的纸带上写有x时,当它的纸带上写有f(x)时停止运行。机器以若干步骤完成计算,这些步骤以x的某个多项式函数的长度为界。
如果存在一个多项式时间可计算函数f,使得x∈A当且仅当f(x)∈B,则语言A是多项式时间可约化为语言B(写为A≤P B)。
这是与多项式时间缩减的定义相关的一个基本结果。
如果A和B是图灵可决语言,且B在P中,且A≤P B,则A在P中。
设f是一个多项式时间可计算函数,它将a映射到b。这是a的多项式时间决定函数。
输入x:
显然,这是a的决定因素,如果我们从a的输入w开始,f(w)将在B中,B的决定因素将接受它。同样,如果我们从一个不在A中的输入w开始,f(w)也不在B中,B的决策器将拒绝它。由于第1部分是由一个可计算函数实现的,而第2部分涉及到一个决策器的使用,所以没有一个步骤会永远运行下去。
为了证明这是一个多项式时间决定器,我们必须对运行第1部分和第2部分所需的步数给出一个更严格的估计,作为n = |x|的函数。由于映射f是一个多项式时间缩减,第1部分将花费时间p(n),其中p是某个多项式。因为B是多项式时间可决定的,所以第2部分将花费q(|y|)的时间,其中q是某个多项式。最后,我们注意到|y|≤p(n),因为我们在第1部分中运行的机器每走一步最多只能在磁带上写入一个符号。由此可见,第2部分的时间限定为q(|y|)≤q(p(n))。由于两个多项式函数p和q的复合也是一个多项式,所以第2部分的运行时间以某个n的多项式函数为界。
因为P和NP是否相同是未知的,我们需要一些方法来潜在地区分这两个类。这促使我们引入另一类语言,即np完备语言(NPC)。
定义图灵可决语言L是np完全的,如果
下面是一个与定义相关的关键结果。
如果A和B都在NP中,A是NP完全的,且A≤P B,则B是NP完全的。
这取决于关系≤P的及物性。设C是NP中的任意语言。既然已知A是np完全的,我们有
C≤p a≤p b
它等价于
C≤p b
由于C是NP中的任何语言,这表明B是NP完全的。
np完备性的定义似乎很难满足。如果我们要提出一个NP完备语言的例子,这个语言必须抓住它在NP中的意义。
下面是将NP中的任何语言L映射到可满足公式的一般策略的大纲:
鉴于此,我们将展示从NP中的任何语言L到语言SAT的多项式时间缩减。以下是构建中的一些关键细节。
该构造依赖于M接受w的某种具体证明的存在。我们将使用的方法是使用计算轨迹来提供必要的证明。计算轨迹是机器M在接受输入w的过程中所做的赢博体育事情的记录。我们将w映射到的公式本质上是一个公式,它表示“在M上运行w的接受计算存在计算轨迹”。如果w确实在L中,那么这样的迹必须存在,并且公式必须是可满足的。反之,如果w不在L中,则必然没有这样的迹,并且公式必然不能满足。
计算跟踪实质上是一个配置列表。在计算过程中,每个配置表示M在某一点的状态。配置记录了在计算的那个阶段磁带上的内容,控制处于什么状态,以及磁带磁头在哪里。下面是一个配置示例。假设机器处于状态q,磁带上有0x1,磁带头位于1之上。相应的配置看起来像
# 0 xq1 ____________________#
配置同时告诉我们磁带头在哪里,以及控制处于什么状态,方法是在磁带上表示磁带头结束的符号之前写入当前状态。
构造配置时的一个小技术问题是决定要显示磁带中的多少单元。我们可以从w和M的组合中确定它,因为我们知道w的长度我们知道在M决定w之前w的长度和M要运行的步数之间的多项式关系,我们可以为计算的步数设定一个界限。一旦我们确定了计算的步数,我们就可以确定M可以在磁带上写多少东西。一旦我们知道了这个边界,我们只需要确保每个构型都足够长,以容纳M在计算过程中可以写入的最大符号数。
我们将把计算轨迹表示为表格。表是一个构型的列表,其中每个构型都跟随前一个构型,因为在M中有一个过渡,允许我们从前一个构型到下一个构型。
这是布尔公式的构造。
布尔公式中的变量是xi j s。这个变量表示表格中的单元格i,j包含字符s。
该公式由几个大的子句组成,其中每个子句捕获一个表必须满足的关键逻辑约束。作者将这些子句称为φcell、φstart、φaccept和φmove。这是每个子句表达的列表。
我们现在要用np完备语言SAT的存在性和之前的定理
如果A和B都在NP中,A是NP完全的,且A≤P B,则B是NP完全的。
来生成更多的np完全语言的例子。
我们将学习的第一个新的np完备语言是3SAT。这是一门与SAT密切相关的语言。3SAT语言由一种特殊形式的可满足布尔公式组成。一个有效的3SAT公式可以写成若干子句的逻辑和。每个子句必须由三个由逻辑or连接的项组成,每个项可以是单个变量,也可以是单个变量的否定。
在布尔逻辑中有一个系统的过程,可以将任意的逻辑公式转化为3SAT形式的公式。这个过程很简单,可以在多项式时间内完成,所以这表明SAT是多项式时间可约为3SAT。
下一个例子表明3SAT在多项式时间上可约为CLIQUE。
下图显示了这种映射是如何工作的。给定3SAT中的任意公式,我们构造一个特殊的图。图由顶点簇组成,公式中的每个子句都有一个簇。集群中的顶点连接到与它们兼容的其他集群中的赢博体育顶点。两个顶点是兼容的,如果它们使用不同的变量,或者如果它们连接到具有相同变量的项,或者两个具有相同变量的负数的项。
如果我们设k等于子句的数目,我们看到公式有一个令人满意的赋值当且仅当我们从公式构造的图有一个大小为k的团。为了使一个令人满意的赋值,我们必须在每个子句中至少有一个项的值为真。如果我们在每个子句中选择一个真项,那么图中相应的顶点必须形成一个大小为k的团,因为我们选择的赢博体育顶点都是相互兼容的,因此在图中必须有边连接它们。相反,图中任何大小为k的团必须使用每个组中的一个顶点,因为组中的顶点彼此之间没有连接。如果我们给顶点在团中的项赋真值,我们最终会得到原始公式的一个令人满意的赋值。
这个映射非常简单,我们可以在多项式时间内完成映射。
图中的顶点覆盖是一组覆盖边的顶点:图中的每条边至少触及覆盖中的一个顶点。这就产生了一种语言
vertex - cover = {
我们可以通过约简CLIQUE≤P VERTEX-COVER来证明VERTEX-COVER是np完全的。
下图显示了映射的工作原理。
左边的图是一个具有特定大小的团的图。在左边的图中,有一个由浅灰色顶点组成的大小为4的团。我们通过使用相同的顶点集来形成右边的图,但是用原始图中边集的补来替换边。只有当原始图没有连接两个顶点的边时,新图才会在两个顶点之间有一条边。
假设原图有一个大小为k的团,我们声明补图中不属于该团的赢博体育顶点的集合形成一个大小为|V| - k的顶点覆盖。这条边不连接团中的两个顶点,因为这些顶点都是完全连接的,当我们形成补时,连接它们的边会被移除。因此,由该边连接的两个顶点中至少有一个必须在团外,并且该顶点可以覆盖该边。相反,假设新图有一个大小为|V| - k的顶点覆盖。我声称不在覆盖中的顶点集一定在原始图中形成了一个团,因为新图不包含连接这些顶点的边(如果有,那条边就不会被覆盖)。当我们从补图返回到原始图时,赢博体育不在封面上的顶点之间的边都会恢复,我们就会回到一个团。
正文在第7.5节中显示了另外几个缩减的例子。第七章的家庭作业包括几个问题,要求你们建构自己的缩略语。