KMP算法之部分匹配值計算

KMP算法我在網上搜了很多說明,但論簡潔易懂還屬阮一峯的那篇文章,強烈推薦大家看看


個人覺得唯一不足之處在於《部分匹配值》的計算方法描述有些不清楚,在此按自己的理解更詳細的詳解一下


取阮總文章中的例子進行說明,搜索詞及《部分匹配值》如下圖如示:



一開始我一直以爲單個字符進行計算,後來經過查詢資料發現我錯了,每個字符下面記錄的部分匹配值不是這單個字符的值,而是從開頭字符到此字符這個字符串的值,這樣說可能有點抽象,下面以上圖爲例詳細講解一下

爲了方便說明這裏把搜索詞記爲:P={ABCDABD}

  • 1,P[0]表示“A”,其完全前後綴都是空,所以其部分匹配值爲0
  • 2,P[1]表示“AB”,其完全前綴爲{空,A},完全後綴爲{B,空},前後綴中只有空相同,所以AB(即P[1])的匹配值爲0
  • 3,P[2]表示“ABC”,其完全前綴爲{空,A,AB},完全後綴爲{BC,B,空},前後綴中只有空相同,所以ABC(即P[2])的匹配值爲0
  • 4,P[3]表示“ABCD”其完全前綴爲{空,A,AB,ABC},完全後綴爲{BCD,CD,D,空},前後綴中只有空相同,所以ABCD(即P[3])的匹配值爲0
  • 5,P[4]表示“ABCDA”,其完全前綴爲{空,A,AB,ABC,ABCD},完全後綴爲{BCDA,CDA,DA,A,空},前後綴中都有{A}長度爲1,所以ABCDA(即P[4])的匹配值爲1
  • 6,P[5]表示“ABCDAB”其完全前綴爲{空,A,AB,ABC,ABCD,ABCDA},完全後綴爲{BCDAB,CDAB,DAB,AB,B,空},前後綴中都有{AB}長度爲2,所以ABCDAB(即P[5])的匹配值爲2
  • 7,P[6]表示“ABCDABD”其完全前綴爲{空,A,AB,ABC,ABCD,ABCDA,ABCDAB},完全後綴爲{BCDABD,CDABD,DABD,ABD,BD,D,空},前後綴中只有空相同,所以ABCDABD(即P[6])的匹配值爲0

說明:

  • P[i]表示能匹配的字符串,部分匹配值計算的是能匹配的字符串對應該的值,例如上面的P[5]表示的是如果匹配了字符串“ABCDAB”,則這個字符串對應的部分匹配值爲2,而不是第二個字符B的部分匹配值
  • 爲了方便操作,字符串的部分匹配值都對應到字符串的最後一個字符,這樣即方便記錄也方便查詢


另外,

"部分匹配值"就是"前綴"和"後綴"的最長的共有元素的長度,這個已經在阮總的文件中解釋,這裏再強調一點,其前後綴都是表示完全前後綴,即不包含自身的前綴或者後綴


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