圖靈機,Random Access Machine,和演算法的幾個基本要素
圖靈機
學過計算機課程的人,大概第一節課老師就會講圖靈,圖靈也被成為計算機之父。他是英國電腦科學家、數學家、邏輯學家、密碼分析學家和理論生物學家。他還提出了一種數學模型,圖靈機模型;圖靈機(Turing Machine,TM)又稱確定型圖靈機,它是一種抽象的計算模型。其更抽象的意義為一種數學邏輯機,可以看作等價於任何有限邏輯數學過程的終極強大邏輯機器。1 他的基本思想就是來,模擬人們用紙和筆進行數學計算的過程,我們可以把這樣的過程定義為以下的兩個步驟:
- 在紙上寫上或者擦出一個記號,
- 把標誌從一個記號移動到另一個記號中。
… | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | … |
---|
現在來給圖靈機模型增加一些定義:
- Tape:在一個無限長的紙帶中,均勻地分為單元格,各又某一字元
- Alphabet:字元的種類有限:這裡我們就把種類歸為0,1,#預設的為#
- Head,總是對準某一單元格,並可讀取和改寫其中的字元,沒經過一個字元,它也可以左轉或者右轉
- State:TM總是處於有限狀態中的一種,每經過一個單元格,可以(按照規則)轉向另一種狀態
- Transition Function:(q,c; d; L/R/N; p); 這個表示式的意思就是:如果當前狀態為q字元為c,則將當前字元改為d,轉向左側/右側/停止;轉入p狀態,一旦轉入特定的狀態‘h’,則停機
上述的這些定義就構成可圖靈機模型的所有場景了;圖靈機是強大的。Church–Turing thesis認為:“ 任何在演算法上可計算的問題同樣可以由圖靈機計算
圖靈機的一個簡單例子
上面簡單介紹了以下圖靈機的基本概念,我們也使用了Church–Turing thesis來說明圖靈機的強大,既然他這麼強大,說騾子是馬拉出來遛遛,所以這裡我們就把圖靈機應用到一個例子中。 Example 1: 把紙帶上儲存的值加1(使用二進位制來表示的無符號整數):
… | # | 1 | 1 | 1 | 1 | 1 | # | … |
---|
現在我們來定義我們的演算法:
- 初始狀態:head指向紙帶上的數值的最左邊那為緊挨著的那個“#”;
- 向左移動head,如果該位為1 則把這位變為0,head再向左移動,如果為0的話把這位變成1,head再向右移動,如果該位為#則把這位變成1 head向右移動
- 當head向右移動的時候不改變單元格上的數值。
- 最終狀態:head向右移動,知道head指向 # 的單元格結束
接下來我們就用一個表格來表示這樣的一個移動狀態(表示式的狀態放到第三列和第四列了):
步數 | 轉換函式表示式 | 紙帶(執行前 ) | 紙帶(執行後) |
---|---|---|---|
1 | (#,#,L) | #11111# | #11111# |
2 | (1, 0, L) | #11111# | #11110# |
3 | (1, 0, L) | #11110# | #11100# |
4 | (1, 0, L) | #11100# | #11000# |
5 | (1, 0, L) | #11000# | #10000# |
6 | (1, 0, L) | #10000# | #00000# |
7 | (#,1,R) | #00000# | 100000# |
9 | (0,0,R) | 100000# | 100000# |
10 | (0,0,R) | 100000# | 100000# |
11 | (0,0,R) | 100000# | 100000# |
12 | (0,0,R) | 100000# | 100000# |
13 | (0,0,R) | 100000# | 100000# |
14 | (#,#,N | 100000# | 100000# |
在這裡我們可能會有這樣的疑問,當我們在第七步的時候我們已經完成了數值加一的操作為什麼還要去進行後面的步驟呢,這個就涉及到演算法的初態和終態的概念,當我們下次再去這樣執行加一操作的時候,就可以在上一次的終態的基礎上進行操作了。這樣就方便了演算法的複用性
Random Access Machine
在計算複雜性理論內,隨機存取圖靈機(random-access Turing machines)是一種變版的圖靈機,用來處理大小較小的複雜度類,特別是使用對數時間的複雜度類.在隨機存取圖靈機上,多了一個特殊的指標磁帶,大小是對數空間,字母是二進位單字(0和1)。圖靈機有一個特殊的狀態(state),當指到這個狀態而指標磁帶的數字(二進位)是’p’時,圖靈機會將工作磁帶上面的指標移動到輸入的第p個符號。 這特性讓圖靈機可以直接讀取輸入的特定字母,而不需要花時間去處理整條輸入。這對使用少於線性時間的複雜度類來說,是必要的(因為處理整個輸入的時間是線性時間)2
RAM模型的定義:
R[i] <- c | R[i] <-R[R[j]] | R[i]<-R[j] + R[k] |
---|---|---|
R[i] <- R[j] | R[R[i]] <- R[j] | R[i] <- R[j] - R[k] |
IF R[i] = 0 GOTO 1 | IF R[i] >0 GOTO 1 | GOTO 1 |
演算法的幾個基本要素
所謂的演算法,即特定計算模型下,旨在解決特定問題的指令序列:
- 輸入 待處理的資訊(問題)
- 輸出 經處理的資訊 (答案)
演算法的特性:
- 正確性, 的確可以解決指定的問題
- 確定性,任意演算法可以描述為一個由基本操作的序列(TM,RAM中的基本操作)
- 可行性,每一個基本操作都可以實現,且在常數時間內完成
- 有窮行,對於任何輸入,經過有窮次的基本操作,都可以得到輸出
上面的這些特性都是一個演算法該有的特性。下面的這個特性是一個好演算法一個具有的特點:
- 健壯性,能辨別不合法的輸入並做適當的處理,而不是非正常的退出
- 可讀性, 結構化 +準確性 + 註釋 +…
- 效率性,它的速度儘可能快,儲存的空間儘可能小;
這三個特性的前兩個特性都是主觀意向的,不適合有客觀的標尺來衡量。但是第三個就可以用數學公式來把它大體上衡量出來。 在計算機行業中有這樣的 一個公式: Algorithm + Data Structures = Program; //N. Wirth ,1976 其中的演算法就可以表示為效率的代表。 那麼我們怎麼樣來用客觀的標尺來表示主觀上的快慢呢? 在這裡就要使用到我們這篇文章開始提到的TM ,Church–Turing thesis可以知道我們能解決的問題都可以替代到圖靈機的模型中,我們就可以用它在圖靈機模型上運動的步數來表示它的快慢,但是我們上面的7-14步計算機是在一步的時間內做完的,所以這裡就用RAM模型來衡量(它從根本上模擬來計算機的操作), 我們知道它是變版本的圖靈機模型所以圖靈機上能解決的,它都可以解決。所以這樣的話我們就把這個演算法的時間效率等價為在RAM上的執行步數。 在計算機的時間中一般用大O時間來表示一個演算法的上界,它可以表示一個演算法的效率。分別有:
常數時間 | 對數時間 | 多項式時間 | 指數時間 |
---|---|---|---|
O(1) | O(logn) | O(n^c) | O(c^n) |
把指數時間的演算法變成多項式時間複雜度就是NP hard問題來。