日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

算法——模拟匹配

發(fā)布時(shí)間:2024/9/27 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法——模拟匹配 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 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é)

以上是生活随笔為你收集整理的算法——模拟匹配的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。