天天看點

《計算複雜性:現代方法》——1.2 圖靈機

本節書摘來自華章計算機《計算複雜性:現代方法》一書中的第1章,第1.2節,作者 [美]桑傑夫·阿羅拉(sanjeev arora),博阿茲·巴拉克(boaz barak),譯 駱吉洲,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

《計算複雜性:現代方法》——1.2 圖靈機
《計算複雜性:現代方法》——1.2 圖靈機

演草紙

演草紙包含k條帶,每條帶均由單向無限延伸的很多單元構成,每個單元能夠存儲稱為機器的字母表的有限集Γ中的一個符号。每條帶均有一個帶頭,它具有在帶上每次讀或寫一個符号的能力。機器的計算劃分為一系列離散的時間步驟,帶頭在每個步驟中能夠向左或向右移動一個單元。

機器的第一條帶是輸入帶,其帶頭隻能從該帶上讀取符号而不能寫符号,是以這是一條隻讀帶。另外的k-1條讀寫帶稱為工作帶,其中最後一條帶是輸出帶,機器在計算終止前把最終計算結果寫在輸出帶上。

圖靈機還允許使用随機通路存儲器。然而,已經證明,圖靈機的這種變形與标準的圖靈機具有相同的計算能力(參見習題1.9)。

有限操作/規則集

圖靈機有有限種狀态,表示為q。機器有一個“寄存器”,它能夠在任何時刻記錄機器處于q中的何種“狀态”。狀态确定了機器在下一個計算步驟要采取的動作,包括:(1)直接讀取k個帶頭所在存儲單元的符号;(2)在k-1條讀寫帶上,将帶頭所在存儲單元的符号替換為新的符号(也可以通過再次寫下原來的符号而不改變帶);(3)修改寄存器使其記錄來自有限集q中的另一種狀态(狀态也可以保持不變,這隻需選擇與之前相同的狀态);(4)将每個帶頭向左或向右移動一個單元(或保持不動)。

圖靈機可以看成是現代計算機的簡化,它的帶是計算機的記憶體,而轉移函數和寄存器則是計算機的中央處理器(cpu)。雖然如此,但最好還是将圖靈機視為描述算法的一種簡單的形式化方法。盡管描述算法的最佳方法是用白話,但這種形式化的描述方法将有助于對算法的數學分析(與此類似,用程式設計語言描述算法則是為了在計算機上執行算法)。

形式定義

《計算複雜性:現代方法》——1.2 圖靈機
《計算複雜性:現代方法》——1.2 圖靈機
《計算複雜性:現代方法》——1.2 圖靈機

1.将輸入複制到讀寫工作帶上;

2.将輸入帶帶頭移動到輸入的開始位置;

3.輸入帶帶頭向右移動,而工作帶帶頭向左移動。如果機器在帶頭移動過程的任何時刻發現了兩個不同的值,則停機并輸出0。

4.停機并輸出1。

《計算複雜性:現代方法》——1.2 圖靈機

顯然,完整地描述一個圖靈機非常繁瑣,但卻并不是總能提供更多的資訊。盡管如此,你自己構造一兩個完整的圖靈機也是十分有益的(見習題1.1)。本書其餘部分将不再像上例一樣給出每個圖靈機的每個細節,而将在更高的層次上描述圖靈機。對于具備了部分程式設計經驗的讀者,例1.2将使他們(至少在原理上)了解到如何構造圖靈機來求解通過程式設計能解決的各種計算任務。

我們的第一印象是,圖靈機是否概括了關于計算的直覺概念還不甚明了。讀者最好能自己做一些簡單的練習14,比如将加法和乘法的标準算法用圖靈機表示出來以完成相應的函數計算(參見習題1.1),這必将大有裨益。做完這樣的練習,就可以考慮下面的例子,把你用熟悉的程式設計語言編寫的程式轉換為圖靈機。(反之,大多數程式設計語言也能模拟圖靈機。)

例1.2(用圖靈機模拟一般程式設計語言) 本例需要關于計算的一些背景知識。我們概略地說明如何把用熟悉的程式設計語言(如c和java)編寫的程式轉換為等價的圖靈機。首先,用程式設計語言編寫的程式可以(用編譯技術)翻譯成用機器語言表示的程式,也就是一個指令序列,每個指令均是如下的幾種簡單操作之一:(a)從記憶體讀取資料放入一個寄存器中,寄存器的個數是有限的;(b)把某個寄存器中的資料寫入記憶體;(c)将某兩個寄存器的值相加後将結果存入第三個寄存器;(d)将某兩個寄存器的值相乘後将結果存入第三個寄存器。所有這些操作均可以很容易地被圖靈機模拟。記憶體和寄存器可以實作為圖靈機的帶,而指令則實作為圖靈機的轉移函數。例如,不難實作将兩數相加或相乘的圖靈機。2帶圖靈機可以用來模拟計算機記憶體,它用一條帶表示被模拟的記憶體,另一條帶則用來實作二進制到一進制的轉換。這樣,對每個用二進制表示的數i,圖靈機可以借助第二條帶将i轉換成一進制,再據此讀取或修改第一條帶上的第i個位置的值。我們将上述過程的細節留作習題1.8。

練習1.10要求為定制的程式設計語言嚴格地證明上述模拟。

繼續閱讀