python實現BM和KMP演算法

2022-03-22 15:17:54 字數 1747 閱讀 4262

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)

print

'text:

',text

print

'pattern:

',pattern

ifs 

>-1

:print

'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...