国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - KMP算法精解及其Python版的代碼示例

KMP算法精解及其Python版的代碼示例

2020-08-24 10:25WhiteFish Python

KMP算法基本上被人們用作字符串的匹配操作,這里我們就來介紹KMP算法精解及其Python版的代碼示例,需要的朋友可以參考下

KMP算法是經典的字符串匹配算法,解決從字符串S,查找模式字符串M的問題。算法名稱來源于發明者Knuth,Morris,Pratt。
假定從字符串S中查找M,S的長度ls,M的長度lm,且(ls > lm)。

樸素的字符串查找方法
從字符串S的第一個字符開始與M進行比較,如果匹配失敗。從下一字符開始,重新比較。指導第 (ls - lm) 個字符。
這種方法容易想到并且容易理解,效率不高。
問題在于每次匹配失敗后,移動的步伐固定為 1,其實步子可以邁得再大一些。

KMP的字符串查找方法
假定在模式串的連續字串M[0, i] 且 i < lm,已經成功匹配字符串S。但是不巧第 i+1 個字符失敗了,怎么辦?移動一個字符,重頭再來?當然不好,那就是樸素路線了。我們能否從跌倒的地方繼續走呢?
既然字串M[0 - i]已經匹配成功,那就從這個子串上做文章。舉個栗子     

S序號 j j + 1  j + 2 j + 3 j + 4 j + 5  j+6 j + 7 。。。
S串 a b c a b c d e 。。。
M串 a b c a b d      

M序號

0 1 2 3 4 5      

此時匹配失敗在M串的第5個字符,前4個字符已經匹配成功。
如果從跌倒的地方出發,則需要存在M[0, 4]的子串M[0, k] == S[j+4-k , j+4]。
由于M[0, 4] == S[j ,  j+4] 則有 字串S[j+4-k, j+4] == M[4-k, 4]。綜上有M[0, k] == M[4-k, 4]
如果這樣的k不存在,那就老老實實的樸素了。
從上面的表格可以直觀的看出,下一次匹配只要把M串移動到 j + 3 位置,從 j+5 開始匹配就可以。很容易看出來 在已經匹配成功的字串M[0 , 4]中有最長的子串 (M[0 , 1] == M[3 , 4]),這個就是問題的關鍵。
因此KMP的核心部分就是計算模式串的各個子串的 k。

 

實例
首先我們來看一下字符串的樸素匹配.
可以想象成把文本串s固定住,模式串p從s最左邊開始對齊,如果對齊的部分完全一樣,則匹配成功,失敗則將模式串p整體往右移1位,繼續檢查對齊部分,如此反復.

?
1
2
3
4
5
6
7
#樸素匹配
def naive_match(s, p):
 m = len(s); n = len(p)
 for i in range(m-n+1):#起始指針i
  if s[i:i+n] == p:
   return True
 return False

關于kmp算法,講的最好的當屬阮一峰的<字符串匹配的KMP算法>.一路讀下來,豁然開朗.
其實就是,對模式串p進行預處理,得到前后綴的部分匹配表,使得我們可以借助已知信息,算出可以右移多少位.即 kmp = 樸素匹配 + 移動多位.
更多細節請看阮一峰的文章,這里就不展開了.
下面給出python的代碼實現.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#KMP
def kmp_match(s, p):
 m = len(s); n = len(p)
 cur = 0#起始指針cur
 table = partial_table(p)
 while cur<=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
 return False
 
#部分匹配表
def partial_table(p):
 '''''partial_table("ABCDABD") -> [0, 0, 0, 0, 1, 2, 0]'''
 prefix = set()
 postfix = set()
 ret = [0]
 for i in range(1,len(p)):
  prefix.add(p[:i])
  postfix = {p[j:i+1] for j in range(1,i+1)}
  ret.append(len((prefix&postfix or {''}).pop()))
 return ret
 
print naive_match("BBC ABCDAB ABCDABCDABDE", "ABCDABD")
print partial_table("ABCDABD")
print kmp_match("BBC ABCDAB ABCDABCDABDE", "ABCDABD")

 

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 一区二区三区在线免费播放 | 亚洲免费成人 | 一级黄色小视频 | 免费视频国产 | 国产97在线播放 | 亚洲视频天堂 | 国产综合av| 久色 | 福利片一区二区 | 视频在线一区二区 | 精品久久亚洲 | 另类国产ts人妖高潮系列视频 | 国产大学生一区 | 欧美福利视频 | 亚洲成av人影片在线观看 | 国产精品一区二区三区不卡 | 巴西性猛交xxxx免费看久久久 | 日韩午夜一级片 | 久久国产精品一区二区 | 色婷婷综合久久久中字幕精品久久 | 黑人精品 | 四虎中文字幕 | 91久久久久久久久久久久久 | 国产一级片 | 中文字幕一区二区三区日韩精品 | 久久综合九色综合网站 | 午夜视频在线观看网站 | 求av网站| 69久久久 | 国产日韩精品一区二区 | 亚洲自拍中文 | 日本在线视频免费观看 | 久久伊人精品网 | 欧美伦理一区二区三区 | 久久久久亚洲精品 | 日韩av在线中文字幕 | 少妇黄色一级片 | 亚洲精品国偷拍自产在线观看 | 日韩影院一区 | 亚洲精品综合 | 亚洲精品资源在线观看 |