字串匹配 Sunday演算法 C語言實現

2021-07-08 16:52:55 字數 1665 閱讀 3999

sunday演算法是daniel m.sunday於2023年提出的一種比bm演算法搜尋速度更快的演算法。其核心思想是:在匹配過程中,模式串並不被要求一定要按從左向右進行比較還是從右向左進行比較,它在發現不匹配時,演算法能跳過盡可能多的字元以進行下一步的匹配,從而提高了匹配效率(演算法思想很簡單)。在一定程度上比kmp演算法和bm演算法更優。但是該演算法最壞情況下的時間複雜度為o(m*n)。

sunday的演算法思想和horspool有些相似,但是。當出現不匹配的時候,卻不是去找匹配串中不匹配的字元在模式串的位置,而是直接找最右邊對齊的右一位的那個字元在模式串的位置。

舉個栗子:設字串為 this is a ****** example,搜尋詞為example如圖所示。

第一次匹配過程中,從搜尋詞的首字母開始從左往右匹配,字串中的「h」與 「e」發現不匹配,就查詢字串中右端對齊的字元的下一位,也就是「 」(空格),原則:如果該字元沒有在匹配串中出現則直接跳過,即移動步長= 匹配串長度+1;否則,同bm演算法一樣其移動步長=匹配串中最右端的該字元到末尾的距離+1。

發現字串與搜尋詞右端對齊的下一位字元即「 」(空格)並不在搜尋詞中出現過,就移動步長為8位,如圖所示。

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

typedef

int status;

#define maxsize 100

#define error 0

#define true 1

//初始化資料

status initdata(char **source,char **target)

//輸入字串

printf("請輸入字串,以#結束\n");

while((ch = getchar())!='#')

getchar(); //清除緩衝區回車鍵

i = 0; //重置

printf("請輸入搜尋詞,以#結束\n");

while((ch = getchar()) !='#')

}//找出temp在target的位置

int findindex(char *target,char temp)

for(i = strlen(target) -1;i>=0;i--)

}return -1; //未找到字元匹配位置

}//sunday演算法

status sunday(char *source,char *target)

while(i//迴圈條件

if(source[i] == target[j])

i++;j++;

}elseelse}}

printf("匹配失敗..");

return error;

}void main()

字串匹配 sunday演算法

原題 lintcode題目 字串查詢 又稱查詢子字串 是字串操作中乙個很有用的函式。你的任務是實現這個函式。對於乙個給定的 source 字串和乙個 target 字串,你應該在 source 字串中找出 target 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。字串匹配最常見的就是km...

字串匹配sunday演算法

在網上看到了一種比kmp和bm演算法還快字串匹配演算法,就看了一下,並且發現一些部落格上寫的 是錯誤的,於是我也寫了乙個,leetcode上測試通過。首先對sunday演算法進行一下講解 從別的地方複製過來的,講的確實不錯 好了,sunday演算法還真的很好理解,用下面的例子來說明吧 j k t h...

字串匹配 Sunday演算法

字串匹配演算法中最先學的演算法是暴力演算法,緊接著是kmp演算法,到現在依舊沒有理解next到底是怎麼求的 尋找到了一種新的演算法 sunday演算法,比kmp演算法更快 匹配時關注匹配主串中參與匹配的最後一位字元的下一位字元。參考 include includeusing namespace st...