1. 程式人生 > >chapter3-有限狀態自動機

chapter3-有限狀態自動機

chapter3:finite-state automation. 原書中第三版中的這一章還沒寫完,所以是看的圖書館借來的第二版,並結合宗成慶老師的統計自然語言處理來看的。

有限狀態自動機 finite-state automation, FSA

前面一章節中的正則表示式只是一種用於文字搜尋的方便的元語言,它是描述有限狀態機的一種方法。

任何正則表示式又可以用有限狀態機來實現(除了使用儲存特性的那些正則表示式)。比如上一章中用於描述羊的語言的正則表示式: /baa+!/ 就可以表示為這樣的有限自動機:

FSA可以用來識別(或接受)符號串。接受方式如下:把輸入想象成一個長長的帶子(tape),帶子上的一個單元格(cell)可以寫一個符號:

怎麼理解這個輸入帶子和自動機呢?就是當輸入帶上的字母和自動機中離開當前狀態的弧相匹配時,就穿過這個弧,進入到自動機中的下一個狀態和帶子上的下一個符號。比如上圖中初始狀態 q0 只有遇到b時才會匹配成功而進入下一個狀態和輸入符號,所以上圖中的自動機不能接受輸入。對圖2.10中 q3 狀態,他可以匹配 a或!.

我們可以用狀態轉移表(state-transition table)來表示自動機。狀態轉移表可以表示初始狀態、接收狀態和符號在狀態之間的轉移情況。

一個有限自動機可以用下面5個引數來定義:

其中Q表示N種狀態的集合,Σ 表示有限的輸入符號字母表, q0是初始狀態,

FQ 是終極狀態。 δ(q,i) 是轉移矩陣,其中 qQ,iΣ. δ(q,i) 返回一個新的狀態,qQ,則 δ(q,i) 是從 Q×Σ 到 Q 的一個關係.

在HMM中,狀態轉移矩陣是N*N的,跟這裡有區別。

DFSA

可以用狀態轉移表來識別字符串,就是把一個字串輸入進去,然後用自動機來判別是accept還是reject。這種演算法是“確定性的是識別器”,deterministic演算法,簡稱 D-RECOGNIZE.

虛擬碼:

在圖2.13中,狀態之間的轉移矩陣是 transition-table[current-state, tape[index]]. current-state表示行,tape[index]表示列。其中index = index + 1.

如果將狀態轉移矩陣中的空狀態稱為失敗狀態(fail state)或者吸收狀態(sink state).那麼對任何狀態和任何輸入,自動機都能找到可以轉移的地方。

NFSA

存在某個狀態,難以判斷接下來怎麼走的自動機稱為非確定的FSA(或NFSA).如下圖:

還有一種NFSA,用到了 ϵ 轉移的新弧。如果到達了狀態3,那麼可以進入帶有標記!的弧,也可以不看帶子上的符號,直接轉移到狀態2.

那麼其對應的狀態轉移表如下圖:

用NFSA來接受符號串: 有三種方法:

  • 回退
  • 前瞻
  • 並行

這裡我們採用回退法:

程式碼閱讀:

function ND-RECOGNIZE(tape, machine) return accept or reject

  1. 建立程序表(agenda): 其中的元素是current-search-state, 是由自動機的一個結點(狀態)和帶子上的一個位置組合而成的。
    agenda = {(Initial state of machine, beginning of tape)}
    current-search-state = NEXT(agenda)

  2. 主迴路:用來確定輸入帶子上的全部內容是否都被自動機全部識別了,這可以用ACCEPT-STATE?函式實現,如果當前搜尋狀態既包括一個接受的機器狀態,也包含一個子結尾的指標,那麼就返回accept.這一步類似於 D-RECOGNIZE. 如果不行,那就呼叫 GENERATE-NEW-STATE 來生成一系列可能的下一個狀態。

if ACCEPT-STATE?(current-search-state) return ture :
  return ACCEPT
else
  agenda = agenda and GENERATE-NEW-STATE(current-search-state) //這一步不太理解???
if agenda is empty:
  return reject
else
  current-search-state = NEXT(agenda)

NEXT函式從程序表返回一個為探測過的狀態。那麼怎麼定義函式NEXT,這是一個值得研究的問題。

  • 程序表用stack實現,那就是深度優先搜尋(depth-first search)或後進先出(Last In First Out, LIFO).
  • 程序表用queue實現,那就是廣度優先搜尋(breadth-first search)或先進先出(First In First Out, FIFO).

    1. ACCEPT-STATE? 函式用來確定輸入帶子上的全部內容是否都被自動機成功的識別了。
