【重學(xué)數(shù)據(jù)結(jié)構(gòu)與算法(JS)】字符串匹配算法(四)——Sunday算法

前言

慣例届慈,最重要的匹配思路還是要貼一遍:

  1. 模式串主串進(jìn)行比較
    • 從前往后比較
    • 從后往前比較
  2. 匹配時润匙,比較主串模式串的下一個位置
  3. 失配時,
    • 模式串中尋找一個合適的位置
      • 如果找到琅关,從這個位置開始與主串當(dāng)前失配位置進(jìn)行比較
      • 如果未找到革骨,從模式串的頭部與主串失配位置的下一個位置進(jìn)行比較
    • 主串中找到一個合適的位置,重新與模式串進(jìn)行比較

Sunday算法也許是三種里面最好理解也最好寫的一種了屉符,它的思路也是在于失配時如何跳過盡可能多的字符剧浸,具體的說,主要是優(yōu)化了第3步矗钟,失配時唆香,在主串中找到一個合適的位置,重新與模式串進(jìn)行比較吨艇。

算法介紹與分析

  • 主串模式串的首位開始比較躬它,記
    • 主串 S
    • 模式串 P
    • 主串長度 slen
    • 模式串長度 plen
    • 主串位置指針 i
    • 模式串位置指針 j
    • 每次重新匹配時,模式串尾部對應(yīng)主串位置的下一位 m
  • 判斷 S[i]P[j] 是否相等
    • 如果相等
      • 判斷 jplen-1 是否相等东涡,如果相等則表示 表示模式串匹配完成冯吓,直接返回 i - j 即可
      • 如果不相等,則繼續(xù)比較下一位疮跑,即 i++;j++;
    • 如果不相等
      • 查看 S[m] 字符是否存在于 P 中组贺,如果存在,將 P 移至兩字符對應(yīng)的位置上
      • 如果不存在祖娘,則移至 S[m] 的后一位
  • 如果移動后失尖, m > slen ,說明 S 已經(jīng)遍歷一遍渐苏,仍然沒有找到目標(biāo)掀潮,模式串 匹配失敗。

栗子

初始狀態(tài)整以,i = 0, j = 0, m = 4

QQ20200123-205626.png

比較 S[0]P[0]胧辽,發(fā)現(xiàn)不相等峻仇,看 S[4] 處發(fā)現(xiàn)并沒有在 P 中出現(xiàn)

QQ20200123-205718.png

直接將 P 移至 S[4] 的后一位公黑,此時 i = 5, j = 0, m = 9

QQ20200123-205913.png

比較 S[5]P[0],發(fā)現(xiàn)不相等,看 S[9] 處發(fā)現(xiàn)有在 P 中出現(xiàn)

QQ20200123-210136.png

P 中的 iS 中的 i 對齊凡蚜,此時 i = 8, j = 0, m = 12

QQ20200123-210415.png

比較 S[8]P[0]人断,發(fā)現(xiàn)不相等,看 S[12] 處發(fā)現(xiàn)并沒有在 P 中出現(xiàn)

QQ20200123-210651.png

直接將 P 移至 S[12] 的后一位朝蜘,此時 i = 13, j = 0, m = 17

QQ20200123-210854.png

比較 S[13]P[0]恶迈,發(fā)現(xiàn)不相等,看 S[17] 處發(fā)現(xiàn)有在 P 中出現(xiàn)

QQ20200123-211050.png

P 中的 nS 中的 n 對齊谱醇,此時 i = 15, j = 0, m = 18

QQ20200123-211352.png

繼續(xù)匹配暇仲,直到 j === plen - 1 = 3,則匹配成功副渴,得到結(jié)果 i - j = 18 - 3 = 15

QQ20200123-211750.png

代碼實現(xiàn)

極端情況的排除

carbon.png

整體邏輯框架

  • 首先奈附,肯定有一個循環(huán),先找到終結(jié)條件煮剧,和 BF算法 一樣斥滤,查找順序也是從前往后,可以很快知道勉盅,i < slen 就是終結(jié)的條件
  • 其次佑颇,就是要對匹配和失配進(jìn)行不同的處理

由此,我們就可以寫出整體的框架:

carbon的副本.png

細(xì)節(jié)的完善

carbon的副本2.png

總結(jié)

Sunday算法 遵循匹配思路草娜,失配時采取自己的優(yōu)化策略挑胸,也盡可能的移動了最多的步數(shù),達(dá)到提高效率的目的驱还,且易理解嗜暴。

后記

“字符串匹配算法”是“重學(xué)數(shù)據(jù)結(jié)構(gòu)與算法”系列筆記:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市议蟆,隨后出現(xiàn)的幾起案子闷沥,更是在濱河造成了極大的恐慌,老刑警劉巖咐容,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舆逃,死亡現(xiàn)場離奇詭異,居然都是意外死亡戳粒,警方通過查閱死者的電腦和手機(jī)路狮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔚约,“玉大人奄妨,你說我怎么就攤上這事∑凰睿” “怎么了砸抛?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵评雌,是天一觀的道長。 經(jīng)常有香客問我直焙,道長景东,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任奔誓,我火速辦了婚禮斤吐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘厨喂。我一直安慰自己和措,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布蜕煌。 她就那樣靜靜地躺著臼婆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪幌绍。 梳的紋絲不亂的頭發(fā)上颁褂,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音傀广,去河邊找鬼颁独。 笑死,一個胖子當(dāng)著我的面吹牛伪冰,可吹牛的內(nèi)容都是我干的誓酒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贮聂,長吁一口氣:“原來是場噩夢啊……” “哼靠柑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吓懈,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤歼冰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后耻警,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隔嫡,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年甘穿,在試婚紗的時候發(fā)現(xiàn)自己被綠了腮恩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡温兼,死狀恐怖秸滴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情募判,我是刑警寧澤荡含,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布吝羞,位于F島的核電站,受9級特大地震影響内颗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜敦腔,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一均澳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧符衔,春花似錦找前、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至形帮,卻和暖如春槽惫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辩撑。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工界斜, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人合冀。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓各薇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親君躺。 傳聞我的和親對象是個殘疾皇子峭判,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355