算法——模拟匹配
目錄
- BM算法
- KMP算法
這是復(fù)習(xí)了數(shù)據(jù)結(jié)構(gòu)后的筆記,因?yàn)橹澳J狡ヅ湟部炊撕枚啻?#xff0c;但每次都過(guò)一段時(shí)間就忘了,想想總結(jié)一下可能會(huì)好點(diǎn),理解得深點(diǎn)。
BM算法
設(shè)S是主串,T是模式(字串)。
BM算法是一種暴力的算法。
思想:S的第一位字符和T的第一位字符比較,若相等,則繼續(xù)比較兩者后續(xù)的字符。否者,從S的第二位字符開(kāi)始和T的第一位字符開(kāi)始比較。重復(fù)上述過(guò)程,若T的字符串全部比較完畢,則匹配成功,返回本趟匹配的開(kāi)始位置;否則,匹配失敗,返回-1。
缺點(diǎn):BM算法效率十分低下,當(dāng)某趟匹配失敗后主串要回溯到該趟匹配開(kāi)始位置的下一位,模式也要回溯到第一位。其實(shí)很多時(shí)候有一些匹配是沒(méi)有必要的。
比如:主串T= abcabcacb,模式S=abcac
當(dāng)?shù)谝惶似ヅ淦ヅ涞降?個(gè)字符時(shí),T[4] != S[4],第一趟匹配失敗。因?yàn)?T[1] != S[0],T[2] != S[0],所以用模式的第一位字符和主串的第二、三位匹配是沒(méi)必要;同時(shí)在主串S[4]這個(gè)位置匹配失敗后,可以通過(guò)模式T回溯到 T[1]位置開(kāi)始匹配,即 S[4] 與 T[1] 匹配,這樣只需兩趟就匹配成功了(而B(niǎo)M算法需要四趟)。
主串不回溯的情況:
主串回溯(BM算法):
這種小規(guī)模數(shù)據(jù)可能影響并不大的,也只是做了兩趟沒(méi)必要的匹配。但是,當(dāng)數(shù)據(jù)規(guī)模很大的時(shí)候,這沒(méi)必要的匹配可能就會(huì)是數(shù)萬(wàn)次,甚至更多。
KMP算法
因此,我們希望某趟 S[i] 和 T[j] 匹配失敗后,下標(biāo) i 不回溯,小標(biāo)j回溯到某個(gè)位置k使得 T[k] 對(duì)準(zhǔn) S[i] 繼續(xù)進(jìn)行比較。那我們?cè)趺粗?k 值呢?
k值主要從兩種匹配狀態(tài)聯(lián)立其關(guān)系式獲得:以下圖片和上述例子無(wú)關(guān),獨(dú)立看
匹配失敗后回溯開(kāi)始新一趟時(shí):畫(huà)圈的就是代表式子部分
新一躺中部分匹配成功時(shí):畫(huà)圈的就是代表式子部分
兩個(gè)式子聯(lián)立得:
T[0] ~ T[k-1] = T[j-k] ~ T[j-1]
可得模式里的得每一個(gè)字符 T[j] 代表 一個(gè)k值,這個(gè)k值僅依賴(lài)于模式,與主串無(wú)關(guān)。
用next[j] 表示 T[j] 對(duì)應(yīng)的 k 值(0<= j <m),其定義如下:
求next得例子:
總結(jié)
- 上一篇: 侦查部队会用密电来聊天吗?
- 下一篇: java对象在内存中的布局