kmp演算法中next陣列的3種表示方式

2021-07-08 19:22:12 字數 603 閱讀 8339

這兩日看kmp演算法,看的腦袋大了,最關鍵發現next陣列表現形式不一,讓我頭疼,

現在終於搞明白了他們之間的關係,分析如下,i1

2345

67p[i]ab

abac

as[i]00

1230

1f(i)01

1234

1 s[i]是指,出現的不匹配的位置i,以前面的乙個位置i-1結尾的字尾匹配個數,計算時,要比較跳轉後的下乙個位置來和文字中的未匹配字元比較,這是演算法導論中的做法

f(i)是指,未匹配的文字下乙個要匹配的模式的下標,就是下乙個比較模式的哪個元素,它代表比如說,i=5時,前面的i=3,i=4是匹配的字尾,所以可以跳到這個位置,這是kmp原**和好多部落格中的做法

然後第三種:

對f(i)進行優化,比如i=3時,調到 i=1進行比較,而p[1]=p[3],下一步還是錯匹,所以直接把f(3)變為0,  這樣優化後的做法,f(i)變為如下形式: i

1234

567f(i)01

0004

0 再補充一點關於kmp演算法的複雜度分析的感想,真的是理解攤還分析的好例子,演算法導論中用聚合分析的方法來計算,基本就是瞄準模式的下標j來分析。

收工

KMP演算法中的next 陣列

kmp演算法最難懂的就是next陣列的求法。位置i01 2345 6789 1011 1213 1415 字首next i 00 0012 3123 4567 40子串a gcta gcag ctag ctg 申明一下 下面說的對稱不是中心對稱,而是中心字元塊對稱,比如不是abccba,而是abca...

KMP演算法 next陣列

通過上文完全可以對kmp演算法的原理有個清晰的了解,那麼下一步就是程式設計實現了,其中最重要的就是如何根據待匹配的模版字串求出對應每一位的最大相同前字尾的長度。我先給出我的 1 void makenext const char p,int next 214 next q k 15 16 現在我著重講...

KMP演算法 NEXT陣列

kmp和next陣列基本上是一起用的,有了next陣列,才有kmp演算法,講道理來說這兩個都是基於最大前字尾和,也就是說需要用到kmp的時候必須先把next陣列先求出來,next陣列就是由所匹配的word的每個子串的前字尾和最大匹配得到的,說實話next陣列的演算法給優化得已經很無解了,以至於至今我...