function ACCEPT-STATE? (search-state)  returns ture of false
  current-node = the node search-state is in
  index = the point on the tape search-state is looking at
  if index is at the end of the tape and current-node is an accept state of machine:
    return ture
  else
    return false
  1. GENERATE-NEW-STATE函式用與選取一種為訪問過的路徑
    需要理解的是:在NEXT(agenda)中,agenda採用的是stack或queue, 那麼意味著在只有一種選擇的結點處,走過就刪掉了,只有有兩種選擇的地方,另外一種會儲存在agenda中。所以current-search-state = NEXT(agenda)生成的是有兩種選擇處的未訪問過的路徑。那麼GENERATE-NEW-STATE函式就是生成這樣的一個路徑,然後在ACCEPT-STATE?中判斷。

識別就是搜尋: 把符號串輸入當做輸入帶,然後用自動機來識別。其實也可以看作是搜尋的過程。

深度優先搜尋:

廣度優先搜尋:

形式語言

相關推薦

chapter3-有限狀態自動機

chapter3:finite-state automation. 原書中第三版中的這一章還沒寫完,所以是看的圖書館借來的第二版,並結合宗成慶老師的統計自然語言處理來看的。 有限狀態自動機 finite-state automation, FSA 前

【Codeforces 506E】Mr.Kitayuta’s Gift&&【BZOJ 4214】黃昏下的禮物 dp轉有限狀態自動機+矩陣乘法優化

合數 現在 子序列 pri blue gre () div while 神題……胡亂講述一下思維過程……首先,讀懂題.然後,轉化問題為構造一個長度為|T|+n的字符串,使其內含有T這個子序列.之後,想到一個簡單的dp.

非確定有限狀態自動機的構建-NFA的定義和實現

保留版權,轉載需註明出處(http://blog.csdn.net/panjunbiao)。 非確定有限狀態自動機(Nondeterministic Finite Automata,NFA)由以下元素組成: 一個有限的狀態集合S 一個輸入符號集合Sigma,並且架設空字元eps

詞法分析——有限狀態自動機(FA)

舉個例子 在上圖中, Σ\SigmaΣ表示自動機可以識別的所有的不同的字元的集合。Σ=a,b\Sigma = {a,b}Σ=a,b S 是狀態集,在這裡只有三種狀態,所以 S = {0, 1, 2} q0q_0q0​是初始狀態,我們一般約定只有一個單向箭頭的

DFA確定有限狀態自動機

ima 現狀 i++ bubuko 英語 stat mini 否則 lse DFA 在計算理論中,確定有限狀態自動機或確定有限自動機(英語:deterministic finite automaton, DFA)是一個能實現狀態轉移的自動機。對於一個給定的屬於該自動機的狀態

字串匹配演算法之:有限狀態自動機

什麼叫有限狀態自動機 先看一個圖: 上面這個圖描述的就叫一個有限狀態自動機,圖中兩個圓圈,也叫節點,用於表示狀態,從圖中可以看成,它有兩個狀態,分別叫0和1. 從每個節點出發,都會有若干條邊,當處於某個狀態時,如果輸入的字元跟該節點出發的某條邊的

自動機狀態機,有限自動機有限狀態機,有限狀態自動機,非確定下有限狀態自動,確定性有限狀態自動機的區別於聯絡

這幾個概念暈了幾天了,搞明白了就來備註一下 FSM(Finite State Machine) FAM(Finite Automata Machine) DFA(Determinate Finite Automata) NFA(Non-Determinate Finite

有限狀態自動機FSM實現(二)--State模式

基於switch結構的有限狀態自動機的實現已經在前一篇博文中給出,請猛擊。 State模式適用於如下情況: 1)一個物件的行為取決於它的狀態,並且必須在執行時根據狀態改變它的行為。 2)一個操作中含有龐大的多分支的條件語句,且這些分支依賴於該物件的狀態。 State模

有限狀態自動機 正則表示式

