亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

詳解KMP算法以及python如何實現

瀏覽:15日期:2022-07-10 17:12:52

算法思路

Knuth-Morris-Pratt(KMP)算法是解決字符串匹配問題的經典算法,下面通過一個例子來演示一下:

給定字符串'BBC ABCDAB ABCDABCDABDE',檢查里面是否包含另一個字符串'ABCDABD'。

1.從頭開始依次匹配字符,如果不匹配就跳到下一個字符

詳解KMP算法以及python如何實現

詳解KMP算法以及python如何實現

2.直到發現匹配字符,然后經過一個內循環嚴查字符串是否匹配

詳解KMP算法以及python如何實現

3.發現最后一個D不匹配,下面就該思考應該把字符串向右移動多少個位置呢?傳統做法可能是移動一格,KMP算法就創新在這里。KMP算法通過查詢一個Partial Match Table(表內存有字符串信息),然后計算出需要移動的步數,這個表后面會介紹怎么來的。

詳解KMP算法以及python如何實現

這里我們看到D前面是B,查表得到第二個B對應的是2,所以 移動數 = 已匹配字符數 - 查表所得數 也就是 6 - 2 = 4, 需要向右移動四格。

詳解KMP算法以及python如何實現

下面也是重復這個步驟

詳解KMP算法以及python如何實現

直到發現匹配或者字符長度超出(未發現匹配)。

Partial Match Table

那么這個查詢的表是怎么來的呢?仍然以'ABCDABD'為例

詳解KMP算法以及python如何實現

- '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實現

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 部分不執行。 return Falseprint partial_table1('ABCDABD')print kmp_match('BBC ABCDAB ABCDABCDABDE', 'ABCDABD')

以上就是詳解KMP算法以及python如何實現的詳細內容,更多關于python實現KMP算法的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 亚洲精品入口一区二区在线播放 | 一级毛片一级毛片a毛片欧美 | 91福利国产在线观看香蕉 | 国产精品视频久久久 | 亚洲国产精品久久日 | 一级片视频免费观看 | 黄色三级视频在线播放 | 亚洲国产精品毛片∧v卡在线 | 亚洲一区中文字幕 | 六度国产福利午夜视频黄瓜视频 | 成年美女黄网站色大片免费看 | 香蕉在线观看视频 | 黄色一级免费大片 | 亚洲视频在线观看免费 | 1000部未满岁18在线观看污 | 欧美日韩91 | aaa级大片| 欧美a级黄色大片 | 亚欧日韩毛片在线看免费网站 | 国产精品盗摄一区二区在线 | 久久伊人中文字幕 | 亚洲第一页综合 | 91嫩草视频在线观看 | 国产欧美成人xxx视频 | 欧美人成一本免费观看视频 | 国产成人精品实拍在线 | 亚洲综合伊人色一区 | 在线成年人网站 | 丁香婷婷激情五月 | 中文字幕亚洲另类天堂 | 欧美日韩一区二区三区四区在线观看 | 亚洲国产第一区二区三区 | 国产精品视频第一区二区三区 | 中文字幕啪啪 | 国产精品久久久久久久成人午夜 | 美国一级大黄一片免费网站 | 国产色司机在线视频免费观看 | 成 黄 色 激 情视频网站 | 精品国产欧美一区二区三区成人 | 日本不卡高清中文字幕免费 | 国内在线观看精品免费视频 |