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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法——模拟匹配

發布時間:2024/9/27 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法——模拟匹配 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 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得例子:

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。