兩個字串匹配,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演算法保證了時...