1. 程式人生 > 其它 >【資料結構】KMP演算法

【資料結構】KMP演算法

從暴力匹配到快速匹配(KMP演算法)

學習kmp演算法前,首先要先了解什麼是kmp演算法,kmp演算法具體優點是什麼,kmp的主要應用方向在哪。
然後才是,程式碼實現

帶著以上問題,我們來一步一步學習kmp演算法。
問題: 給一串字元,讓你從中找出與模式串相同的一段子串

例如:給這麼一段字元
(主串:ABBABBABABAAABABAAA)
(模式串:ABAABABAA)
要求從主串中找出與模式串相同的一段子串

那麼,一般方法,就是暴力匹配

暴力匹配(BF演算法)

直接給圖

很直觀,也是多數人直接想到的方法,就是模式串中每一個字元和主串一一進行比較,如果出現不同的,模式串後移一位,重複上述操作,一直找到與模式串相同的一段子串,這種方法稱為暴力匹配。
優點:方法簡單,暴力。
缺點:平均時間複雜度O ( n * m )

思考:能否利用已部分匹配過的資訊而加快模式串的滑動速度?
答案:KMP演算法

快速匹配(KMP演算法)

還是先給圖

從上圖中,箭頭指向失配元素,小方框內是最大字首和最大字尾,大方框中是要已經匹配的字串,我們就是從這串字元做文章的
(重點!!已匹配的字串 下文就此展開)
然後將最大字首移動到最大字尾的位置,就完成了一次最優”滑動

那麼什麼是最大字首和最大字尾呢?

最大字首&最大字尾(如果瞭解,可跳過)


給圖!
紅色下劃線:最大字首
黑色下劃線:最大字尾


滑動大小取決於模式串

當模式串出現失配,以此處向前從已匹配的字串中找最大字首和最大字尾,因為前面字元和主串字元一致,而滑動是將最大字首移動到最大字尾的位置上最大字首和最大字尾是從子串中找,
既然如此,

當模式串第m個字元失配,那麼就從模式串串1---m中找最大字首和最大字尾,將最大字首移動到最大字尾的位置上
以上(從那麼開始)操作,和主串無關,既

給圖

KMP演算法程式碼實現

由以上的理解,你大概知道了kmp演算法的基本原理。那麼,如何實現呢?
給程式碼前,瞭解一下“next[]”陣列


next[]陣列(如已瞭解,可跳過)