一種快速的字串匹配演算法

2021-04-20 03:32:57 字數 1064 閱讀 9486

/* 快速字串查詢函式:

目前比較流行的字串有kmp與bm演算法,實際上kmp演算法在使用的時候比strchr快不了多少,而bm演算法也

大約只有kmp演算法的3~5倍。這裡介紹乙個快速字串查詢函式。

舉乙個例子:

"hello, world"中查詢"word"子串,可以先把兩個字串按照首位元組對好:

hello, world

world

我們可以看出剛開始是不能匹配的,這樣需要將子串往後移,至於每次移動多少就成了各種演算法值得玩

味的地方了,當然,每次移動乙個字元是最簡單也最慢的演算法;kmp利用以前匹配的資訊進行移動,bm算

法利用反向查詢的策略來加快移動。

我們可以知道,如果可以匹配的話,當前匹配的後乙個字元","肯定需要判斷,先檢查","在子字串中

不存在,所以直接移動子字串的長度個位置,變成下面的模式:

hello, world

world

繼續看後面乙個字元"d"在子字串"world"中倒數第1個位置,將子字串的"d"與查詢字串的"d"對齊

(移動1位),可以發現:

hello, world

world

經過3次移動,便找到了查詢子字串,可以證明該方法平均移動的距離比bm演算法大,所以該演算法比bm算

法快。*/

char *qsearch(char *text, int n, char *patt, int m)

;char *p = patt;

char *temp_t, *t = text;

if (n < 0)

if (m < 0)

if (m == 0)

/* 構造移動表,假設字元都在0~127之間,即純ascii碼 */

for (i=0; i < 128; i++)

for (; *p; p++)

/* 開始移動查詢 */

while (t+m <= text+n)

}if (*p == 0) /* 找到了 */

t += tab_p[*(t+m)];

}return null;

}

字串查詢匹配演算法的一種Java實現

1 kmp演算法 kmp演算法是一種改進的 字串匹配 演算法,由d.e.knuth與v.r.pratt和j.h.morris同時發現,因此人們稱它為 克努特 莫里斯 普拉特操作 簡稱kmp演算法 kmp演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就...

KMP演算法 字串快速匹配

kmp演算法的實現 最近學習了資料結構中乙個重要的內容 字串.涉及到乙個重要也是難理解的演算法 kmp演算法,即字串快速匹配模式串的演算法.在這裡寫一下心得體會,以便後來者參考.在開始之前,還是先講一講樸素的字串匹配演算法 暴力搜尋.先講幾個基本概念 所謂暴力搜尋,就是從主串和模式串開頭字元開始,乙...

KMP演算法 字串的快速匹配

先了解一下字串匹配的樸素模式匹配 b f演算法 當模式串中x匹配到字串z時,比較不等,則模式串右移一位,此時指標也跟著回到模式串的初始位置 如下圖所示 這個指標的移動叫做回溯。為了消除這種回溯,提高執行效率,於是有了kmp演算法。kmp演算法 指標從模式串開頭移動,當匹配到z x時,尋找子串xzzx...