用人話講一講KMP是怎麼回事

KMP(看毛片)算法,是從一堆字符串裏查找相應字符串,該算法的核心是對要查找的字符串進行拆分,算出相應的結果數據,然後進行數據匹配的過程。

這個算法的精髓就是首先查出他的最大重複字符竄(重複部分的字符竄必須是從開頭部分算起,比如abcbc,他的最大重複項爲0,而abcac,最大距離間隔就是3)的距離間隔m,然後在查找的時候,查看該字符竄與目標字符竄命中部分的長度,如果命中部分的長度>m,則如果沒有命中,就移動m個位,如果命中部分<m,那麼就移動命中部分長度的間隔,但是這裏移動有一個下線條件那就是1

首先舉個例子:

從BBC ABCDAB ABCDABCDABDE字符串裏查找ABCDABD。

第一步,拆分ABCDABD,看看它裏面重複元素的距離間隔是多少,很明顯,他的重複元素距離間隔是【AB】CD【AB】D,第一個AB到下一個重複的AB間隔爲4

那麼現在KMP算法執行的流程是

第一次匹配時,我們發現能匹配上的數據爲0因此移動1次,因此從0開始

第二步:重複第一步,我們發現,仍然匹配不了,因此在移動一次,從0開始

第三步:重複第一步,我們發現,仍然匹配不了,因此在移動一次,從0開始

第四次匹配時,我們發現匹配命中爲6位,匹配命中的部分,重複值的間隔爲4,因此,我們可以直接移動4次,但是從2的位置,即C的位置開始比較

第五次匹配時,我們發現命中的部分爲2,但是重複值間隔爲0,因此接下來要移動2步。從

第六次匹配時,我們發現名部分爲6,然後重複值間隔爲4,因此,接下來我們需要移動4步

第七次匹配時,全部命中。

以上原理就是這麼簡單,但是如何用代碼實現呢,這裏就來了。

但是這裏面有一個問題,那就是解決重合部分的回溯問題,這個問題是啥意思呢,用上面的例子,第四步和第五步講解

第四步移動4得到第五步,但是在第五步,我們發現了一個問題,那就是第五部的開頭要搜索的字符竄AB,其實再第四步就比對過了,這時候按照道理,開始從開頭的AB後面的C比較就可以了。

如何讓它從C開始呢?

假設我們不考慮被尋找的字符竄是什麼,我們只關心要查找的字符竄,以ABCDABD爲例,所有可能移動的步數和結果如下:

從這個表裏我們可以發現,如果在ABCDABD字符串裏,頭五個字母編號,我們會發現,如果哪個不符合,就將A標點移動到不符合的位置,但到了第二個B那裏,情況變了,不是將A移動到第二個B處,而是第二個A處,而從上面可以總結一個規律,那就是如果用數組表示這7個字符,則會生成如下NEXT數組表:

NEXT數組生成

從這裏我們發現這個一個規律,就是字母代表的下標那一行的數字,等於是前面重複數據的個數,而按照這個規律推出來的就是所謂的NEXT數組的表示。

而下面的nextval只不過是三次重複數據出現後的下標表示法,是從next裏推出來的

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章