KMP演算法 python實現

2021-10-05 20:15:29 字數 2097 閱讀 6835

兩個字串匹配,kmp演算法時間複雜度o(m+n)。總體思想就是對於匹配子串,利用先驗知識盡可能的不重複匹配。

對於子串,計算出當前字元之前字串中相同字元的個數,這樣在子串和字串當前字元匹配不成功時,就可以直接跳轉到之前字串相同的位置的下乙個,減少了匹配的次數。

例如:abab,next陣列為[0,0,0,1],表示當前字元匹配不成功時,前面字串包含的相同子串的長度,最後乙個b,前面的子串為aba,包含相同子串為a,個數為2,需要跳轉到下標為1的位置,所以next值為1;

進一步優化next,解決aaaab這種特殊情況,原始next陣列為:[0, 0, 1, 2, 3],可以看到aaaa為連續相同字元,即使按照next陣列進行了跳轉,跳轉後的字元和當前字元是相同的,這是沒有意義的,為了解決這一 問題,就需要對next陣列進行優化,得到[0, 0, 0, 0, 3],當跳轉後的字元與當前字元相同時,就繼續進行跳轉,直到跳轉後的字元與當前字元不同,或者到字串最開始0位置。

構建好next陣列後,就可以將字串與子串進行匹配操作。字串從頭到尾遍歷,如果遍歷的當前字元與子串相同,就繼續,如果不同,則子串查詢next陣列,跳轉到next中的位置,繼續遍歷比較。

def

data_next

(str_data)

: tmp_data = str_data

i =1 j =

0 data_next =[0

]# 求字串中字首和字尾相同的個數

while i <

len(str_data)

:if str_data[i]

== tmp_data[j]

: i +=

1 j +=

1else

: j =

0if str_data[i]

== tmp_data[j]:1

)else:0

) i +=

1# next陣列整體右移一位,當前陣列表示字元不匹配是跳轉的字串下標

data_next =[0

]+ data_next[:-

1]print

("原始next陣列:"

+str

(data_next)

)# next陣列優化,當next陣列中的跳轉字元與當前字元相同時,需要繼續跳轉,知道跳轉後字元與當前字元不同為止或者調到最開始

for index in

range

(len

(data_next)):

index_str = str_data[index]

next_new = data_next[index]

while str_data[next_new]

== index_str and next_new !=0:

next_new = data_next[next_new]

data_next[index]

= next_new

print

("優化後next陣列:"

+str

(data_next)

)return data_next

defdata_match

(data_1, data_2, data_next)

: j =

0for i in data_1:

if j ==

len(data_2)-1

:return

true

elif i == data_2[j]

: j +=

1else

: j = data_next[j]

return

false

if __name__ ==

'__main__'

: ss =

'ababaaababaa'

ll =

'aaaab'

next

= data_next(ll)

print

(data_match(ss, ll,

next

))

KMP演算法(Python實現)

關於kmp演算法的原理等請參閱這篇文章 kmp演算法 c 實現 本篇文章只是對kmp用python進行了實現。1.時間複雜度分析 bf演算法的時間複雜度 在最壞的情況下,bf演算法要將目標串的每乙個字元同模式串進行比較一遍,假定目標串長度為m,模式串長度為n,總的時間複雜度為o m n 而對於kmp...

KMP演算法python實現

目錄 一 找出prefix table 二 kmp演算法實現 二 測試 三 結果 四 時間複雜度簡單匹配演算法的時間複雜度為o m n kmp匹配演算法時間複雜度為o m n 1 把要匹配的字串pattern拆成子串找出最大公共前字尾,原來的要匹配的字串列入為求最大公共前字尾的行列裡面。最大公共前字...

python實現演算法 kmp演算法python實現

kmp演算法python實現 kmp演算法 kmp演算法用於字串的模式匹配,也就是找到模式字串在目標字串的第一次出現的位置 比如abababc 那麼bab在其位置1處,bc在其位置5處 我們首先想到的最簡單的辦法就是蠻力的乙個字元乙個字元的匹配,但那樣的時間複雜度會是o m n kmp演算法保證了時...