Rabin-Karp字符串匹配算法

Rabin-Karp字符串匹配算法是對每一個字符進行比較废境,把每個字符進行對應進制數(shù)并取模運算畜挨,然后比較每個字符的函數(shù)值。預處理時間是O(m)噩凹,匹配時間是O((n-m+1)m)。

Rabin-Karp算法的思想:

1 假設目標字符串長度為N毡咏,待匹配字符串的長度為M (M<=N)
2 首先計算待匹配字符串的hash值驮宴,然后計算目標字符串前M個字符的hash值
3 比較前面計算的2個hash值,比較次數(shù)N-M+1
? - 若hash值不相等呕缭,則繼續(xù)計算目標字符串的下一個長度為M的字符子串的hash值
? - 若hash值相同堵泽,則需要使用樸素算法再次判斷是否為相同的字符串修己。

這里有一段關于Rabin-Karp算法的分析:
Rabin-Karp算法相對于樸素字符串匹配算法比較快的原因有2點:
① Rabin-Karp算法是將字符串計算成了數(shù)值,數(shù)值的比較 相比于對字符串的包含的字符進行逐個比較(樸素字符串匹配算法)會更快迎罗。
② 樸素字符串匹配每一次都是2個字符串的重新匹配睬愤,之前的字符串的匹配結果不能應用到這次匹配中。而Rabin-Karp可以利用上次匹配的結果信息: 字符串生成的數(shù)值可以表示出字符的前后順序纹安,而且可以隨時去掉某個字符的值尤辱,可以隨時添加一個新字符的值。當一次匹配結束后厢岂,去掉源串第一個字符的的值光督,再加上這次比較來自于源串中要新加的字符串的值。

Rabin-Karp算法舉例:

比如我們要在源串 "9876543210520" 中查找 "520"塔粒,因為這些字符串中只有數(shù)字结借,所以我們可以使用字符集 {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'} 來表示字符串中的所有元素,并且將各個字符映射到數(shù)字 0~9卒茬,然后用 M 表示字符集中字符的總個數(shù)船老,這里是 10,那么我們就可以將搜索詞 "520" 轉化為下面的數(shù)值:

("5"的映射值 * M + "2"的映射值) * M + "0"的映射值 = (5 * 10 + 2) * 10 + 0 = 520

“搜索詞”計算好了圃酵,那么接下來計算“源串”柳畔,取“源串”的前 n 個字符(n 為“搜索詞”的長度)"987",按照同樣的方法計算其數(shù)值:

("9"的映射值 * M + "8"的映射值) * M + "7"的映射值 = (9 * 10 + 8) * 10 + 7 = 987

然后將該值與搜索詞的值進行比較即可辜昵。比較發(fā)現(xiàn) 520 與 987 不相等荸镊,則說明 "520" 與 "987" 不匹配,則繼續(xù)向下尋找堪置,這時候該如何做呢躬存?下一步應該比較 "520" 跟 "876" 了,那么我們如何利用前一步的信息呢舀锨?首先我們把 987 減去代表字符 "9" 的部分:

987 - ("9"的映射值 * (M 的 n - 1 次方)) = 987 - (9 * (10 的 2 次方)) = 987 - 900 = 87

然后再乘以 M(這里是 10)岭洲,再加上 "6" 的映射值,不就成了 876 了么:

87 * M + "6"的映射值 = 87 * 10 + 6 = 876<br/>

再進行比較坎匿。

參考文檔:
http://www.cnblogs.com/golove/p/3234673.html
https://github.com/gopher-learning/night-reading-go/blob/master/20180510/README.md
https://blog.csdn.net/chenhanzhun/article/details/39895077
https://github.com/gopher-learning/night-reading-go/blob/master/20180510/README.md

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末盾剩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子替蔬,更是在濱河造成了極大的恐慌告私,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件承桥,死亡現(xiàn)場離奇詭異驻粟,居然都是意外死亡,警方通過查閱死者的電腦和手機凶异,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門蜀撑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挤巡,“玉大人,你說我怎么就攤上這事酷麦】蟊埃” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵沃饶,是天一觀的道長母廷。 經(jīng)常有香客問我,道長绍坝,這世上最難降的妖魔是什么徘意? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮轩褐,結果婚禮上椎咧,老公的妹妹穿的比我還像新娘。我一直安慰自己把介,他們只是感情好勤讽,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拗踢,像睡著了一般脚牍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上巢墅,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天诸狭,我揣著相機與錄音,去河邊找鬼君纫。 笑死驯遇,一個胖子當著我的面吹牛,可吹牛的內容都是我干的蓄髓。 我是一名探鬼主播叉庐,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼会喝!你這毒婦竟也來了陡叠?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤肢执,失蹤者是張志新(化名)和其女友劉穎枉阵,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體预茄,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡岭妖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了反璃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昵慌。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖淮蜈,靈堂內的尸體忽然破棺而出斋攀,到底是詐尸還是另有隱情,我是刑警寧澤梧田,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布淳蔼,位于F島的核電站,受9級特大地震影響裁眯,放射性物質發(fā)生泄漏鹉梨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一穿稳、第九天 我趴在偏房一處隱蔽的房頂上張望存皂。 院中可真熱鬧,春花似錦逢艘、人聲如沸旦袋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疤孕。三九已至,卻和暖如春央拖,著一層夾襖步出監(jiān)牢的瞬間祭阀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工鲜戒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留专控,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓袍啡,卻偏偏與公主長得像踩官,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子境输,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容