Sedgewick的演算法4中的KMP演算法有不少細節我看不懂,請大家幫我下?

時間 2021-06-01 19:05:31

1樓:Ben Shi

書中這個地方確實講解的有點不清楚

1.匹配的情況下狀態值是j+1,這個很容易理解,那麼需要搞清楚的就是不匹配的情況怎麼辦。

2.不匹配只能從第二個字元(pat.charAt(1))開始重新進行匹配嘗試,因為當前就是從第乙個字元開始匹配失敗的,所以作者說「忽略首字母是因為模式需要右移一位」。

3.作者說「忽略最後乙個字元是因為匹配失敗」,這個地方解釋的太含糊,重新匹配整個動作都是因為匹配失敗,忽略最後乙個字元其實是因為最後乙個字元根本不需要去匹配,最後乙個字元是新的狀態遷移的輸入,以書上ABABAC為例,如果最後乙個字母匹配失敗,則用BABA去匹配,實際匹配到ABA,狀態遷移到3,最後乙個字元觸發新的遷移是什麼,dfa[3]已經告訴我們了,3就是所謂的重啟狀態。

4.接下來就是這個重啟狀態3怎麼得到的問題了,舉得的例子是用指標移動的方法二次匹配出來的,這樣也可以,但麻煩了一點,後面的公式 X = dfa[pat.charAt(j)][X];是採用遞推思路得到的簡便方法。

這個公式我在豆瓣解釋了(https://

)j=0時沒有重啟狀態,從j=1是開始,顯然無論pattern是什麼,這時的重啟狀態x都應該是0,有這個初值遞推就可以開始了。如果前乙個的重啟狀態是x,那麼下乙個重啟狀態是什麼呢?下乙個重啟狀態不就是前乙個重啟狀態在當前字元輸入後的遷移狀態嘛,dfa表就是用來查這個的啊,用當前的輸入字元查dfa表,就是dfa[pattern[j][x];

關於ACM中的程式設計演算法問題 ?

int rampNum int a,int n int s 0 a 0 0 for int i 1 i n i for int j a i 1 j bhuztez的思路,寫出了c 版本的,這裡假設陣列中下標為1的元素為最高位以方便處理,combinationNum為計算組合數的函式。 inspire...

Linux Kernel 4 9 中的 BBR 演算法與之前的 TCP 擁塞控制相比有什麼優勢?

蘇維 bbr的擁堵控制對丟包不敏感,遇到丟包並不進入傳統的控制環節,並且總是傾向於把傳送視窗提高到物理環境允許的上限。而傳統的擁堵控制在遇到丟包時會把視窗縮減到1,或者一半,在少量均勻丟包環境 比如國際流量 流速會比bbr慢得多,因為傳送視窗幾乎總是在乙個很低的水平。隨著丟包率上公升,或者存在大量並...

申請美國研究生的4分制GPA演算法?

高小柴 學校正常打成績單就行,一般申請時候把成績單交給第三方機構,出具美國4.0gpa,推薦使用 WES iGPA Calculator 斯塔橙 瀉藥。美國大學一般採用四分制GPA。國內大學普遍採用四分制,但也有部分採用五分制。即便四分制,成績具體換算標準也各有不同,比方說有的大學可能是是80以上3...