詳解KMP算法以及python如何實現(xiàn)
算法思路
Knuth-Morris-Pratt(KMP)算法是解決字符串匹配問題的經(jīng)典算法,下面通過一個例子來演示一下:
給定字符串'BBC ABCDAB ABCDABCDABDE',檢查里面是否包含另一個字符串'ABCDABD'。
1.從頭開始依次匹配字符,如果不匹配就跳到下一個字符
2.直到發(fā)現(xiàn)匹配字符,然后經(jīng)過一個內(nèi)循環(huán)嚴查字符串是否匹配
3.發(fā)現(xiàn)最后一個D不匹配,下面就該思考應該把字符串向右移動多少個位置呢?傳統(tǒng)做法可能是移動一格,KMP算法就創(chuàng)新在這里。KMP算法通過查詢一個Partial Match Table(表內(nèi)存有字符串信息),然后計算出需要移動的步數(shù),這個表后面會介紹怎么來的。
這里我們看到D前面是B,查表得到第二個B對應的是2,所以 移動數(shù) = 已匹配字符數(shù) - 查表所得數(shù) 也就是 6 - 2 = 4, 需要向右移動四格。
下面也是重復這個步驟
直到發(fā)現(xiàn)匹配或者字符長度超出(未發(fā)現(xiàn)匹配)。
Partial Match Table
那么這個查詢的表是怎么來的呢?仍然以'ABCDABD'為例
- 'A'的前綴和后綴都為空集,共有元素的長度為0;
- 'AB'的前綴為[A],后綴為[B],共有元素的長度為0;
- 'ABC'的前綴為[A, AB],后綴為[BC, C],共有元素的長度0;
- 'ABCD'的前綴為[A, AB, ABC],后綴為[BCD, CD, D],共有元素的長度為0;
- 'ABCDA'的前綴為[A, AB, ABC, ABCD],后綴為[BCDA, CDA, DA, A],共有元素為'A',長度為1;
- 'ABCDAB'的前綴為[A, AB, ABC, ABCD, ABCDA],后綴為[BCDAB, CDAB, DAB, AB, B],共有元素為'AB',長度為2;
- 'ABCDABD'的前綴為[A, AB, ABC, ABCD, ABCDA, ABCDAB],后綴為[BCDABD, CDABD, DABD, ABD, BD, D],共有元素的長度為0。
python實現(xiàn)
def partial_table(p): ’’’’’partial_table('ABCDABD') -> [0, 0, 0, 0, 1, 2, 0]’’’ prefix = set() res = [0] for i in range(1, len(p)): prefix.add(p[:i]) postfix = {p[j:i + 1] for j in range(1, i + 1)} #print(p[:i+1],prefix,postfix,prefix & postfix or {’’}) res.append(len((prefix & postfix or {’’}).pop())) return resdef kmp_match(s, p): m = len(s); n = len(p) cur = 0 # 起始指針cur table = partial_table(p) while cur <= m - n: #只去匹配前m-n個 for i in range(n): if s[i + cur] != p[i]:cur += max(i - table[i - 1], 1) # 有了部分匹配表,我們不只是單純的1位1位往右移,可以一次移動多位break else: return True # loop從 break 中退出時,else 部分不執(zhí)行。 return Falseprint partial_table1('ABCDABD')print kmp_match('BBC ABCDAB ABCDABCDABDE', 'ABCDABD')
以上就是詳解KMP算法以及python如何實現(xiàn)的詳細內(nèi)容,更多關(guān)于python實現(xiàn)KMP算法的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. PHP函數(shù)原理理解詳談2. ASP中常用的22個FSO文件操作函數(shù)整理3. Vue+elementUI下拉框自定義顏色選擇器方式4. React+umi+typeScript創(chuàng)建項目的過程5. SharePoint Server 2019新特性介紹6. php網(wǎng)絡(luò)安全中命令執(zhí)行漏洞的產(chǎn)生及本質(zhì)探究7. JSP數(shù)據(jù)交互實現(xiàn)過程解析8. ASP的Global.asa文件技巧用法9. ASP中if語句、select 、while循環(huán)的使用方法10. html清除浮動的6種方法示例
