2020資料結構小學期(一) KMP匹配演算法

2022-06-20 14:51:09 字數 1174 閱讀 9677

1、  kmp模式匹配演算法

輸入:模式串,主串

功能要求:輸出模式串的next值表,輸出匹配結果

原始碼:

1

defmatchintg_kmp(t, p, prefix):

2 n, m =len(t), len(p)

3 j, i =0, 0

4while j < n and i 5if i == -1 or t[j] ==p[i]:

6 i, j = i + 1, j + 1

7else

:8 i =prefix[i]

9if i ==m:

10return j -i

11return -1

1213

14def

prefix_table(p):

15 i, k, m = 0, -1, len(p)

16 prefix = [-1] *m

17while i < m - 1:

18if k == -1 or p[i] ==p[k]:

19 i, k = i + 1, k + 1

20if p[i] ==p[k]:

21 prefix[i] =prefix[k]

22else

:23 prefix[i] =k

24else

:25 k =prefix[k]

26return

prefix

2728

29if

__name__ == '

__main__':

30#t = "ababcabcacbab"31#

p = "abcac"

32 t = input("

請輸入主串:")

33 p = input("

請輸入模式串:")

34 pnext =prefix_table(p)

35print("

模式串next表:

", pnext)

36print("

匹配結果:

", matchintg_kmp(t, p, pnext))

資料結構 KMP

今天下午實現了kmp演算法 這個演算法算是奇妙,本機器看了10遍左右才基本理解 演算法的核心就是求出next,再依次根據next跳轉,這樣就能線性地匹配出字串 這裡推薦一篇博文說得很好,深入淺出,只是在next陣列是從1開始的,而pattern是從0起始,這也算是前幾次學習的時候沒有理解的地方 今天...

資料結構 KMP演算法

求串的模式值next n 定義 1 next 0 1 意義 任何串的第乙個字元的模式值規定為 1。2 next j 1 意義 模式串t中下標為j的字元,如果與首字元相同,且 j的前面的 1 k個字元與開頭的 1 k個字元不等 或者相等但t k t j 1 k 如 t abcabcad 則next 6...

資料結構 KMP演算法

在我的理解,kmp演算法最核心的同時最難理解的是這個next 函式。但是,next 的值是挺好求的,難在哪呢?這個函式難在邏輯。理解起來很費勁,但真的很好用,並且這個函式的結果很好求。例如求模式串t ababaaa 的next j 的函式值 是這樣的,當j 0,next 0 1,對於任何子串,第乙個...