av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

詳解KMP算法以及python如何實(shí)現(xiàn)

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

算法思路

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

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

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

詳解KMP算法以及python如何實(shí)現(xiàn)

詳解KMP算法以及python如何實(shí)現(xiàn)

2.直到發(fā)現(xiàn)匹配字符,然后經(jīng)過一個(gè)內(nèi)循環(huán)嚴(yán)查字符串是否匹配

詳解KMP算法以及python如何實(shí)現(xiàn)

3.發(fā)現(xiàn)最后一個(gè)D不匹配,下面就該思考應(yīng)該把字符串向右移動(dòng)多少個(gè)位置呢?傳統(tǒng)做法可能是移動(dòng)一格,KMP算法就創(chuàng)新在這里。KMP算法通過查詢一個(gè)Partial Match Table(表內(nèi)存有字符串信息),然后計(jì)算出需要移動(dòng)的步數(shù),這個(gè)表后面會(huì)介紹怎么來的。

詳解KMP算法以及python如何實(shí)現(xiàn)

這里我們看到D前面是B,查表得到第二個(gè)B對(duì)應(yīng)的是2,所以 移動(dòng)數(shù) = 已匹配字符數(shù) - 查表所得數(shù) 也就是 6 - 2 = 4, 需要向右移動(dòng)四格。

詳解KMP算法以及python如何實(shí)現(xiàn)

下面也是重復(fù)這個(gè)步驟

詳解KMP算法以及python如何實(shí)現(xiàn)

直到發(fā)現(xiàn)匹配或者字符長(zhǎng)度超出(未發(fā)現(xiàn)匹配)。

Partial Match Table

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

詳解KMP算法以及python如何實(shí)現(xiàn)

- 'A'的前綴和后綴都為空集,共有元素的長(zhǎng)度為0;

- 'AB'的前綴為[A],后綴為[B],共有元素的長(zhǎng)度為0;

- 'ABC'的前綴為[A, AB],后綴為[BC, C],共有元素的長(zhǎng)度0;

- 'ABCD'的前綴為[A, AB, ABC],后綴為[BCD, CD, D],共有元素的長(zhǎng)度為0;

- 'ABCDA'的前綴為[A, AB, ABC, ABCD],后綴為[BCDA, CDA, DA, A],共有元素為'A',長(zhǎng)度為1;

- 'ABCDAB'的前綴為[A, AB, ABC, ABCD, ABCDA],后綴為[BCDAB, CDAB, DAB, AB, B],共有元素為'AB',長(zhǎng)度為2;

- 'ABCDABD'的前綴為[A, AB, ABC, ABCD, ABCDA, ABCDAB],后綴為[BCDABD, CDABD, DABD, ABD, BD, D],共有元素的長(zhǎng)度為0。

python實(shí)現(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個(gè) for i in range(n): if s[i + cur] != p[i]:cur += max(i - table[i - 1], 1) # 有了部分匹配表,我們不只是單純的1位1位往右移,可以一次移動(dòng)多位break else: return True # loop從 break 中退出時(shí),else 部分不執(zhí)行。 return Falseprint partial_table1('ABCDABD')print kmp_match('BBC ABCDAB ABCDABCDABDE', 'ABCDABD')

以上就是詳解KMP算法以及python如何實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于python實(shí)現(xiàn)KMP算法的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 亚洲一区精品视频 | 成人高清网站 | 亚洲精品电影网在线观看 | 成人视屏在线观看 | 日韩一区二区免费视频 | 高清欧美性猛交xxxx黑人猛交 | 在线播放国产一区二区三区 | 欧美日韩高清在线观看 | 久久噜噜噜精品国产亚洲综合 | 国产一级毛片精品完整视频版 | 最近中文字幕第一页 | 国产一区二区在线免费观看 | 亚洲第一成人影院 | 亚洲欧美一区二区三区在线 | 欧美中文在线 | 国产高清精品一区二区三区 | 久久久国产一区二区三区四区小说 | 国产91久久久久蜜臀青青天草二 | 四虎影院一区二区 | 亚洲免费大片 | 色在线免费视频 | 欧美日韩一二三区 | 中文字幕第九页 | 97超碰站 | 欧美精品乱码久久久久久按摩 | 日本精品视频一区二区 | 亚洲成人av一区二区 | 亚洲成人精品一区 | 超碰国产在线 | 2018天天干天天操 | 偷拍自拍网站 | 亚洲一区播放 | 麻豆精品一区二区三区在线观看 | 亚洲久久一区 | 午夜欧美 | 福利一区视频 | 夜夜骑首页 | 91电影在线播放 | 欧美精品一区二区三区在线四季 | 日本 欧美 国产 | 99精品一级欧美片免费播放 |