KMP的自我研究之路(一)

經過一天的醞釀思考,我嘗試去理解KMP算法的創造過程,最終得出了那麼一點皮毛,今天我就來記錄一下我的結果吧

首先,介紹KMP算法的詳細資料網絡上有很多,大家隨意google、wiki、百度應該都能找到了。

我這裏要講的不是KMP算法要怎麼實現,而是KMP算法的出現過程,這個過程是我自己原創的,不具有任何絕對的說法,重點只是在於幫助自己或者別人理解這個讓人難以理解的東西。

【注:有關以下術語的解釋看最後面的分割部分】

下面就是我的思考路徑:

首先我們隨便找兩個字符串,一個稱爲”主串“,另一個稱爲”匹配串“,我們的任務就是要在”主串“中找到一段與”匹配串“匹配的子字符串的位置,那麼最簡單的思路應該是下面這樣的:


用匹配串主串的0位置開始進行字符比較,一直比較到4位置的時候,發現4位置字符並不相等,這時候用匹配串從主串的1位置進行字符比較,同樣發現不相等,繼續用匹配串從主串的2位置進行比較······整個過程就是通過每次移動匹配串1個位置來重新與主串重新比較。

以上這樣一個比較過程就是最容易想到的,但是這樣的比較過程效率不高,我相信很多人都知道這樣效率不高,但是我們憑什麼說這樣的效率不高,除非我們給出一個理由出來是吧。下面我就說說我自己得出的理由:當我們發現主串和匹配串的某個字符不相等的時候,這裏有一個條件是成立的,就是主串和匹配串中,主串的“前部分串“和匹配串的”前串“必定匹配,上圖中的前部分串就是0~3位置:abab,然而我們發現按照上面這樣的比較過程,我們沒有利用這個條件,而是忽略它直接進行下一次比較。那麼問題來了(當然不是挖掘機到底哪家強?尷尬),主串的”前部分串“和匹配串的”前串“相等究竟有什麼用?下面我用匹配過程圖來說明:


整個匹配過程是通過移動匹配串來比較的。如圖,第1次匹配失敗的時候,移動後的匹配串需要滿足一個前提條件才能繼續同主串的4位置比較字符(這裏有人會想,我下一次匹配不是跟主串的4位置比較字符,而是主串的1位置啊。那你跟1位置比較字符的時候,到後面是不是同樣需要跟4位置比較字符),這個前提條件就是移動後匹配串的”前串“必須同主串的”前部分串“相等,只有相等了,我們纔有必要繼續比較4位置。所以,我們看的出第2次匹配這個過程是沒有必要的,因爲匹配串ababc中b前串爲”aba“,而這個”前串肯定不會跟主串4位置的”前部分串"···b”匹配,因爲這2個串的最後一個字符都不相等,用下圖表示爲:


所以,第2次匹配是沒必要進行的步驟,現在我們來看看第3次匹配,第3次匹配是匹配串ababc中a的“前串爲“ab",而這個前串恰好能夠跟主串4位置“前部分串”“···ab”匹配,用下圖表示爲:


第3次匹配滿足了前提條件,所以我們纔有必要進行主串4位置的比較。

到此爲止,我們思考路徑是這樣的:

匹配失敗時,我們發現該位置繼續匹配的前提條件:移動後匹配串的“前串”必須同主串的“前部分串”相等

從而發現中間有一些匹配過程是沒有必要的

如果我們能夠找到一段匹配“失配位置前部分串前串話,那麼我們就可省去中間這些不必要的匹配過程,直接用前串的下1個位置(下面我們稱爲下一匹配位置與主串失配位置比較。如果相等,那麼繼續比較;如果不相等,那麼同樣找到當前匹配串中失配位置下一匹配位置與主串”失配位置“比較······

到這裏,問題就轉化爲:

在匹配串中,找到失配位置下一匹配位置,使得下一匹配位置的“前串匹配失配位置前部分串,且這前串長度最大(下面我們稱爲最長前串),才能保證向右移動的距離不會過大,避免造成遺漏的情況。

這個問題的求解就跟主串沒有任何關係了,只跟匹配串自身有關,因爲我們是在匹配串中找“失配位置”的下一匹配位置

只要找出匹配串每個字符的下一匹配位置,那麼我們就解決了在匹配主串失配時該如何移動的問題,提高效率。


到這裏,我們的目標也就是找出匹配串中每個字符的下一匹配位置

【注:至此,先理解以上內容,再看我的下一篇文章:KMP的自我思考之路(二)】

以上所寫均是我個人的理解,有任何建議或者意見,歡迎大家跟我一起討論偷笑

====================割=========================

以上內容所涉及的我自己創造的”術語“:

主串:被搜索的串

匹配串:搜索的串

失配位置:主串與匹配串匹配過程字符不相等的位置,包括主串失配位置和匹配串失配位置

前部分串:失配位置前面的一部分串,這部分串與失配位置鄰接

前串:匹配串中從頭部到失配位置(不包括)爲止的子串

下一匹配位置:主串與匹配串發生失配時,匹配串中與主串失配位置進行下次比較的位置

==============================================

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