크누스-모리스-프랫 알고리즘
Knuth–Morris–Pratt algorithm학급 | 문자열 검색 |
---|---|
data 구조 | 스트링 |
최악의 경우 성능 | ( m ) { \( m ) + ( \( n )매칭[note 1] |
최악의 경우 공간의 복잡성 |
컴퓨터 과학에서 Knuth-Morris-Pratt 문자열 검색 알고리즘(또는 KMP 알고리즘)은 "단어"의 발생을 검색합니다.W
주요 "텍스트 문자열" 내에서S
미스매치가 발생했을 때 단어 자체가 다음 일치가 어디서 시작될 수 있는지를 판단하기에 충분한 정보를 구현한다는 관찰을 채택함으로써 이전에 일치한 문자의 재검사를 생략할 수 있다.
이 알고리즘은 James H. Morris에 의해 고안되었고 Donald Knuth에 의해 오토마타 [1][2]이론에서 독립적으로 발견되었다.Morris와 Vaughan Pratt는 [3]1970년에 기술 보고서를 발표했습니다.이들 3사는 [1]1977년 이 알고리즘을 공동 발표했다.1969년 마티야세비치는[4][5] 2진수 알파벳에 대한 문자열 패턴 일치 인식 문제를 연구하던 중 2차원 튜링 기계에 의해 코드화된 유사한 알고리즘을 발견했다.이것은 문자열 [6]매칭을 위한 최초의 선형 시간 알고리즘입니다.
배경
문자열 일치 알고리즘이 시작 인덱스를 찾으려고 합니다.m
줄을 서서S[]
검색어와 일치하는W[]
.
"Brute-force" 또는 "Naive" 알고리즘으로 알려진 가장 간단한 알고리즘은 각 색인에서 일치하는 단어를 찾는 것입니다.m
, 즉, 검색되는 문자열 내의 문자에 대응하는 위치S[m]
각 위치에서m
알고리즘은 먼저 검색되는 워드에서 첫 번째 문자의 동일성을 확인합니다.S[m] =? W[0]
일치하는 것이 발견되면 알고리즘은 단어 위치 인덱스의 연속된 값을 체크하여 검색 대상 단어 내의 다른 문자를 테스트합니다.i
알고리즘은 문자를 가져옵니다.W[i]
검색되고 있는 단어에서 표현의 동일성을 체크한다.S[m+i] =? W[i]
연속되는 모든 문자가 일치하는 경우W
위치에m
그러면 검색 문자열의 해당 위치에서 일치하는 항목이 검색됩니다.인덱스가m
문자열 끝에 도달하면 일치하는 항목이 없습니다. 이 경우 검색이 "실패"라고 합니다.
일반적으로 평가판 체크는 평가판 일치를 빠르게 거부합니다.문자열이 랜덤으로 균등하게 분포되어 있는 경우 문자가 일치할 확률은 26분의 1입니다.대부분의 경우 평가판 검사에서는 첫 번째 서신에서 일치가 거부됩니다.처음 두 글자가 일치할 확률은 26분의2 1(676분의 1)입니다.따라서 문자가 랜덤인 경우 문자열 검색의 예상 복잡도는S[]
길이 n은 n 비교 또는 O(n)의 순서입니다.기대했던 퍼포먼스가 아주 좋아요.한다면S[]
100만 글자이고W[]
1000자이므로 약 104만 문자의 비교 후에 문자열 검색이 완료됩니다.
기대했던 퍼포먼스는 보증되지 않습니다.문자열이 랜덤이 아닌 경우 평가판 확인m
여러 가지 성격 비교가 필요할 수 있습니다.최악의 경우는 두 문자열이 마지막 문자를 제외하고 모두 일치하는 경우입니다.그 끈이 그 끈이S[]
모두 A인 100만 글자로 구성되어 있습니다.W[]
마지막 B자로 끝나는 999 A 문자입니다.간단한 문자열 일치 알고리즘은 각 시행 위치에서 1000자를 검사한 후 일치를 거부하고 시행 위치를 진행합니다.간단한 문자열 검색 예에서는 약 1000개의 문자 비교 곱하기 100만 개의 위치를 사용하여 10억 개의 문자를 비교합니다.의 길이가W[]
최악의 퍼포먼스는 O(k⋅n)입니다.
KMP 알고리즘은 단순한 알고리즘보다 최악의 경우 성능이 우수합니다.KMP는 테이블을 사전 계산하는 데 약간의 시간을 소비합니다(대략W[]
, O(k)를 사용하여 O(n) 내의 문자열을 효율적으로 검색합니다.
차이점은 KMP는 단순한 알고리즘에서는 사용되지 않는 이전의 일치 정보를 사용한다는 것입니다.위의 예에서는 KMP가 1000번째 문자의 트라이얼 매칭에 실패했을 때(i
= 999)의 이유S[m+999] ≠ W[999]
, 이 값이 증가합니다.m
단, 새로운 위치의 첫 번째 998자가 이미 일치함을 알 수 있습니다.KMP는 1000번째 문자(위치 999)에서 불일치를 검출하기 전에 999A 문자와 일치했습니다.평가판 매치 포지션 진행m
첫 번째 A를 폐기함으로써 KMP는 일치하는 998개의 A 문자가 있음을 알 수 있습니다.W[]
테스트하지 않습니다.즉, KMP 세트는i
998까지.KMP는 사전에 계산된 테이블과 2개의 상태 변수에 대한 지식을 유지합니다.KMP가 불일치를 검출하면 테이블에 따라 KMP의 증가량이 결정됩니다(변수).m
테스트를 재개하는 장소(예:i
).
KMP 알고리즘
검색 알고리즘의 예
알고리즘의 상세를 나타내려면 알고리즘의 (상대적으로 인위적인) 실행을 고려합니다.W
= "ABCDABD" 및S
= "ABC ABCDAB ABCDABDE"알고리즘은 항상 다음 2개의 정수에 의해 결정되는 상태가 됩니다.
m
(내부 위치를 나타냄)S
장래의 경쟁 상대인 곳W
시작합니다.i
(현재 고려되고 있는 문자의 인덱스를 나타냅니다).W
.
각 단계에서 알고리즘은S[m+i]
와 함께W[i]
및 증분i
만약 그들이 같다면.이것은 실행이 시작될 때 다음과 같이 묘사됩니다.
1 2 m: 01234567890123456789012 S: ABC ABCDAB ABCDABDE W: ABCABD i: 0123456
이 알고리즘은 다음 문자를 비교합니다.W
글자를 '고정'하다S
, 를 증가시켜, 1 에서 다음 순서로 이동한다.i
일치한다면요.하지만 네 번째 단계에서는S[3] = ' '
일치하지 않는다W[3] = 'D'
. 에서 다시 검색을 시작하는 것이 아니라S[1]
에 주의해 주십시오.'A'
위치 1과 위치 2 사이에서 발생합니다.S
그 때문에, 그 모든 문자를 사전에 체크(및 대응하는 문자와 일치하고 있는 것을 알고 있다)W
)는, 매치의 개시점을 찾을 가능성이 없습니다.따라서 알고리즘은m = 3
그리고.i = 0
.
1 2 m: 01234567890123456789012 S: ABC ABCDAB ABCDABDE W: ABCABD i: 0123456
이 일치는 첫 번째 문자에서 실패하기 때문에 알고리즘은m = 4
그리고.i = 0
1 2 m: 01234567890123456789012 S: ABC ABCDAB ABCDABDE W: ABCABD i: 0123456
여기서,i
거의 완전한 일치를 통해 증가하다"ABCDAB"
까지i = 6
에 불일치를 주는 것W[6]
그리고.S[10]
다만, 현재의 부분 매치가 종료되기 직전에, 그 서브스트링이 있었습니다."AB"
새로운 매치의 시작일 가능성이 있기 때문에 알고리즘에서는 이 점을 고려해야 합니다.이러한 문자는 현재 위치보다 앞의 두 문자와 일치하므로 다시 확인할 필요가 없습니다.알고리즘 세트m = 8
(첫 번째 프레픽스의 시작) 및i = 2
(처음 두 문자가 일치하는지 확인) 및 조회를 계속합니다.따라서 알고리즘은 이전에 일치한 문자를 생략할 뿐만 아니라S
(the)"AB"
)과(와)가 일치합니다.W
(프리픽스)"AB"
).
1 2 m: 01234567890123456789012 S: ABC ABCDAB ABCDABDE W: ABCABD i: 0123456
새 위치에서의 이 검색은 다음과 같은 이유로 즉시 실패합니다.W[2]
(a)'C'
)가 일치하지 않습니다.S[10]
(a)' '
첫 번째 시행과 마찬가지로 불일치에 의해 알고리즘은 첫 번째 시행으로 돌아갑니다.W
일치하지 않는 문자 위치에서 검색을 시작합니다.S
:m = 10
, 리셋i = 0
.
1 2 m: 01234567890123456789012 S: ABC ABCDAB ABCDABDE W: ABCABD i: 0123456
의 시합m=10
즉석에서 실패하기 때문에 알고리즘은 다음 번을 시도합니다.m = 11
그리고.i = 0
.
1 2 m: 01234567890123456789012 S: ABC ABCDAB ABCDABDE W: ABCABD i: 0123456
다시 한 번 알고리즘은"ABCDAB"
하지만 다음 캐릭터는'C'
, 마지막 문자와 일치하지 않습니다.'D'
그 말의W
이전과 같은 추론, 알고리즘 설정m = 15
2글자 문자열로 시작합니다."AB"
현재 위치로 연결, 설정i = 2
현재 위치에서 조회를 계속합니다.
1 2 m: 01234567890123456789012 S: ABC ABCDAB ABCDABDE W: ABCABD i: 0123456
이번에는 매치가 완료되어 매치의 첫 번째 캐릭터는S[15]
.
검색 알고리즘의 의사 코드 설명
위의 예에는 알고리즘의 모든 요소가 포함되어 있습니다.현재로서는 "부분 일치" 테이블이 존재한다고 가정합니다.T
다음 설명에서는 불일치가 발견되었을 때 새로운 일치의 시작을 찾아야 하는 위치를 나타냅니다.의 엔트리T
매치할 수 있도록 구축되어 있습니다.S[m]
그것은 비교에 실패한다.S[m + i]
로.W[i]
다음 가능한 일치가 인덱스에서 시작됩니다.m + i - T[i]
에S
(즉,T[i]
미스매치 후에 실행할 필요가 있는 「백트래킹」의 양입니다.여기에는 두 가지 의미가 있습니다.첫 번째는T[0] = -1
이것은, 다음의 경우에,W[0]
미스매치입니다.백트래킹은 할 수 없고 다음 문자를 체크하기만 하면 됩니다.둘째, 가능한 다음 일치는 인덱스에서 시작됩니다.m + i - T[i]
위의 예시와 같이 실제로 체크할 필요는 없습니다.T[i]
그 뒤에 나오는 캐릭터들을 계속 검색해서W[T[i]]
다음은 KMP 검색 알고리즘의 의사 코드 구현 예를 나타냅니다.
알고리즘 kmp_search: 입력: 문자 배열, S(검색 대상 텍스트) 배열, W(요구된 단어) 출력: 정수 배열, P(W가 발견되는 S의 정수) 배열, nP(위치 수)는 변수를 정의한다: 정수, j ← 0(현재 c의 위치).Haracter S의)정수(W의 현재 성격의 위치)의 정수의 배열, TnP ← 0는 동안 j개체자(식탁 위, 다른 곳에서 계산된)만약 W[k])S[j] 다음 jj+1자 k← k+1만약 k=length(W) 다음(발생 발견되기만 한다면 처음 발생 ← k, length(S)니 0←.는필요한 경우, m ← j - k를 반환할 수 있음) P[nP] ← j - k, nP ← nP + 1 let k ← T[k] (T[length(W)]는 -1일 수 없음) 또는 k < 0일 경우 k ← T[k]로 한다.
검색 알고리즘의 효율성
테이블의 이전 존재를 가정할 때T
, Knuth-Morris-Pratt 알고리즘의 검색 부분은 복잡도 O(n)를 가집니다.여기서 n은 의 길이입니다.S
O는 big-O 표기법입니다.함수 입력 및 종료 시 발생하는 고정 오버헤드를 제외하고 모든 계산은 에서 수행됩니다.while
루프. 이 루프의 반복 횟수를 제한하려면T
같은 시기에 시작된 매치가S[m]
비교 중에 실패하다S[m + i]
로.W[i]
다음 가능한 일치는 에서 시작해야 합니다.S[m + (i - T[i])]
특히 다음 가능한 일치는 다음보다 높은 지수로 발생해야 합니다.m
,하도록T[i] < i
.
이 사실은 루프가 루프의 2개의 분기 중 하나를 반복할 때마다 실행하기 때문에 루프는 최대 2n회까지 실행될 수 있음을 의미합니다.첫 번째 분기는 변함없이 증가합니다.i
변경되지 않습니다.m
인덱스가m + i
현재 면밀히 조사되고 있는 특징의S
증가했습니다.두 번째 브랜치는 다음과 같이 추가합니다.i - T[i]
로.m
그리고 우리가 봤듯이, 이것은 항상 양수이다.그 때문에, 장소는m
현재 잠재 매치의 시작 부분이 증가합니다.동시에 두 번째 브랜치는m + i
변경되지 않음, 대상m
얻다i - T[i]
그 직후에 추가되었다.T[i]
새로운 값으로 할당되다i
,이런 이유로new_m + new_i = old_m + old_i - T[old_i] + T[old_i] = old_m + old_i
이제 루프가 종료됩니다.m + i
= n. 따라서 루프의 각 분기는 최대 n번까지 도달할 수 있는데, 이는 각각 다음 중 하나가 증가하기 때문이다.m + i
또는m
,그리고.m ≤ m + i
: 만약m
= n 그럼 확실히m + i
§ n, 따라서 최대 단위 증가량만큼 증가하기 때문에, 우리는 반드시 다음을 가지고 있어야 한다.m + i
= 과거 어느 시점에서든 n. 따라서 어느 쪽으로든 우리는 끝납니다.
따라서 루프는 최대 2n회 실행되며 검색 알고리즘의 시간 복잡도는 O(n)임을 나타냅니다.
다음은 런타임에 대해 생각할 수 있는 다른 방법입니다.우리가 일치하기 시작했다고 칩시다.W
그리고.S
위치에i
그리고.p
.한다면W
서브스트링으로서 존재하다S
그럼 p시에W[0..m] = S[p..p+m]
성공했을 때, 즉 단어와 텍스트가 위치에서 일치합니다.W[i] = S[p+i]
), 증가i
1. 실패했을 때, 즉 단어와 텍스트가 위치에서 일치하지 않는 경우(W[i] ≠ S[p+i]
텍스트 포인터는 정지된 상태로 유지되며 워드 포인터는 일정량 롤백됩니다( ).i = T[i]
,어디에T
점프 테이블)을 사용하여W[T[i]]
와 함께S[p+i]
. 의 최대 롤백 횟수i
에 의해 경계되어 있다.i
즉, 어떤 장애가 발생하더라도 장애까지 진행된 만큼만 롤백할 수 있습니다.그러면 실행 시간이 2n인 것이 분명합니다.
"부분 일치" 테이블(일명 "실패 함수")
이 표의 목적은 알고리즘이 다음 문자와 일치하지 않도록 하는 것입니다.S
한 번이 아닙니다.이를 가능하게 하는 선형 검색의 본질에 대한 중요한 관찰은 패턴의 초기 세그먼트에 대해 메인 문자열의 일부 세그먼트를 체크할 때 현재 위치보다 먼저 새로운 잠재적 일치가 시작될 수 있는 위치를 정확히 알고 있다는 것입니다.즉, 패턴 자체를 「사전 검색」해, 가능한 모든 폴백 위치의 리스트를 작성합니다.이 리스트에서는, 최대 가망 없는 문자를 바이패스 해, 일치할 가능성이 있는 문자는 바이패스 할 수 없습니다.
각 포지션별로 위를 볼 수 있기를 바랍니다.W
의 가장 긴 초기 세그먼트의 길이W
(포함하지 않고) 그 위치에 도달하는 것, 그 위치에서 시작하는 풀 세그먼트 이외의 것W[0]
이 정도로 되돌아가야 다음 일치를 찾을 수 있습니다.이런 이유로T[i]
가장 길고 적절한 초기 세그먼트의 길이입니다.W
이것은 또한 로 끝나는 서브스트링의 세그먼트입니다.W[i - 1]
. 빈 문자열의 길이가 0이라는 규칙을 사용합니다.패턴의 시작 부분에서 불일치는 특수한 경우이므로(백트랙 가능성이 없음),T[0] = -1
이하에 설명하겠습니다.
테이블 빌드 알고리즘의 작업 예
의 예를 검토하겠습니다.W = "ABCDABD"
먼저, 메인 검색과 거의 같은 패턴을 따르고, 비슷한 이유로 효율적이라는 것을 알 수 있을 것이다.설정했습니다.T[0] = -1
.찾기 위해서.T[1]
, 우리는 적절한 접미사를 발견해야 합니다."A"
패턴의 접두사이기도 합니다.W
. 그러나 적절한 접미사가 없습니다."A"
, 그래서 우리는T[1] = 0
.찾기 위해서.T[2]
서브스트링은W[0]
-W[1]
("AB"
)에 적절한 서픽스가 있습니다."B"
단, "B"는 패턴의 접두사가 아닙니다.W
그러므로, 우리는T[2] = 0
.
에의 속행하다T[3]
먼저 길이 1의 적절한 서픽스를 체크합니다.앞의 경우와 같이, 이 서픽스는 실패합니다.더 긴 접미사도 확인해볼까요?아니요, 모든 서픽스를 체크하기 위한 숏컷이 있습니다.예를 들어 적절한 프레픽스(스트링의 적절한 프레픽스는 문자열 자체와 동일하지 않습니다)가 검출되어 에서 종료한다고 합시다.W[2]
길이가 2(가능한 최대)인 경우 첫 번째 문자는 적절한 프레픽스이기도 합니다.W
따라서 적절한 프레픽스 자체이며, 여기서 끝납니다.W[1]
(이러한 것은 이미 판명된 바와 같이 발생하지 않았습니다.T[2] = 0
가 아니라T[2] = 1
따라서 각 단계에서 m사이즈의 유효한 접미사가 이전 단계에서 발견된 경우에만 m+1사이즈의 접미사를 체크하는 것을 고려해야 한다는 것이 바로 가기 규칙입니다.T[x] = m
m+2, m+3 등을 체크할 필요가 없습니다.
따라서 길이가 2인 기판도 신경 쓸 필요가 없고, 이전과 마찬가지로 길이가 1인 기판만 고장났기 때문에,T[3] = 0
.
다음 단계로 넘어갑니다.W[4]
,'A'
같은 논리는 고려해야 할 가장 긴 서브스트링의 길이가1인 것을 나타내고 있습니다.앞의 경우와 마찬가지로 "D"는 다음 프레픽스가 아니기 때문에 실패합니다.W
. 하지만 설정 대신T[4] = 0
라고 하는 점에 주의하는 것으로, 보다 좋은 결과를 얻을 수 있습니다.W[4] = W[0]
, 그리고 그 검색은T[4]
대응하는 것을 암시하다S
성격,S[m+4]
는 불일치이기 때문에S[m+4] ≠ 'A'
따라서 검색을 다시 시작하는 것은 의미가 없습니다.S[m+4]
1위부터 시작해야 한다.이것은 우리가 패턴을 바꿀 수 있다는 것을 의미한다.W
일치 길이에 한 글자를 더하면 됩니다.T[4] = -1
.
다음 캐릭터를 생각해보면W[5]
,어느 것이'B'
: 단, 검사 결과 가장 긴 서브스트링은 다음과 같습니다.'A'
, 우리는 여전히T[5] = 0
이 추론은 왜 그런지와 비슷하다.T[4] = -1
.W[5]
프리픽스 조회를 확장합니다.W[4]
에 대응하는 문자는,S
,S[m+5] ≠ 'B'
그래서 예전으로 되돌아가서W[5]
무의미하지만S[m+5]
아마도요.'A'
,이런 이유로T[5] = 0
.
마지막으로 진행 중인 세그먼트의 다음 캐릭터는 다음과 같습니다.W[4] = 'A'
되지요'B'
그리고 이것도 역시W[5]
게다가 위와 같은 주장은 우리가 미리 볼 필요가 없다는 것을 보여준다.W[4]
코너를 찾다W[6]
그래서 이렇게 해서T[6] = 2
.
따라서 다음 표를 작성합니다.
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
W[i] | A | B | C | D | A | B | D | |
T[i] | -1 | 0 | 0 | 0 | -1 | 0 | 2 | 0 |
또 다른 예는 다음과 같습니다.
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
W[i] | A | B | A | C | A | B | A | B | C | |
T[i] | -1 | 0 | -1 | 1 | -1 | 0 | -1 | 3 | 2 | 0 |
다른 예(앞의 예와 약간 다릅니다)
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
W[i] | A | B | A | C | A | B | A | B | A | |
T[i] | -1 | 0 | -1 | 1 | -1 | 0 | -1 | 3 | -1 | 3 |
또 다른 복잡한 예는 다음과 같습니다.
i | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
W[i] | P | A | R | T | I | C | I | P | A | T | E | I | N | P | A | R | A | C | H | U | T | E | |||
T[i] | -1 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | -1 | 0 | 0 | 3 | 0 | 0 | 0 | 0 | 0 | 0 |
테이블 빌드 알고리즘의 의사 코드 설명
위의 예는 최소한의 소란으로 테이블을 조립하는 일반적인 방법을 보여줍니다.원칙은 전체적인 검색입니다.대부분의 작업은 이미 현재 위치에 도달하는 과정에서 이루어졌기 때문에, 그것을 떠나는 데 필요한 작업은 거의 없습니다.유일한 사소한 문제는 스트링의 마지막 부분에서 올바른 로직이 처음에 적절하지 않은 서브스트링을 잘못 제공한다는 것입니다.여기에는 초기화 코드가 필요합니다.
알고리즘 kmp_table: 입력: 문자 배열, W(분석 대상 단어) 출력: 정수 배열, T(채우는 테이블)는 변수를 정의한다: 정수, pos ← 1(현재 T에서 계산하고 있는 위치) 정수, cnd ← 0(현재 c의 다음 문자의 W에서 0에 근거한 인덱스).Andidate 서브스트링)은 Pos < length(W)가 W[pos] ← W[cnd]이면 T[pos] ← T[cnd]이면 T[pos] ← cnd로 하고, Cnd c 0 및 W[pos] ≠ W[cnd로 합니다.
테이블 빌드 알고리즘의 효율성
테이블 알고리즘의 시간(및 공간)의 는O O입니다.서k(\ k는 다음 길이의W
.
- 외부 루프:
pos
1로 초기화되어 있습니다.루프 상태는pos < k
,그리고.pos
루프가 반복될 때마다 1씩 증가합니다.따라서 루프는 k- {회 됩니다.
- 내부 루프:
cnd
에 초기화되어 있다0
외부 루프가 반복될 때마다 최대 1씩 증가합니다.T[cnd]
항상 보다 작다cnd
,그렇게cnd
각 내부 루프 반복 시 최소1 감소합니다.내부 루프 조건은 다음과 같습니다.cnd ≥ 0
즉, 내부 루프는 외부 루프가 실행한 횟수만큼 모두 실행할 수 있습니다.각각의 감소는cnd
내부 루프에서 1만큼 증가해야 합니다.외부 루프는 k-({회 반복)이므로 내부 루프는 총 k-({회)까지만 반복할 수 있습니다.
외부 및 내부 루프를 모두 합치면 - 스타일 의 반복이 소요됩니다.이는 Big O 표기법을 사용하는 O O 시간 복잡도에 합니다.
KMP 알고리즘의 효율성
알고리즘의 두 부분이 각각 복잡하기 때문에O(k)
그리고.O(n)
전체 알고리즘의 복잡성은 다음과 같습니다.O(n + k)
.
이러한 복잡성은 반복 패턴의 수에 관계없이 동일합니다.W
또는S
.
변종
KMP의 실시간 버전은 알파벳 문자별로 별도의 장애 함수 테이블을 사용하여 구현할 수 있습니다.텍스트의 x(\ x에서 불일치가 발생하면 문자x(\ x의 실패 함수 테이블에서 불일치가 발생한 패턴의 i(\ i를 참조합니다.그러면패턴의 프리픽스와 하는 긴 서브스트링의 길이가 반환되고 프리픽스 뒤의 문자가 xx라는 조건이 추가됩니다.이 제한에 의해 의문자 x({x})는 다음 단계에서 다시 체크할 필요가 없기 때문에 다음 단계에서만 체크됩니다.텍스트의[citation needed] 각 인덱스의 처리 사이에 일정한 수의 연산이 실행된다.이는 실시간 컴퓨팅의 제약을 충족합니다.
Booth 알고리즘은 사전 편집상 최소 문자열 회전을 찾기 위해 수정된 버전의 KMP 전처리 함수를 사용합니다.실패 함수는 문자열이 회전할 때 점진적으로 계산됩니다.
메모들
- ^ {\ m은 패턴의 길이입니다.이것은 텍스트에서 찾고 있는 문자열로, 는n{ n입니다.
레퍼런스
- ^ a b Knuth, Donald; Morris, James H.; Pratt, Vaughan (1977). "Fast pattern matching in strings". SIAM Journal on Computing. 6 (2): 323–350. CiteSeerX 10.1.1.93.8147. doi:10.1137/0206024.
- ^ Knuth, Donald E. (1973). "The Dangers of Computer-Science Theory". Studies in Logic and the Foundations of Mathematics. 74: 189–195. doi:10.1016/S0049-237X(09)70357-X. ISBN 9780444104915.
- ^ Morris, J.H., Jr; Pratt, V. (1970). A linear pattern-matching algorithm (Technical report). University of California, Berkeley, Computation Center. TR-40.
- ^ Матиясевич,Юрий(1971년)."О распознавании в реальное время отношения вхождения"(PDF).Записки научных семинаров Ленинградского отделения Математического института им. В.А.Стеклова(러시아어로).20:104–114., 영어로 마티야 세비치, 유리(1973년)으로 번역되다."포함 관계의 실시간 인식".저널 소비에트 수학의. 1:64–70. doi:10.1007/BF01117471.S2CID 121919479.
- ^ Knuth는 그의 저서 Selected Papers on Design of Algorithms의 에라타에서 이 사실을 언급하고 있습니다.
저는 2012년에 유리 마티야세비치가 이 논문의 선형 시간 패턴 매칭과 패턴 전처리 알고리즘을 이미 1969년에 예상했다는 것을 알게 되었습니다.그는 그것들을 2차원 작업기억을 가진 튜링 기계의 구성물로 제시했다.
- ^ Amir, Amihood; Landau, Gad M.; Lewenstein, Moshe; Sokol, Dina (2007). "Dynamic text and static pattern matching". ACM Trans. Algorithms. 3 (2): 19. doi:10.1145/1240233.1240242. S2CID 8409826.
- Cormen, Thomas; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford (2001). "Section 32.4: The Knuth-Morris-Pratt algorithm". Introduction to Algorithms (Second ed.). MIT Press and McGraw-Hill. pp. 923–931. ISBN 0-262-03293-7. Zbl 1047.68161.
- Crochemore, Maxime; Rytter, Wojciech (2003). Jewels of stringology. Text algorithms. River Edge, NJ: World Scientific. pp. 20–25. ISBN 981-02-4897-0. Zbl 1078.68151.
- Szpankowski, Wojciech (2001). Average case analysis of algorithms on sequences. Wiley-Interscience Series in Discrete Mathematics and Optimization. With a foreword by Philippe Flajolet. Chichester: Wiley. pp. 15–17, 136–141. ISBN 0-471-24063-X. Zbl 0968.68205.
외부 링크

- 문자열 검색 애플릿 애니메이션
- David Eppstein의 알고리즘 및 샘플 C++ 코드 설명
- Knuth-Morris-Pratt 알고리즘 설명 및 Christian Charras와 Tierry Lecroq의 C 코드
- FH Flensburg에 의한 알고리즘의 처음부터 설명.
- Chu-Cheng Hsieh의 KMP 실행 단계를 분석합니다.
- NPTELHRD YouTube 강의 동영상
- Logic First YouTube 강의 동영상
- 정확성 증명
- 다른 형식의 알고리즘 간 변환
- C#로 작성된 Knuth-Morris-Pratt 알고리즘
- Knuth-Morris-Pratt 문자열 검색 알고리즘(파트 I) + CBMC, Knuth-Morris-Pratt 문자열 검색 알고리즘(파트 II): DFA 버전, Knuth-Morris-Pratt 문자열 검색 알고리즘(파트 III): DFA-less 버전