天天看點

軟考——初識有限自動機

        最近一直在忙軟體設計師考試,由于沒有參加自考,不像自考人員對于軟考内容接受起來那麼容易。其中第一個讓自己頭疼的就是fsm(有限狀态自動機),視訊中是針對題來講的,而軟考書中又都是一些專業術語、一些晦澀的數學式子。軟考講課小組中我又負責講這部分内容,哎呀!通過查一些資料,了解好多了。

一、專業性的解釋(百度百科)

        有限狀态自動機(fsm "finite state

machine" 或者fsa "finite state automaton" )是為研究有限記憶體的計算過程和某些語言類而抽象出的一種計算模型。有限狀态自動機擁有有限數量的狀态,每個狀态可以遷移到零個或多個狀态,輸入字串決定執行哪個狀态的遷移。有限狀态自動機可以表示為一個有向圖。有限狀态自動機是自動機理論的研究對象。

二、閑言碎語

        參加自考的童鞋應該對fsm不陌生,因為編譯原理中都學了。其實編譯器就是用了fsm來做詞法分析的。對于這一個初次接觸的人,就沒那麼容易了。fsm的概念在網上一搜可以搜一大堆出來,但估計相當一部分人也看不大明白。

        現實生活中,狀态是随處可見的,并且通過不同的狀态來做不同的事。比如冷了加衣服;餓了吃飯;困了睡覺等。這裡的冷了、餓了、困了是三種不同的狀态,并且根據這三個狀态的轉變驅動了不同行為的産生(加衣服、吃飯和睡覺)。

三、再看fsm是什麼

        所謂有限狀态機,就是由有限個狀态組成的機器。再看上面舉到的例子:人就是一部機器,能感覺三種狀态(冷、餓、困)。由于氣溫降低是以人會覺得冷;由于到了吃飯的時間是以覺得餓;由于晚上12點是以覺得困。狀态的産生以及改變都是由某種條件的成立而出現的。不考慮fsm的内部結構時,它就像是一個黑箱子,如下圖:

軟考——初識有限自動機

         左邊是輸入一系列條件,fsm通過判定,然後輸出結果。

四、fsm的處理流程

        上圖fsm屏蔽了判定的過程,事實上fsm是由有限多個狀态組成的,每個狀态相當于fsm的一個部件。比如要判斷一個整數是否偶數,其實隻需要判斷這個整數的最低位是否為0就行了,

對數字5來說,它的二進制表示為0101。二進制隻能為0或1,是以二進制的字元集合為:{0, 1},對應到fsm來說,就是有2種狀态,分别為s0和s1。如果用fsm來處理,它總是從左邊讀取(當然也可以把fsm反過來),也就是從0101最左邊那位開始輸入:首先輸入左邊第一位0,停留在s0狀态,然後輸入第二位1,轉到s1狀态,再輸入第三位0,則又回到s0狀态,最後輸入是後一位1則又回到s1狀态。如下圖所示:

軟考——初識有限自動機

        上圖忽略了一個很重要的細節,就是0和1是怎麼輸入的。狀态s0和狀态s1是fsm裡的2個小部件,它們分别關聯了0和1(也可以說是特定的輸入語句),是以隻能通過fsm來輸入。當fsm接收到0時,它就交給s0去處理,這時s0就變成目前狀态,然後對s0輸入1,s0則将它交給s1去處理,這時s1就變成目前狀态。如此這般,fsm持有有限多個狀态,它可以接收輸入并執行狀态轉移(比如将最初的0交給s0去處理)。狀态s0和狀态s1也是如此。

        但是為什麼最開始fsm接收輸入的0後會交給s0去處理呢?這是因為fsm的預設狀态是s0。就像是有一台電視機,它總是有預設的頻道的,您一打開電視機就可以看到影像,即使是滿屏的雪花點。而且可以在按下電視機的開關前預先調整頻道,之後也可以調整頻道。

五、再舉個例子

        文章開頭部分已經提及過,編譯器中的詞法分析就是能通過fsm完成的,那麼怎麼完成的?辨別符就是詞法分析的一項内容。c語言中對辨別符的規定為由“_”或以字母開頭的由“_”、字母和數字組成的字元串,該辨別符的定義可以表示為下圖中的内容:

軟考——初識有限自動機

        圖中上方的是正規表達式,式中的a代表字母符{a,…,z,a…,z},d代表數字字元{0,1,…,9}。圖中下方是對應的fsm。通過編譯器中的此自動機就能完成對詞法的分析。

       目前自己隻能了解表面上的這些内容,講得也比較粗淺,請拍磚,多多指導!

繼續閱讀