算法——模拟匹配
目錄
- BM算法
- KMP算法
這是復習了數據結構后的筆記,因為之前模式匹配也看懂了好多次,但每次都過一段時間就忘了,想想總結一下可能會好點,理解得深點。
BM算法
設S是主串,T是模式(字串)。
BM算法是一種暴力的算法。
思想:S的第一位字符和T的第一位字符比較,若相等,則繼續比較兩者后續的字符。否者,從S的第二位字符開始和T的第一位字符開始比較。重復上述過程,若T的字符串全部比較完畢,則匹配成功,返回本趟匹配的開始位置;否則,匹配失敗,返回-1。
缺點:BM算法效率十分低下,當某趟匹配失敗后主串要回溯到該趟匹配開始位置的下一位,模式也要回溯到第一位。其實很多時候有一些匹配是沒有必要的。
比如:主串T= abcabcacb,模式S=abcac
當第一趟匹配匹配到第5個字符時,T[4] != S[4],第一趟匹配失敗。因為 T[1] != S[0],T[2] != S[0],所以用模式的第一位字符和主串的第二、三位匹配是沒必要;同時在主串S[4]這個位置匹配失敗后,可以通過模式T回溯到 T[1]位置開始匹配,即 S[4] 與 T[1] 匹配,這樣只需兩趟就匹配成功了(而BM算法需要四趟)。
主串不回溯的情況:
主串回溯(BM算法):
這種小規模數據可能影響并不大的,也只是做了兩趟沒必要的匹配。但是,當數據規模很大的時候,這沒必要的匹配可能就會是數萬次,甚至更多。
KMP算法
因此,我們希望某趟 S[i] 和 T[j] 匹配失敗后,下標 i 不回溯,小標j回溯到某個位置k使得 T[k] 對準 S[i] 繼續進行比較。那我們怎么知道 k 值呢?
k值主要從兩種匹配狀態聯立其關系式獲得:以下圖片和上述例子無關,獨立看
匹配失敗后回溯開始新一趟時:畫圈的就是代表式子部分
新一躺中部分匹配成功時:畫圈的就是代表式子部分
兩個式子聯立得:
T[0] ~ T[k-1] = T[j-k] ~ T[j-1]
可得模式里的得每一個字符 T[j] 代表 一個k值,這個k值僅依賴于模式,與主串無關。
用next[j] 表示 T[j] 對應的 k 值(0<= j <m),其定義如下:
求next得例子:
總結
- 上一篇: 侦查部队会用密电来聊天吗?
- 下一篇: 杭州武警士官学校是本科还是专科