需要具備的只是 編譯原理 前第三章(詞法分析,大概花個17個課時就可以了,讀者要是感興趣的話,可以多多深入瞭解)東南大學 廖力老師的編譯原理很不錯,推薦讀者自己看看,(考前同學可以看看)
基本概念講解
即如下知識
- 正規集,在編譯原理中叫做 語言-> ,也就是說有句子的集合(這裏要對句子有個非常清晰的理解,句子就是符合語法規則的字符串(更準確地應該叫做終結符組合而成字符串)),也可以理解爲 在樹葉子節點組成的集合,在被3整除的所有能表示的數字串組成的集合就是在這個應用場景下的正規集:
非被3整除的句子有: 112 ,11111,12311。。。
被3整除的句子有: 111, 132, 13599。。。
- 字母表,可以理解爲 ascii碼中的所有字符集合,也可以理解成英語中的26個字母,因爲所有單詞都是都是從這個字母表中的字符組合而成的,通常用代表空串,一般理解爲開始符和結束符階段,當然也可以在任一狀態都可以使用代表自身,不過這有點沒有多少意思,反而會使得自動機轉向不確定,徒增編碼難度:
更準確的說法是,在一個問題空間中,所構成終結符的元素,而這些元素不可再分
- 狀態集,包括三種
a) 初始狀態 (start)來表示,也就是程序的主入口,或者計算機方法或者函數的參數列表
b)中間狀態 ,可以由終結符和非終結符共同組成,用來表示非結束狀態的中間生成過程的狀態
c)結束狀態 , (Z是字母表種最後面的)
在編譯原理中也叫做 ∈ ∪,其中
表示終結符(terminal symbol),即對應到編譯原理中的詞法分析中的所有單詞或者語法分析中的所有句子。
表示非終結符(Nonterminal symbol),在語法分析中,使用到的中間表達過程,比如語法單位:《謂語》《主語》詞法單位:《名詞》 《動詞》都是屬於中間狀態,這些狀態對正規集中的每一個元素的一種抽象的描述,方便我們組合成表達式,或者生成式
- 轉移方程,也可叫做映射方程組,在編譯原理中叫做生成式組,在數學中叫做函數(聯立方程組),其實指的都是一個東西,轉換的方式或轉換的過程,用表示,表達了狀態可以通過轉移方程轉化到狀態。
根據映射方程或者函數的單射和非單射分兩種類型的有限自動機
a) 單射函數對應的是 確定性(deterministic)的有限自動機(DFA),因爲每一種狀態到下一步的轉化通過單射(有且只能轉化成一個固定的狀態)進行映射,也就是邊的方向是唯一確定的。而
b) 不確定性有限自動機(NFA),與DFA恰恰相反,一般來說,根據定理 我們可以通過一種算法使得 NFA 轉換到DFA,也就是NFA確定化方法(子集法等)生成DFA,並對DFA進行簡化成一個最優DFA,方便我們編程,因爲在DFA中有些狀態可能是等價的,要進行合併,一般通過分裂法進行分裂
有限狀態機
以下是有限狀態機五元式方法的最重要的幾個概念用一張圖來表示有限狀態機做如
圖1.1
我們可以用圖的方式能夠代表
-
語言集,也就是非計算機人所要表達的話,或者說是輸入數據集,因爲,在計算機的世界中,計算機是不清楚人講的是什麼的,因此我們用外部代表語言集。
-
M 有限自動機,這個可以理解爲是一個真正的計算機,裏面的所有規則,狀態,轉換方程都是計算機能夠理解的,或者說用這個圖,我們可以翻譯成計算機程序,讓計算機編程一個自動機的樣子或者說是一個自動機器人那樣。圖中的只有一個圈的代表非終結符,兩個圈圈的表示爲終結符。,,,分別爲轉換方程組中的方程,可以理解爲if(遇到f1的條件){then 從 0 狀態轉化到1狀態},在詞法分析部分,,,,代表了遇到的每個字符的(a,b,c),即遇到“a”字符應該走哪個方程的意思
-
輸出結果,也就是最後讓自動機回覆的輸出內容。通常,有如下兩個方式結束(不符合規範,或不符合文法集,或不符合轉移方程組)判斷
a) 在自動機狀態轉移過程中,遇到了一個狀態無法正常通過轉移方程進行轉化
b) 在判斷最終程序停在非終結符的時候代表着程序失敗,輸出錯誤信息,反之能夠根據這個去欸的那個
圖,直觀理解
我們可以發現這個圖其實描述的是一個確定性有限自動機的過程,因爲每個狀態通過特定轉移方程都能夠唯一確定一個狀態節點。下圖就是一個非確定性自動機,因爲 狀態1號通過 方程可以走向狀態0或狀態2,用圖表示就更直觀,因爲這個圖是給人看的。
圖1.2
矩陣思路
狀態id\轉移方程 | ||||
---|---|---|---|---|
0 | 1 | / | / | / |
1 | / | 0,2 | / | 1 |
2 | / | / | 3 | 1 |
3 | / | / | / | / |
通過把根據圖1.2的非確定性有限自動機讓我們人來看是非常直觀的,那對於計算機來說不太友好,爲了解決計算機識別的問題,往往通過轉化成矩陣的形式,這個也是翻譯成程序的一個非常直觀的方法,讀者試着用if else等程序語言寫寫這個自動機,是不是很簡單呢?是的,我們可以直接用雙手敲出一些邏輯表達式來實現有限狀態機,不需要多麼高深的理論,不過僅限於確定型有限自動機。
進入話題
在今天我將的主題,用正則表達式來表示一個被3整除的數字串,其實這個問題是我在幾年前看到的一篇知乎文章,使用到的是有限自動機。
我們需要確定以上這四個點
-
尋找正規集,也就是句子
這個主題中的正規集是什麼?很簡單,比如
所能表示的所有能被3整除的數字串的集合,也就是數學定義中的空間集合 -
定位字母表
字母表是什麼? 其實這裏的字母表就是
所有能組成正規集元素的最小組成集合 -
尋找狀態集合
狀態集是什麼?這裏就是比較有技巧的地方,也是最難定位的一個地方,俗話說得好,解決問題的方法永遠比難題本身還要多,而這個方法就是我們要去探索、吸取、總結以及創新的地方。不過有個比較取巧的方法(套路)是我們從一點一點試探的過程中總結出,不可能一蹴而就的。
但是有個比較好的方式,先尋找轉移方程,然後再確定狀態集合,學過深度學習的同學會發現,這裏的狀態集合像極了神經元,我們不知道神經元是什麼,但是我們卻能通過權重的調整使得模型達到無限接近於現實。那麼這裏的權重像極了轉移方程 -
轉移方程式什麼
首先,我們可以簡單把字母表中的字母作爲轉移方程的分段函數,也就是定位了10個分段函數,不知是哪位教授說起過,人們認識事物的直接方式是分段函數,然後不斷優化?,
其次,合併同一性質的分段函數,通過找規律,我們可以把{0,3,6,9},{1,4,7},{2,5,8} 作爲分段三組分段,每一分段,都是隨機產生的,你也不知道下一步是哪個分段。當然在某種意義上來看分段,使得人們思考問題的方式更加精簡,也就達到了飛的感覺
最後 畫出 如下的狀態轉移圖,盜個圖。。
-
如何進行狀態機與正則表達式之間進行轉換。
這個技術是通用的,先寫到這,有時間再寫哈