sunday演算法研究 超越kmp的字串匹配

2021-05-09 15:04:52 字數 1079 閱讀 3735

第一次聽到sunday演算法,是大餅餅說的。在他**並茂的解釋中,我發現這個演算法果然是乙個又容易理解,效率又強過kmp和bm的演算法。

於是試著寫了乙個,果真是好東東,分享一下。

轉一些概念先:

sunday演算法是daniel m.sunday於2023年提出的一種比bm演算法搜尋速度更快的演算法。其核心思想是:在匹配過程中,模式串並不被要求一定要按從左向右進行比較還是從右向左進行比較,它在發現不匹配時,演算法能跳過盡可能多的字元以進行下一步的匹配,從而提高了匹配效率。

假設在發生不匹配時s[i]≠t[j],1≤i≤n,1≤j≤m。此時已經匹配的部分為u,並假設字串u的長度為l。如圖1。明顯的,s[l+i+1]肯定要參加下一輪的匹配,並且t[m]至少要移動到這個位置(即模式串t至少向右移動乙個字元的位置)。

1  sunday演算法不匹配的情況

分如下兩種情況:

(1) s[l+i+1]在模式串t中沒有出現。這個時候模式串t[0]移動到s[t+i+1]之後的字元的位置。如圖2。

2  sunday演算法移動的第1種情況

(2)s[l+i+1]在模式串中出現。這裡s[l+i+1]從模式串t的右側,即按t[m-1]、t[m-2]、…t[0]的次序查詢。如果發現s[l+i+1]和t中的某個字元相同,則記下這個位置,記為k,1≤k≤m,且t[k]=s[l+i+1]。此時,應該把模式串t向右移動m-k個字元的位置,即移動到t[k]和s[l+i+1]對齊的位置。如圖3。

3  sunday演算法移動的第2種情況

依次類推,如果完全匹配了,則匹配成功;否則,再進行下一輪的移動,直到主串s的最右端結束。該演算法最壞情況下的時間複雜度為o(n*m)。對於短模式串的匹配問題,該演算法執行速度較快。

上**:

KMP 演算法研究

定義 1 next 0 1 意義 任何串的第乙個字元的模式值規定為 1。2 next j 1 意義 模式串 t中下標為 j的字元,如果與首字元 相同,且 j的前面的 1 k個字元與開頭的 1 k個字元不等 或者相等但 t k t j 1 k 如 t abcabcad 則next 6 1 因t 3 t...

KMP演算法研究

本人愚笨,csdn上看了很多解法都不了解,而且很多解法都有些問題。自己看了書研究了乙個晚上才大概明白了這一原理。特此附上自己寫的解法和見解。kmp是對於字串匹配蠻力解法的乙個改進,原理就是在求出模式子串自己內部的重複模式,舉個簡單的例子,主串s ababaababcb 子串t ababc t 0 t...

sunday演算法特徵碼 sunday 演算法

sunday 演算法 編輯鎖定 sunday演算法是daniel m.sunday於1990年提出的字串模式匹配。其核心思想是 在匹配過程中,模式串發現不匹配時,演算法能跳過盡可能多的字元以進行下一步的匹配,從而提高了匹配效率。中文名sunday 演算法 外文名sunday algorithm人 物...