從正規式到DFA的三個過程 從正規式到NFA

2021-09-28 12:20:24 字數 2356 閱讀 9190

正規式是對模式的形式化描述,dfa負責高效、優雅地識別這種模式。從正規式到最優dfa要走三步:構建nfa、nfa確定化、dfa最小化。

本節關注從正規式構造nfa的演算法:thompson。在學習之前我們有必要把正規式和nfa兩者的本質和關係理清。

正規式的作用:描述乙個字串模式。

nfa的作用:識別乙個字串模式。

兩者關係:正規式負責生產,nfa負責驗收。

重點不是正規式如何生產,而是模式如何生產(正規式就是對模式的形式化描述嘛)。回想起形形色色的字串,我們會發現這些字串模式都有如下幾個基本特徵:基本成分為字元下乙個字元可以有多個選擇字元之間有連線。從這三個共有的基本特徵我們可以提煉出:模式生產就是這三個基本特徵的實體任意組合的過程

那麼換到正規式之後,我們也可以這樣說:正規式生產就是基本正規式任意組合的過程(這是從非形式化到形式化的對映)。與基本特徵對應的基本正規式包括:基本字元a(a代指任意字元)字元或』|『(做選擇)字元與』.』(連線)

驗收是根據生產過程而來的,這可不是先有雞還是先有蛋的問題,邏輯很清晰。既然這樣,我們自然而然想到,可以先求出基本正規式的nfa——基本nfa,然後剩下的所有工作就是對基本nfa的組合了。基本nfa將在演算法講解部分介紹,注意我們還會介紹兩個特殊的nfa:空字元e基本nfa(作狀態的連線)、閉包』*'復合nfa(識別模式的一種特殊結構)。

功能:從正規式構造乙個可以識別它的nfa。

輸入:字母表上的正規式r。

輸出:接收l(r)的nfa n。

原理:將基本nfa按照r中正規式的組合順序組裝起來,得到乙個冗餘的nfa。注意空狀態轉移e的靈活使用。

以下狀態中,s0是初態,f是終態。

基本nfa:

基本nfa1——識別空字元e:輸入乙個空字元e就到終態,識別完成。

這個nfa其實沒有做任何事:狀態s0和狀態f是同乙個狀態。它唯一的作用就是使模式的狀態轉換圖結構更加清晰,這是在考慮我們人類的感受。

基本nfa2——識別單字元a:輸入乙個字元a就到終態,識別完成。

這是最基礎的nfa,負責識別字母表中的每乙個字元。沒有它,一切只是搖搖欲墜之高樓廣廈。

基本nfa3——識別符號或』|『:只要輸入中有任意乙個預期字元(串),就到終態,完成識別。

名詞解釋:n(p)和n(q)都是乙個nfa。它們可以很簡單,只是上文提及的的基本nfa1、基本nfa2(識別乙個字元);也能很複雜,是許多個nfa的任意組合(識別乙個字串)。但不管怎樣,是nfa就對了。你懂我意思嗎?下文同義。

這個nfa負責」或「操作,可以識別出不同的」字元(串)「。

基本nfa4——識別符號與』.『:輸入連續的兩個預期字元(串),到達終端,完成識別。

這個nfa負責字元(串)的拼接,它能完成對廣泛延申的字元模式的識別。

復合nfa5——識別閉包*:輸入0或無窮多個預期字元(串),可以到達終態,此時完成識別。

比如對於a*,這個閉包nfa識別:空字元e、a、aa、aaa、aaaaaaaaaa……。

這以後,所有的構造工作都是對以上幾個nfa進行遞迴組裝了。

從三個方面理解ARM嵌入式系統

從硬體上,將基於cpu的處圍器件,整合到cpu晶元內部,比如早期基於x86體系結構下的計算機,cpu只是有運算器和累加器的功能,一切晶元要造外部橋路來擴充套件實現,象串列埠之類的都是靠外部的16c550 2的串列埠控制器晶元實現,而目前的這種串列埠控制器晶元早已整合到cpu內部,還有pc機有顯示卡,...

將三個數按從大到小輸出

解法一 if的迴圈巢狀 include int main else else else else else return 0 易錯點 多層if迴圈時造成混亂,無法理清題目 建議 先假設乙個變數最大,在此情況下分析其餘的兩個變數 再從內層向外層逐步分析 但是,這樣多的if語句很容易造成錯誤,所以用sw...

將三個數按從大到小輸出

方法一 思路分析 我的演算法將用到陣列和氣泡排序法。利用氣泡排序法可以比較簡單的將一串數字排序。完整程式 define crt secure no warnings include include intmain for i 0 i 3 i 陣列訪問 system pause return0 執行結...