從正則表達(dá)式(RE)到最小確定性有限狀態(tài)自動機(jī)(DFA)

RE(Regular Expression)到最小DFA(Deterministic Finite Automaton)的轉(zhuǎn)換是構(gòu)建正則表達(dá)式引擎的基礎(chǔ),并且也是構(gòu)建詞法分析器的基礎(chǔ).

RE

RE描述了一個定義在某個字母表Σ上的字符串集合L,并且空字符串ε也屬于L集合.形式化的定義并不好理解,但是相對其他非形式化的定義來說更加簡潔和準(zhǔn)確.這里的正則表達(dá)式和平常所用的處理字符串的正則表達(dá)式是同一個,但是這里更加簡單.這里的RE只有三個基本的操作:
(1)選擇 取并集.符號:|. 比如兩個字符串集合R和S的選擇操作,記作R|S.
(2)連接 字符串之間的拼接.兩個字符串集合R和S的連接為RS.
(3)閉包 符號:* 字符串集合R的閉包R*是指把R與自身連接零次或者多次形成的所有集合的并集.
??由這幾個簡單的操作可以得到我們平常接觸的正則表達(dá)式的所有擴(kuò)展.

有限狀態(tài)自動機(jī)(Finite Automaton,FA)

我說的時候喜歡加上狀態(tài)兩個字,因?yàn)镕A的關(guān)鍵動作就是狀態(tài)間的轉(zhuǎn)移.FA有一個狀態(tài)集S,對于每一個輸入都會讓FA的狀態(tài)進(jìn)行轉(zhuǎn)移.如果能夠從起始狀態(tài)轉(zhuǎn)移到接受狀態(tài),那么輸入序列就被識別了.不存在空字符串ε的狀態(tài)轉(zhuǎn)移.
??非確定性有限狀態(tài)自動機(jī)(Non-deterministic Finite Automaton,NFA).對于同一輸入轉(zhuǎn)移到多個不同的狀態(tài)或者存在空字符串ε的狀態(tài)轉(zhuǎn)移的FA.
??確定性有限狀態(tài)自動機(jī)(Deterministic Finite Automaton,DFA).對于任何確定的輸入都只有唯一確定的轉(zhuǎn)移且不存在空字符串ε的狀態(tài)轉(zhuǎn)移的FA.

從正則表達(dá)式到NFA

上面描述的RE的基本操作的簡單NFA:

a的NFA
b的NFA
ab的NFA
a|b

a的閉包:a*的NFA

只要有了這三個RE基本操作的NFA,我們就能對任何組合得來的RE求出對應(yīng)的NFA.

構(gòu)造"a(b|c)*"的NFA舉例

NFA到DFA

NFA到DFA 是對NFA的簡化過程.
??NFA到DFA的子集構(gòu)造算法(The Subset Construction):從將初始狀態(tài)劃分為一個初始狀態(tài)子集開始,構(gòu)造狀態(tài)子集(經(jīng)過零個或多個空字符串ε轉(zhuǎn)移到的狀態(tài)和已在子集中的狀態(tài)都是構(gòu)造的新的狀態(tài)子集),存在c屬于字母表Σ,經(jīng)過一個c的轉(zhuǎn)移(必須有c的轉(zhuǎn)移),能夠使得從狀態(tài)子集ni轉(zhuǎn)移到狀態(tài)子集nj,則在DFA中有在c的輸入下從狀態(tài)子集ni轉(zhuǎn)移到狀態(tài)子集nj的轉(zhuǎn)移.最后不再有新的狀態(tài)子集出現(xiàn).根據(jù)狀態(tài)子集的轉(zhuǎn)移依次構(gòu)造DFA.

子集構(gòu)造算法得到的"a(b|c)*"的DFA

DFA到最小DFA

最小化DFA用到的是等價狀態(tài)集合的劃分來構(gòu)建.一開始只有兩個狀態(tài)集,一個接受狀態(tài)集合,一個非接受狀態(tài)集合.對于每一個狀態(tài)集合Sp,如果存在c屬于字母表Σ,使得Sp中的狀態(tài)轉(zhuǎn)移到不同的狀態(tài)集合(包括沒有轉(zhuǎn)移的空狀態(tài)集合),則拆分Sp,使得拆分后的狀態(tài)集合中的每一個狀態(tài)不可能轉(zhuǎn)移到不同的狀態(tài)集合.其中狀態(tài)集合之間的轉(zhuǎn)移構(gòu)成最小化DFA中的轉(zhuǎn)移.

"a(b|c)*"最小化DFA的初始劃分
"a(b|c)*"的最小DFA
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子暑中,更是在濱河造成了極大的恐慌嫉父,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)丘薛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邦危,“玉大人洋侨,你說我怎么就攤上這事舍扰。” “怎么了希坚?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵边苹,是天一觀的道長。 經(jīng)常有香客問我裁僧,道長个束,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任聊疲,我火速辦了婚禮茬底,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘获洲。我一直安慰自己阱表,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布贡珊。 她就那樣靜靜地躺著最爬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪门岔。 梳的紋絲不亂的頭發(fā)上爱致,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機(jī)與錄音寒随,去河邊找鬼糠悯。 笑死,一個胖子當(dāng)著我的面吹牛牢裳,可吹牛的內(nèi)容都是我干的逢防。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蒲讯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了灰署?” 一聲冷哼從身側(cè)響起判帮,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎溉箕,沒想到半個月后晦墙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肴茄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年晌畅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寡痰。...
    茶點(diǎn)故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡抗楔,死狀恐怖棋凳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情连躏,我是刑警寧澤剩岳,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站入热,受9級特大地震影響拍棕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜勺良,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一绰播、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尚困,春花似錦蠢箩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至讳侨,卻和暖如春呵萨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背跨跨。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工潮峦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人勇婴。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓忱嘹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親耕渴。 傳聞我的和親對象是個殘疾皇子拘悦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 什么是正則表達(dá)式 工作中我們經(jīng)常使用正則表達(dá)式來解決問題。正則表達(dá)式又稱規(guī)則表達(dá)式橱脸,其實(shí)就是事先定義好的一些特定字...
    張大川大川閱讀 2,195評論 0 3
  • 正則表達(dá)式础米,又稱正規(guī)表示式、正規(guī)表示法添诉、正規(guī)表達(dá)式屁桑、規(guī)則表達(dá)式、常規(guī)表示法(英語:Regular Expressi...
    Zhang21閱讀 937評論 0 0
  • 寫在前面 從源代碼到可執(zhí)行文件要經(jīng)歷幾個過程: 詞法分析 語法分析 語義分析 中間代碼生成 代碼優(yōu)化 詞法分析有點(diǎn)...
    wsztrush閱讀 2,010評論 0 5
  • re模塊手冊 本模塊提供了和Perl里的正則表達(dá)式類似的功能栏赴,不關(guān)是正則表達(dá)式本身還是被搜索的字符串蘑斧,都可以...
    喜歡吃栗子閱讀 4,012評論 0 13
  • 世界只剩下了我和音樂 倚靠在車窗,任風(fēng)馳騁 抓起的發(fā),與風(fēng)做著抵抗 顧不上它的頹廢竖瘾、美 只想伸手觸碰是否自己還有 ...
    郭青年閱讀 151評論 0 2