一種比kmp和bm
更高效的匹配演算法(如果想看原英文介紹,看下面分割線後的**)
適用於:模式串較短的情況,最壞時間複雜性為o(n*m),不過一般沒這麼壞
sunday演算法其實思想跟bm演算法很相似,只不過sunday演算法是從前往後匹配,在匹配失敗時關注的是文字串中參加匹配的最末位字元的下一位字元。如果該字元沒有在匹配串中出現則直接跳過,即移動步長= 匹配串長度+ 1;否則,同bm演算法一樣其移動步長=匹配串中最右端的該字元到末尾的距離+1。
**如下:
sunday-字串匹配演算法
--一種優於
kmp的演算法
思想類似於bm
演算法,只不過是從左向右匹配
遇到不匹配的看大串中匹配範圍之外的右側第乙個字元在小串中的最右位置
另外:採用bm/kmp
的預處理的做法,事先計算好移動步長,等到遇到不匹配的值直接使用
#include
#include
using namespace std;
//乙個字元8位 最大256種
#define max_char_size 256
/*設定每個字元最右移動步長,儲存每個字元的移動步長
如果大串中匹配字元的右側乙個字元沒在子串中,大串移動步長=
整個串的距離
+1如果大串中匹配範圍內的右側乙個字元在子串中,大串移動距離=
子串長度
-這個字元在子串中的位置
int *setcharstep(char *substr)
int *charstep=new int[max_char_size];
int substrlen=strlen(substr);
for(int i=0;icharstep[i]=substrlen+1;
//從左向右掃瞄一遍 儲存子串中每個字元所需移動步長
for(int i=0;icharstep[(unsigned char)substr[i]]=substrlen-i;
return charstep;
演算法核心思想,從左向右匹配,遇到不匹配的看大串中匹配範圍之外的右側第乙個字元在小串中的最右位置
根據事先計算好的移動步長移動大串指標,直到匹配
int sundaysearch(char *mainstr,char *substr,int *charstep)
int mainstrlen=strlen(mainstr);
int substrlen=strlen(substr);
int main_i=0;
int sub_j=0;
while(main_i//儲存大串每次開始匹配的起始位置,便於移動指標
int tem=main_i;
while(sub_jif(mainstr[main_i] == substr[sub_j])
main_i++;
sub_j++;
continue;
else
void qs(char *x, int m, char *y, int n) }
關於字串模糊匹配
一種比kmp和bm 更高效的匹配演算法 如果想看原英文介紹,看下面分割線後的 適用於 模式串較短的情況,最壞時間複雜性為o n m 不過一般沒這麼壞 sunday演算法其實思想跟bm演算法很相似,只不過sunday演算法是從前往後匹配,在匹配失敗時關注的是文字串中參加匹配的最末位字元的下一位字元。如...
mysql模糊匹配
1,表示任意0個或多個字元。可匹配任意型別和長度的字元,有些情況下若是中文,請使用兩個百分號 表示。比如 select from user where u name like 三 將會把u name為 張三 張貓三 三腳貓 唐三藏 等等有 三 的記錄全找出來。另外,如果需要找出u name中既有 三...
jquery模糊匹配
jquery.chosen.js查詢時,chosen預設從第乙個字元搜尋,所以寫中間的字元搜尋時,是搜尋不出來的 若想實現中間字元的模糊查詢,下面的js中 search contains屬性為true即可 可以讓chosen搜尋選項的中間及末尾字元 no results text是搜尋不到內容時,顯...