Sunday演算法詳解

2021-07-16 17:22:02 字數 1959 閱讀 7981

一:背景
sunday演算法是daniel m.sunday於2023年提出的字串模式匹配。其效率在匹配隨機的字串時比其他匹配演算法還要更快。sunday演算法的實現可比kmp,bm的實現容易太多。

二:分析
假設我們有如下字串:

a = "lessons tearned in software te";

b = "software";

sunday演算法的大致原理是:

先從左到右逐個字元比較,以我們的字串為例:

開始的時候,我們讓i = 0, 指向a的第乙個字元; j = 0 指向b的第乙個字元,分別為"l"和"s",不等;這個時候,sunday演算法要求,找到位於a字串中位於b字串後面的第乙個字元,即下圖中 m所指向的字元"t",在模式字串b中從後向前查詢是否存在"t",

可以看到下圖中k指向的字元與m指向的字元相等,

這時就將相等的字元對齊,讓j再次指向b字串的頭乙個字元,相應地,將i指向主串對應的字元n,

再次比較a[i]和b[j],不等,這時再次尋找主串中在模式串後面的那個字元,

我們看到,模式串的最後乙個字元與m指向的主串字元相等,因此再次移動子串,

這時,主串i對應的字元是s,j對應的子串字元也是s,i++, j++,

現在再次不等,m指向字元"d",

三:完整**
[cpp]view plain

copy

print?

#define _crt_secure_no_deprecate   

#define _crt_secure_cpp_overload_standard_names 1  

#include

#include

using

namespace

std;  

int_next[256];  

string dest;  

string pattern;  

/*因為i位置處的字元可能在pattern中多處出現(如下圖所示),而我們需要的是最右邊的位置,這樣就需要每次迴圈判斷了,非常麻煩,效能差。這裡有個小技巧,就是使用字元作為下標而不是位置數字作為下標。這樣只需要遍歷一遍即可,這貌似是空間換時間的做法,但如果是純8位字元也只需要256個空間大小,而且對於大模式,可能本身長度就超過了256,所以這樣做是值得的(這也是為什麼資料越大,bm/sunday演算法越高效的原因之一)。

*/void

getnext()  

intsundaysearch()  

}  return

-1;  

}  int

main()    

測試:

Sunday演算法詳解

一 背景 sunday演算法是daniel m.sunday於1990年提出的字串模式匹配。其效率在匹配隨機的字串時比其他匹配演算法還要更快。sunday演算法的實現可比kmp,bm的實現容易太多。二 分析假設我們有如下字串 a lessons tearned in software te b so...

sunday演算法特徵碼 sunday 演算法

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

Sunday演算法模板

sunday是乙個線性字串 模式匹配演算法。演算法的概念如下 sunday演算法是daniel m.sunday於1990年提出的一種字串 模式匹配演算法。其核心思想是 在匹配過程中,模式串並不被要求一定要按從左向右進行比較還是從右向左進行比較,它在發現不匹配時,演算法能跳過盡可能多的 字元以進行下...