1.kmp演算法
**def
compute_prefix_function(p):m =
len(p)
pi =
[0] *m
k =0for
q in
range(
1, m):
while
k >
0 and
p[k]
!=p[q]:k =
pi[k -1
]ifp[k]
==p[q]:k =
k +1pi[q] =k
return
pidef
kmp_matcher(t, p):n =
len(t)m =
len(p)
pi =
compute_prefix_function(p)q =
0for
i in
range(n):
while
q >
0 and
p[q]
!=t[i]:q =
pi[q -1
]ifp[q]
==t[i]:q =
q +1if
q ==
m:returni -
m +1return-1
2.bm演算法例子
**def
boyermoorehorspool(pattern, text):m =
len(pattern)n =
len(text)
ifm
>
n: return-1
skip =
fork
inrange(
256for
k in
range(m -1
): skip[ord(pattern[k])] =m
-k -1
skip
=tuple(skip)k =
m -1while
k <
n:j =m
-1; i =k
while
j >=
0 and
text[i]
==pattern[j]:
j -=
1; i -=1
ifj ==-
1: returni +
1k +=skip[ord(text[k])]
return-1
if__name__=='
__main__':
text ="
this is the string to search in
"pattern ="
the"s =
boyermoorehorspool(pattern, text)
'text:
',text
'pattern:
',pattern
ifs
>-1
'pattern \"'+
pattern +'
\" found at position',s
ps:今天分別用這兩個演算法,查詢了69k文件的最後一行字串,kmp用了0.053個cpu時間,bm僅用了0.025個cpu時間。
其實我非常想看一下sunday演算法,據說是bm的改進,提公升不少效能。研究了一下演算法,是人性多了。但是現在網上沒有它的python實現,改天嘗試搞乙個出來。
模式匹配KMP和BM演算法
字串模式匹配的兩大經典演算法。概念 主串,又稱目標串 子串,又稱模式串 模式匹配就是在主串中匹配模式串。模式串的next陣列求法 next陣列下標從1開始 next j 值為模式串前j 1個字元最長相等前字尾長度 1 next 1 0 串本身不能作為前字尾 模式匹配失敗時,next陣列規定了模式串向...
字串匹配演算法之KMP演算法和BM演算法
本文主要介紹kmp演算法和bm演算法,它們分別是字首匹配和字尾匹配的經典演算法。所謂字首匹配是指 模式串和母串的比較從左到右,模式串的移動也是從左到右 所謂字尾匹配是指 模式串和母串的的比較從右到左,模式串的移動從左到右。看得出來字首匹配和字尾匹配的區別就僅僅在於比較的順序不同。下文分別從最簡單的字...
KMP演算法(Python實現)
關於kmp演算法的原理等請參閱這篇文章 kmp演算法 c 實現 本篇文章只是對kmp用python進行了實現。1.時間複雜度分析 bf演算法的時間複雜度 在最壞的情況下,bf演算法要將目標串的每乙個字元同模式串進行比較一遍,假定目標串長度為m,模式串長度為n,總的時間複雜度為o m n 而對於kmp...