一、bf演算法
bf演算法是普通的模式匹配演算法,其基本思想就是將目標串的第乙個字元與模式串的第乙個字元進行匹配。若相等,則繼續比較第二個字元;若不相等,則比較目標串的第二個字元和模式串的第乙個字元。依次比較下去,直到得出最後的匹配結果。
示例**:
static int bf(
const char *src,
const char *des)if(
(i - pos)
== len_d)
return pos;
}return -1;}
二、sunday演算法
sunday演算法是daniel m.sunday於2023年提出的一種比bm演算法搜尋速度更快的演算法。其核心思想是:在匹配過程中,模式串並不被要求一定要按從左向右進行比較還是從右向左進行比較,它在發現不匹配時,演算法能跳過盡可能多的字元以進行下一步的匹配,從而提高了匹配效率。
sunday演算法思想跟bm演算法很相似,在
匹配失敗時關注的是文字串中參加匹配的最末位字元的下一位字元。如果該字元沒有在匹配串中出現則直接跳過,即移動步長= 匹配串長度+1;否則,同bm演算法一樣,即移動步長=匹配串中最右端的該字元到末尾的距離+1。
例如我們要在"substring searching"查詢"search",剛開始時,把子串與文字左邊對齊: s
u bs t
r in g
s e a
r c
h i
n g
s e
a r
c h
結果在第二個字元處發現不匹配,於是要把子串往後移動。但是該移動多少呢?這就是各種演算法各顯神通的地方了,最簡單的做法是移動乙個字元位置;kmp是利用已經匹配部分的資訊來移動;bm演算法是做反向比較,並根據已經匹配的部分來確定移動量。這裡要介紹的方法是看緊跟在當前子串之後的那個字元(上圖中的'i')。
顯然,不管移動多少,這個字元是肯定要參加下一步的比較的,也就是說,如果下一步匹配到了,這個字元必須在子串內。所以,可以移動子串,使子串中的最右邊的這個字元與它對齊。現在子串'search'中並不存在'i',則說明可以直接跳過一大片,從'i'之後的那個字元開始作下一步的比較,如下圖: s
u bs t
r in g
s e a
r c
h i
n g
se a
r ch
比較的結果,第乙個字元就不匹配,再看子串後面的那個字元是'r',它在子串中出現在倒數第三位,於是把子串向前移動三位,使兩個'r'對齊,如下: s
u bs t
r in g
s e a
r c
h i
n g
s e a
r c
h
這次匹配成功了!回顧整個過程,我們只移動了兩次子串就找到了匹配位置。可以證明:用這個演算法,每一步的移動量都比bm演算法要大,所以肯定比bm演算法更快。
以上sunday演算法文字描述摘自 這裡。
**實現:
#include
#include
#include<
string
.h>
#include
#define letter_max_len 256
#define maxline 1024
static int sunday(
const char *src,
const char *des);if
(src =
=null
|| des =
=null
)return -1;
len_s = strlen(src)
;len_d = strlen(des)
;for
(i = 0; i < letter_max_len; i++)
alphabet[i]
= len_d;
for(i = 0; i < len_d; i++)
alphabet[des[i]
]= len_d - i - 1;
for(pos = 1; pos <
= len_s - len_d;)if
((i - pos + 1)
== len_d)
return pos;
else
pos +
= alphabet[src[pos + len_d - 1]
]+ 1;
}return -1; //無子串返回-1
}int main(
int argc, char *
*argv)
;int linesnum;
fp = fopen(argv[1]
,"r");
if(fp =
=null
)while
((fgets(line, maxline, fp))!
=null
)fclose(fp)
;fp =
null
;return 0;}
字串匹配演算法 字串匹配演算法總覽
字串匹配在文字處理裡非常重要,我們採用簡潔的python 把以下演算法一一實現並講解。樸素演算法 algorithm rabin karp 演算法 有限自動機演算法 finite automation knuth morris pratt 演算法 kmp algorithm boyer moore ...
字串匹配演算法
首先引用一下另一篇文章中對字串匹配的介紹 字串匹配指的是從文字中找出給定字串 稱為模式 的乙個或所有出現的位置。本文的演算法一律輸出全部的匹配位 置。模式串在 中用x m 來表示,文字用y n 來,而所有字串都構造自乙個有限集的字母表 其大小為 根 據先給出模式還是先給出文字,字串匹配分為兩類方法 ...
字串匹配演算法
平常操作文字的時候,經常需要操作對字串進行操作。而字串中最重要的一種操作就叫匹配,字串的匹配演算法很多,人們最熟悉的莫過於kmp演算法了。今天就來談一談一些字串匹配演算法。先來說說大名鼎鼎的kmp演算法,這個演算法出現在無數的資料結構與演算法書上面。它的策略很簡單 當模式串第k個字元不匹配主串中第s...