如果不加特殊說明,通常所說的圖靈機都是確定型圖靈機。非確定型圖靈機和確定型圖靈機的不同之處在於,在計算的每一時刻,根據當前狀態和讀寫頭所讀的符號,機器存在多種狀態轉移方案,機器將任意地選擇其中一種方案繼續運作,直到最後停機為止。具體而言,其狀態轉移函數為
![{\displaystyle \delta :Q\times \Gamma \to 2^{Q\times \Gamma \times \{L,R\}}}](//wikimedia.org/api/rest_v1/media/math/render/svg/2c90f729c6f5a499e763dd1b6d574c0be79cfb71)
| 此條目 沒有列出任何參考或來源。 (2010年8月21日) |
其中
是狀態集合,
是帶字母表,
分別表示讀寫頭向左和向右移動;符號
表示集合
的冪集,即
![{\displaystyle 2^{A}=\{S~|~S\subseteq A\}}](//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})\}}](//wikimedia.org/api/rest_v1/media/math/render/svg/f6a241ffba43d4145f12fac7e1b8f50fdd301be5)
則
將任意地選擇一個
,按其進行操作,然後進入下一步計算。
非確定型圖靈機
在輸入串
上的計算過程可以表示為一棵樹,不同的分支對應着每一步計算的不同的可能性。只要有任意一個分支進入接受狀態,則稱
接受
;只要有任意一個分支進入拒絕狀態,則稱
拒絕
;某些分支可能永遠無法停機,但只要有一個分支可以進入接受或拒絕狀態,我們就說
在輸入
上可停機。注意,我們規定
必須是無矛盾的,即它不能有某個分支接受
而同時另一個分支拒絕
,這樣有矛盾的非確定型圖靈機是不合法的。
定理:對於任意一個非確定型圖靈機
,存在一個確定型圖靈機
,使得它們的語言相等,即
。
證明:因為非確定型圖靈機的計算過程就是一棵樹,因此我們只需遍歷該樹就可以模擬其計算過程。一個簡單的想法是利用深度優先搜索來遍歷
的計算樹,但這樣行不通,因為
的某些計算分支可能永遠不停機!所以我們可以採用一種在算法設計中稱為迭代加深搜索的技巧來遍歷
的計算樹。具體證明如下:
對於非確定型圖靈機
,構造一個確定型圖靈機
如下:
- 令
;
- 深度優先地模擬
的每個分支的計算,但每個分支最多只計算
步,如果某個計算分支在
步內可以停機,則
也停機,並將該計算分支的計算結果輸出。
- 令
增加 1,跳轉到上一步繼續執行。
顯然,若
有某個分支可以停機,則此
也一定會找到該分支並停機。因此
。
定理2:如果語言L被非確定型圖靈機
在多項式時間內接受,則一定存在多項式P使得語言L被時間複雜度為
的確定型圖靈機程序所接受。
定理2說明了為什麼在證明P = NP之前,所有的NPC問題都只有指數時間複雜度算法。