sunday演算法特徵碼 sunday 演算法

2021-10-13 13:25:46 字數 2630 閱讀 1837

sunday 演算法

編輯鎖定

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

中文名sunday 演算法

外文名sunday algorithm人    物

daniel m.sunday

時    間

2023年

類    屬

字串模式匹配

sunday 演算法演算法介紹

編輯sunday是乙個線性字串模式匹配演算法。演算法的概念如下:

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

記模式串為s,子串為t,長度分別為n,m。

對於t,我們做乙個簡單而巧妙的預處理:記錄t中每一種字元最後出現的位置,將其存入乙個陣列中。

假設在發生不匹配時s[i]≠t[j],1≤i≤n,1≤j≤m。設s此次第乙個匹配的字元位置為l。顯然,s[l+m+1]肯定要參加下一輪的匹配,並且t至少要與s[l+m+1]匹配才有可能與整個s匹配。

這時我們就尋找t中s[l+m+1]出現的位置了。利用我們預處理好的陣列,可以o(1)查詢出那個位置u,並將其直接移動至t[u]==s[l+m+1]。特殊地,若s[l+m+1]沒有在t**現,那麼t不可能會與s[l+m+1]匹配,則將t的第一位直接移動到s[l+m+2],繼續匹配。直至l+m>n時,匹配完畢。

sunday演算法思想跟bm演算法很相似,在匹配失敗時關注的是文字串中參加匹配的最末位字元的下一位字元。如果該字元沒有在匹配串**現則直接跳過,即移動步長= 匹配串長度+1;否則,同bm演算法一樣其移動步長=匹配串中最右端的該字元到末尾的距離+1。

sunday 演算法演算法舉例

編輯s:abcceabcaabcd

t:abcd

發現d與c不匹配。此時s[l+m+1]=='e',沒有出現在t中。於是:

s:abcceabcaabcd

t:--------abcd

發現d與a不匹配。此時s[l+m+1]=='a',t中最後出現在t[0]。於是:

s:abcceabcaabcd

t:--------------abcd

成功匹配。

sunday 演算法演算法實現

編輯遞迴**,求神犇輕虐

陣列黨:

int wei[301]=;

int ans=0,lend,lenc,tot=0;//tot用於統計匹配次數,便於直觀地與其他演算法比較

char c[10001],d[10001];

void pei()

int w=0;

while(w+lend<=lenc)

int i=0;

bool f=false;

while(i<=lend && f==false)

if(c[i+w]!=d[i])f=true;

i++;tot++;

if(f==false)

else

i=lend+1;

if(wei[c[i+w]]==-1)w=w+i+1;

else w=w+i-wei[c[w+i]];

return;

int main()

gets(c);

gets(d);

lenc=strlen(c)-1;

lend=strlen(d)-1;

for(int i=0;i<=300;++i)wei[i]=-1;

for(int i=0;i<=lend;++i)

wei[d[i]]=i;

pei();

if(ans)

cout<

else cout<

return 0;

stl黨:(也沒多大區別)

int wei[301]=;

int ans=0,lend,lenc,tot=0;

string c,d;

void pei()

int w=0;

while(w+lend<=lenc)

int i=0;

bool f=false;

while(i<=lend && f==false)

if(c[i+w]!=d[i])f=true;

i++;tot++;

if(f==false)

else

i=lend+1;

if(wei[c[i+w]]==-1)w=w+i+1;

else w=w+i-wei[c[w+i]];

return;

int main()

cin>>c;

cin>>d;

lenc=c.length()-1;

lend=d.length()-1;

for(int i=0;i<=300;++i)wei[i]=-1;

for(int i=0;i<=lend;++i)

wei[d[i]]=i;

pei();

if(ans)

cout<

else cout<

return 0;

Sunday演算法詳解

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

Sunday演算法詳解

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

Sunday演算法模板

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