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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

字符串匹配--Sunday算法

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

前面一篇博客詳細介紹了KMP算法,KMP算法的代碼不算繁瑣,但是理解起來相對比較困難。

后來Daniel M.Sunday在1990年提出了Sunday算法,其思想是從前往后匹配,在匹配失敗時關注的不是失配位而是主串中參加匹配的最末位字符的下一位字符。

  • 如果該字符沒有在模式串中出現則在下一輪比較時直接跳過,即移動位置 = 模式串長度+ 1
  • 如果該字符在模式串中出現過,假設其出現在模式串中的最右位置為P[j], 那么移動位置 = m (模式串長度) - j 。
  • 舉個例子說明下Sunday算法
    1)第一輪比較,S[2]!=P[2],發生失配,那么就關注主串中參與匹配的最末位字符的下一位,也就是S[3] (圖中綠色塊),因為e不存在于模式串P中,那么就將模式串移動4位(pLen+1)

    因為移動不大于pLen位的時候,在匹配時都需要將S[3]與模式串某個字符進行匹配,肯定是無法匹配上的,畢竟S[3]不存在于模式串P中

    2)第二輪比較,同樣的,S[6]!=P[2]發生失配,關注的字符就是S[7] “b”,它存在于模式串P中,移動模式串使得S[7]與該字符在模式串中最右的位置匹配上,即移動2位

    3)第三輪就匹配上了

    Sunday的思想比較簡單,就直接上代碼了

    在Sunday算法中,我們關注主串中參與匹配的最末位字符的下一位(假設為X)是否存在于模式串中,根據其不同的結果移動的位數也不一樣, 想要算法效率高,那么我們就需要快速地得到某個字符X是否存在于模式串中,以及對應需要位移的長度。

    所以X是否存在于P不適合通過contains這樣的函數來判斷,因為其底層是通過逐步比較的方式,時間復雜度為O(m),效率很差,那么有什么更好的辦法呢?

    根據字符判斷其是否存在于一個字符串中(字符集合), 我們可以想到map,不過其效率也不是很好??紤]到字符都可以用ASCII碼來表示,那么我們就可以用一個數組來表示當X為不同字符時對應的位移長度

    /*** 計算位移數組*/public static int[] calShiftArray(String p, int pLen) {int maxNum = 128;//使用ASCII碼總個數作為位移數組的長度int[] shift = new int[maxNum];for (int i = 0; i < maxNum ; i++) {shift[i] = pLen + 1;}//對于模式串中存在的字符,其位移長度=模式串長度-其在模式串中出現的最右位置下標//因為shift計算的時候是i是從小到大,如果遇到兩個相同的字符,那么較右側的位移長度會覆蓋前面的for (int i = 0; i < pLen; i++) {shift[p.charAt(i)] = pLen - i;}return shift;} /*** sunday算法匹配* */public static int sundayAlogrithm( String s, String p) {int sLen = s.length();int pLen = p.length();int[] shift = calShiftArray(p, pLen);int i = 0;//表示與模式串第一位匹配的主串字符下標int j = 0;//表示模式串正在匹配的下標while (i <= sLen - pLen) {j = 0;while (Objects.equals(s.charAt(i+j), p.charAt(j))) {j++;if (j == pLen) {return i;}}//如果遇到P[j]!=S[i+j],說明發生失配,那么就移動模式串,移動長度=shift[x],x為關注的字符下標i = i + shift[s.charAt(i + pLen)];}return -1;}

    Sunday算法的時間復雜度

    從上面的分析來看,Sunday算法大大加速了失配時的位移速度,但是在最壞的情形下,其時間復雜度會變為O(m*n)
    假設主串是aaabaaabaaabaaab,模式串是aaaa,我們可以知道aaaa不是上述主串的子串;在使用Sunday算法進行匹配的時候, 大部分情形下,關注字符都是在模式串中存在的(模式串只有a一個字符), 也就是說在大部分情形下模式串都只能移動1位,效率一下子降低了

    那么最優的情形的,就是每次失配都可以移動 模式串長度+1 位,那么其時間復雜度就是O(n/m)

    簡單來說,Sunday最差情況的時間復雜度為O(m*n), 最優情況的時間復雜度為O(n/m)

    參考:

    從頭到尾徹底理解KMP(2014年8月22日版)擴展2:Sunday算法

    總結

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

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

    主站蜘蛛池模板: 人人涩 | 午夜av导航 | 欧美激情91 | 精品欧美一区二区三区久久久 | 国产性猛交xxxⅹ交酡全过程 | 婷婷深爱激情 | 亚洲视频在线一区二区 | 狠狠干一区二区 | 91视频a | 中文字幕第15页 | 在线观看欧美一区二区三区 | 中文字幕国内自拍 | www.黄色 | 日本亚洲免费 | 操的网站| 葵司av在线 | 久久久久国产精品无码免费看 | 国产八区 | 老牛影视少妇在线观看 | 国产淫片| 亚洲爽爆 | 日本aa大片 | 制服丝袜天堂网 | 午夜天堂av | 欧美大奶在线 | 九九色| youjizz.com日本 | 日本高清视频一区 | 久久网一区 | 天堂在线资源8 | 亚洲午夜视频在线 | 麻豆极品 | 色原网| 毛片毛片毛片毛片毛片毛片毛片 | exo妈妈mv在线播放高清免费 | 97碰碰碰| 激情四月 | 日韩精彩视频 | 国产午夜麻豆影院在线观看 | 精品在线视频观看 | 噜噜噜噜私人影院 | 欧色图 | 国产精品宾馆在线 | 波多野结衣在线观看一区二区三区 | 国产精品啊啊啊 | 欧美国产一级片 | 欧美日韩一区二区久久 | 欧美午夜精品一区二区 | 人人爽视频 | 综合色久 | 亚洲精品一区二区三区区别 | 狠狠爱综合 | 一级v片 | 精品国产无码在线 | 天天高潮夜夜爽 | 中文字幕在线观看播放 | 色综合久久久无码中文字幕波多 | 免费成人在线观看视频 | 亚洲成人av网址 | 国产精品久久中文字幕 | 国产精品免费在线 | av片在线观看免费 | 人人澡人人爱 | 日本人极品人妖高潮 | 五月天婷婷在线播放 | 色偷偷免费费视频在线 | 国产福利精品视频 | 在线免费看黄视频 | 久久亚洲AV成人无码国产人妖 | 免费无码不卡视频在线观看 | 欧美三级自拍 | 日本高清视频一区 | 台湾150部性三级 | 欧美激情一区 | 自拍亚洲综合 | 18精品爽国产白嫩精品 | 国产毛片视频 | 白丝美女喷水 | 久久高清精品 | 亚洲综合套图 | 狠狠躁18三区二区一区视频 | 日韩人妻一区二区三区蜜桃 | jjzz日本视频 | av免费看网址 | 国产嘿咻视频 | 91麻豆视频在线观看 | 无码人妻一区二区三区免费n鬼沢 | 小柔好湿好紧太爽了国产网址 | 青青超碰| 日韩一级在线 | 国产a级免费视频 | 一区二区视频在线播放 | 中文字幕一区二区三区日韩精品 | 亚洲激情视频小说 | 中文字幕在线视频不卡 | a天堂在线观看 | 少妇高潮a一级 | 免费av成人 | 苍井空张开腿实干12次 |