kmp
演算法遇見很多次了,一沒有弄明白。
kmp
說起字串匹配,最直接的想法就是用兩次迴圈。時間複雜度大概是
o(m*n),
有沒有更高效的演算法和。
看下面的例子:
一般的匹配過程:
code:
* 暴力破解法
* @param ts 主串
* @param ps 模式串
* @return 如果找到,返回在主串中第乙個字元出現的下標,否則為-1
*/public static int bf(string ts, string ps) else
}if (j == p.length) else
}
但是這種匹配效率實在太低,大牛們是無法忍受這種低效的手段的。於是kmp演算法應運而生。利用已經部分匹配這個有效資訊,保持
i指標不回溯,通過修改
j指標,讓模式串盡量的移動到有效的位置。
這裡我們在暴力解法的基礎上進行改進,維護乙個陣列
int next, next[j] = k
,用來記錄當
t[i] != p[j]時,j
指標的下乙個位置。(可以先記下來)
這裡next [ ]陣列的獲得可以參考:1 (原創)詳解kmp演算法
2 演算法:kmp演算法解析
code:
public static int getnext(string ps) else
}return next;
}
最後的kmp演算法的**如下:
code:
public static int kmp(string ts, string ps) else
}if (j == p.length) else {
return -1;
KMP演算法詳解
模式匹配的kmp演算法詳解 這種由d.e.knuth,j.h.morris和v.r.pratt同時發現的改進的模式匹配演算法簡稱為kmp演算法。大概學過資訊學的都知道,是個比較難理解的演算法,今天特把它搞個徹徹底底明明白白。注意到這是乙個改進的演算法,所以有必要把原來的模式匹配演算法拿出來,其實理解...
KMP演算法詳解
kmp演算法即knuth morris pratt演算法,是模式匹配的一種改進演算法,因為是名字中三人同時發現的,所以稱為kmp演算法。因為偶然接觸到有關kmp的問題,所以上網查了一下next陣列和 nextval陣列的求法,卻沒有找到,只有在csdn的資料檔案裡找到了next陣列的簡單求法 根據書...
KMP演算法詳解
相信很多人 包括自己 初識kmp演算法的時候始終是丈二和尚摸不著頭腦,要麼完全不知所云,要麼看不懂書上的解釋,要麼自己覺得好像心裡了解kmp演算法的意思,卻說不出個究竟,所謂知其然不知其所以然是也。經過七八個小時地仔細研究,終於感覺自己能說出其所以然了,又覺得資料結構書上寫得過於簡潔,不易於初學者接...