如果不加特殊说明,通常所说的图灵机都是确定型图灵机。非确定型图灵机和确定型图灵机的不同之处在于,在计算的每一时刻,根据当前状态和读写头所读的符号,机器存在多种状态转移方案,机器将任意地选择其中一种方案继续运作,直到最后停机为止。具体而言,其状态转移函数为
![{\displaystyle \delta :Q\times \Gamma \to 2^{Q\times \Gamma \times \{L,R\}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2c90f729c6f5a499e763dd1b6d574c0be79cfb71)
其中
是状态集合,
是带字母表,
分别表示读写头向左和向右移动;符号
表示集合
的幂集,即
![{\displaystyle 2^{A}=\{S~|~S\subseteq A\}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/d1e3bd7b51009825cbb83818513e7d74a98d2632)
例如,设非确定型图灵机
的当前状态为
,当前读写头所读的符号为
,若
![{\displaystyle \delta (q,x)=\{(q_{1},x_{1},d_{1}),(q_{2},x_{2},d_{2}),\ldots ,(q_{k},x_{k},d_{k})\}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/f6a241ffba43d4145f12fac7e1b8f50fdd301be5)
则
将任意地选择一个
,按其进行操作,然后进入下一步计算。
非确定型图灵机
在输入串
上的计算过程可以表示为一棵树,不同的分支对应着每一步计算的不同的可能性。只要有任意一个分支进入接受状态,则称
接受
;只要有任意一个分支进入拒绝状态,则称
拒绝
;某些分支可能永远无法停机,但只要有一个分支可以进入接受或拒绝状态,我们就说
在输入
上可停机。注意,我们规定
必须是无矛盾的,即它不能有某个分支接受
而同时另一个分支拒绝
,这样有矛盾的非确定型图灵机是不合法的。
定理:对于任意一个非确定型图灵机
,存在一个确定型图灵机
,使得它们的语言相等,即
。
证明:因为非确定型图灵机的计算过程就是一棵树,因此我们只需遍历该树就可以模拟其计算过程。一个简单的想法是利用深度优先搜索来遍历
的计算树,但这样行不通,因为
的某些计算分支可能永远不停机!所以我们可以采用一种在算法设计中称为迭代加深搜索的技巧来遍历
的计算树。具体证明如下:
对于非确定型图灵机
,构造一个确定型图灵机
如下:
- 令
; - 深度优先地模拟
的每个分支的计算,但每个分支最多只计算
步,如果某个计算分支在
步内可以停机,则
也停机,并将该计算分支的计算结果输出。 - 令
增加 1,跳转到上一步继续执行。
显然,若
有某个分支可以停机,则此
也一定会找到该分支并停机。因此
。
定理2:如果语言L被非确定型图灵机
在多项式时间内接受,则一定存在多项式P使得语言L被时间复杂度为
的确定型图灵机程序所接受。
定理2说明了为什么在证明P = NP之前,所有的NPC问题都只有指数时间复杂度算法。
|
---|
易解复杂度类 | | |
---|
怀疑难解复杂度类 | |
---|
难解复杂度类 | |
---|
复杂度类的谱系 | |
---|
相关复杂度族 | |
---|