給出識別練習 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.錯誤處理功能不應該明顯地影響編譯程式對正確程式的處理效率。自頂向下分析方法是一種面向目標的分析方法,該方法從...