/* 快速字串查詢函式:
目前比較流行的字串有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...