複製鏈接
請複製以下鏈接發送給好友

kmp算法

鎖定
KMP算法是一種改進的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人們稱它為克努特—莫里斯—普拉特操作(簡稱KMP算法)。KMP算法的核心是利用匹配失敗後的信息,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是通過一個next()函數實現,函數本身包含了模式串的局部匹配信息。KMP算法的時間複雜度O(m+n) [1] 
中文名
KMP算法 [1] 
外文名
The Knuth-Morris-Pratt Algorithm [1] 
算法基礎
Brute-Force [2] 
應    用
字符串匹配 [1] 
發現者
D.E.Knuth等 [1] 
時間複雜度
O(m+n) [1] 

kmp算法簡介

KMP算法是三位學者在 Brute-Force算法的基礎上同時提出的模式匹配的改進算法。Brute- Force算法在模式串中有多個字符和主串中的若干個連續字符比較都相等,但最後一個字符比較不相等時,主串的比較位置需要回退。KMP算法在上述情況下,主串位置不需要回退,從而可以大大提高效率 [2] 

kmp算法字符串的模式匹配

字符串的模式匹配是一種常用的運算。所謂模式匹配,可以簡單地理解為在目標(字符串)中尋找一個給定的模式(也是字符串),返回目標和模式匹配的第一個子串的首字符位置。通常目標串比較大,而模式串則比較短小 [3] 

kmp算法模式匹配的類型

(1)精確匹配
如果在目標T中至少一處存在模式P,則稱匹配成功,否則即使目標與模式只有一個字符不同也不能稱為匹配成功,即匹配失敗。給定一個字符或符號組成的字符串目標對象T和一個字符串模式P,模式匹配的目的是在目標T中搜索與模式P完全相同的子串,返回T和P匹配的第一個字符串的首字母位置 [3] 
(2)近似匹配
如果模式P與目標T(或其子串)存在某種程度的相似,則認為匹配成功。常用的衡量字符串相似度的方法是根據一個串轉換成另一個串所需的基本操作數目來確定。基本操作由字符串的插入、刪除和替換來組成 [3] 

kmp算法KMP模式匹配算法

KMP算法是一種改進的字符串匹配算法,其關鍵是利用匹配失敗後的信息,儘量減少模式串與主串的匹配次數以達到快速匹配的目的明 [4] 
求得模式的特徵向量之後,基於特徵分析的快速模式匹配算法(KMP模式匹配算法)與樸素匹配算法類似,只是在每次匹配過程中發生某次失配時,不再單純地把模式後移一位,而是根據當前字符的特徵數來決定模式右移的位數 [3] 
#include "string. h"
#include<assert. h>
int KMPStrMatching(String T, String P, int. N, int startIndex)

{int lastIndex=T.strlen() -P.strlen();

if((1 astIndex- startIndex)<0)//若 startIndex過大,則無法匹配成功

return (-1);//指向P內部字符的遊標

int i;//指向T內部字符的遊標

int j=0;//指向P內部字符的遊標
for(i= startIndex; i <T.strlen(); i++)

{while(P[j]!=T[i]&& j>0)

j=N[j-1];
if(P[j]==T[i])

j++;

if(j ==P.strlen())

return(1-j+1);//匹配成功,返回該T子串的開始位置
}

return (-1);
}

kmp算法改進的KMP算法

復旦大學朱洪教授對KMP串匹配算法進行了改進,他主要是修改了next函數,在求 next[j]時,不但要求P[i]=P[j-( next[j]-i)](i=1,2,…, next [j]-1)成立,而且要求P[next[j]]!=p[j]。我們把修改後的next函數計作 Newnext。則計算函數 Newnext值的算法如下 [5] 
圖示 圖示 [5]
參考資料
  • 1.    電子世界 ,2017年,第20期,196頁
  • 2.    朱戰立編著,數據結構,西安電子科技大學出版社,2003.05,第92頁
  • 3.    呂浩音,數據結構與算法研究,電子科技大學出版社,2016.04,第58-62頁
  • 4.    杭州電子科技大學學報 自然科學版,2018年,第四期,49頁
  • 5.    劉任任主編,算法設計與分析,武漢理工大學出版社,2003.12,第97頁