概念 記號有字母表中的符號組成的有限長度的序列。記號s的長度記為|s|。 長度為0的記號稱為空記號,記為ε。有限自動機(Finite State Automaton)為研究某種計算過程而抽象出的計算模型。 擁有有限個狀態,根據不同的輸入每個狀態可以遷移到其他的狀態。非確定有限自動機(Nondeterm

【學渣】字元匹配之有限狀態自動機--應用在爬蟲程式中匹配網址

關於自動機的原理的文章已經有很多了,我就不再多說了,我覺得很多部落格都寫的很好 我就寫一下在網址匹配方面的應用吧 其實很多人大都會選擇正則表示式  如果是有規律的匹配,應該有一個狀態轉移函式,但是我沒有為下圖找到規律,所以就用了最蠢的方法 如果是連續的輸入,比如ababab

Vijos P1849 表示式求值【有限狀態自動機

描述 給定一個只包含加法和乘法的算術表示式,請你程式設計計算表示式的值。 格式 輸入格式 輸入僅有一行,為需要你計算的表示式,表示式中只包含數字、加法運算子“+”和乘法運算子“*”,且沒有括號,所有參與運算的數字均為 0 到 2 ^ 31 -1 之間的整數。輸入資料保證

獨立項目-角色控制器-有限狀態機(FSM)

技術分享 OS pos .com com 過渡 動畫過渡 unity 狀態機   學習內容:     Unity5的新動畫系統       1.動畫導入 分動畫       2.創建動畫狀態機       3.設置動畫過渡 設置動畫跳轉條件       4.動畫重定向 獨立

go - FSM(有限狀態機)初體驗

層次 time lba 當前 時機 警告 pen nil 自定義 FSM有限狀態機 /** * @Author: wsp * @Time : 2018/4/11 16:45 * @Description: */ package fsmStrudy import

Verilog筆記.3.有限狀態

情況 || mage 參數 lose default def ril 定義 有限狀態機有限狀態機是由寄存器組和組合邏輯構成的硬件時序電路,其狀態(即由寄存器組的1和0的組合狀態所構成的有限個狀態)只可能在同一時鐘跳變沿的情況下才能從一個狀態轉向另一個狀態,究竟轉向哪一狀態還

TCP三次握手、四次端口和有限狀態

TCP三次握手、四次端口和有限狀態機1、TCP用三次握手(three-way handshake) 一對終端同時初始化一個它們之間的連接是可能的。但通常是由一端打開一個套接字(socket)然後監聽來自另一方的連接,這就是通常所指的被動打開(passive open)。服務器端被被動打開以後,用戶端就能開始創

FPGA學習筆記(七)——FSM(Finite State Machine,有限狀態機)設計

fault mil 系統 time 編碼 代碼 ril esc 寫法   FPGA設計中,最重要的設計思想就是狀態機的設計思想!狀態機的本質就是對具有邏輯順序和時序規律的事件的一種描述方法,它有三個要素:狀態、輸入、輸出:狀態也叫做狀態變量(比如可以用電機的不同轉速作為狀態

文字版 描述TCP三次握手和四次揮手以及有限狀態機等

切換 list 遠方 是什麽 int last 關閉 ive tcp報文 客戶端和服務器 ,雙方都處於第一次交互的情況下展開通信 三次握手 1.首先 服務器 需要是處於listen收聽狀態下才能接受報文客戶端由closed狀態 打開並向服務器發送報文SYN=1 申請建

從React Redux的實際業務場景來看有限狀態

寫在前面 上一篇:從Promise的實現來看有限狀態機 上一篇講到了一個簡單的,利用了有限狀態機的前端實現Promise。Promise的有限狀態機除了start以及finish兩個狀態,其核心的三個狀態其實就是一個非同步行為的三種狀態:PENDING、FULFILLED、REJECTED。通過非同步行為

前端狀態管理與有限狀態

原文連結 當下前端流行的框架,都是用狀態來描述介面(state => view),可以說前端開發實際上就是在維護各種狀態(state),這已經成為目前前端開發的共識。 View = ViewModel(Model); 複製程式碼 理想情況下,ViewModel 是純函式,給定相同的 Mod

Verilog_有限狀態

名詞解釋 狀態機就是一種能夠描述具有邏輯順序和時序順序事件的方法。 狀態機有兩大類:Mealy型和Moore型。 Moore型狀態機的輸出只與當前狀態有關,而Mealy型狀態機的輸出不僅取決於當前狀態,還受到輸入的直接控制,並且可能與狀態無關。 當使用Veril