編譯原理第二版3 4答案

2021-08-30 06:29:13 字數 3110 閱讀 6210

給出識別練習 3.3.2 中各個正規表示式所描述的語言狀態轉換圖。

解答解答步驟:nfa -> dfa -> 最少狀態的 dfa(狀態轉換圖)

最少狀態的 dfa(狀態轉換圖):

合併不可區分的狀態 b 和 d

c 最少狀態的 dfa(狀態轉換圖):

合併不可區分的狀態 a 和 c

給出識別練習 3.3.5 中各個正規表示式所描述語言的狀態轉換圖。

構造下列串的失效函式。

abababaab

aaaaaa

abbaabb 解答

**詳見:src/failure-function.js

[ 0, 0, 1, 2, 3, 4, 5, 1, 2 ]

[ 0, 1, 2, 3, 4, 5 ]

[ 0, 0, 0, 1, 1, 2, 3 ]

對 s 進行歸納,證明圖 3-19 的演算法正確地計算出了失效函式。

圖 3-19:計算關鍵字 b_1b_2…b_n 的失效函式

01  t = 0;

02 f(1) = 0;

03 for (s = 1; s < n; s ++)else

11 }

證明

已知 f(1) = 0

在第 1 次 for 迴圈時,計算 f(2) 的值,當第5行** b_2 == b_1 成立時,**進入到第7行得出 f(2) = 1,不成立時,則**進入第9行得出 f(2) = 0。顯然,這次迴圈正確的計算出了 f(2) 。

假設在第 i-1 次進入迴圈時,也正確的計算出了 f(i),也有 f(i) = t (無論 t 是大於 0 還是等於 0)

那麼在第 1 次進入迴圈時,分兩種情況進行考慮:

t == 0

這種情況比較簡單,直接從第 5 行開始,當 b_i+1 == b_1 時,f(i+1) = 1,否則 f(i+1) = 0

t > 0

while 迴圈會不斷縮小 t 值,試圖找出最大可能的使得 b_i+1 == b_t+1 成立的 t 值,如果找到了,則進入第 5 行執行,得到 f(i+1) = t+1;或者直到 t == 0 時也沒有找到,則跳出迴圈,這時進入第 5 行執行,過程類似於前一種情況。

說明圖 3-19 中的第 4 行的複製語句 t = f(t) 最多被執行 n 次。進而說明整個演算法的時間複雜度是 o(n),其中 n 是關鍵字長度。

解答詳見 matrix 的博文 kmp演算法詳解。

應用 kmp 演算法判斷關鍵字 ababaa 是否為下面字串的子串:

abababaab

abababbaa 解答

**詳見:src/failure-function.js

true

false

說明圖 3-20 中的演算法可以正確的表示輸入關鍵字是否為乙個給定字串的子串。

圖 3-20:kmp 演算法在 o(m + n) 的時間內檢測字串a_1a_3…a_n 中是否包含單個關鍵字 b1b2…bn

s = 0;

for(i = 1; i <= m; i ++)

return "no";

假設已經計算得到函式 f 且他的值儲存在乙個以 s 為下標的數字中,說明圖 3-20 中演算法的時間複雜度為 o(m + n)。

解答詳見 matrix 的博文 kmp演算法詳解。

fibonacci 字串的定義如下:

s1 = b

s2 = a

當 k > 2 時, sk = sk-1 sk-2

例如:s3 = ab, s4 = aba, s5 = abaab

sn 的長度是多少?

構造 s6 的失效函式。

構造 s7 的失效函式。

!! 說明任何 sn 的失效函式都可以被表示為:f(1) = f(2) = 0,且對於 2 < j <= |sn|, f(j) = j - |sk-1|,其中 k 是使得 |sk| <= j + 1 的最大整數。

!! 在 kmp 演算法中,當我們試圖確定關鍵字 sk 是否出現在字串 sk+1 中,最多會連續多少次呼叫失效函式? 解答

見 維基百科

s6 = abaababa

failure = [ 0, 0, 1, 1, 2, 3, 2, 3 ]

s7 = abaababaabaab

failure = [ 0, 0, 1, 1, 2, 3, 2, 3, 4, 5, 6, 4, 5 ]

編譯原理第二版4 3答案

下面是乙個只包含符號 a 和 b 的正規表示式文法。它使用 替代表示並運算的字元 以避免和文法中作為元符號使用的豎線相混淆 rexpr rexpr rterm rterm rterm rterm ctor ctor ctor ctor rprimary rprimary a b對這個文法提取左公因子...

opencv交叉編譯第二版

主機 ubuntu 12.04 32bit tar xvf arm 2009q3 gcc.tg.bz2 c 預設指定的跟檔案目錄 sudo gedit etc profile source etc profile 修改檔案 export path paht opt friendly toolscha...

編譯原理與技術(第二版)個人總結3

語法分析程式分為自頂向下和自底向上兩種。語法分析程式的基本目標如下 1.能夠清楚而準確地報告發現的錯誤,如錯誤的位置和性質。2.能夠迅速地從錯誤中恢復過來,以便繼續診斷後面可能存在的錯誤。3.錯誤處理功能不應該明顯地影響編譯程式對正確程式的處理效率。自頂向下分析方法是一種面向目標的分析方法,該方法從...