패턴 매칭 KMP 알고리즘 연구 노트

패턴 매칭 KMP 알고리즘

문자열 : BBC ABCDAB ABCDABCDABDE

검색어 : ABCDABD

1.

B가 A와 일치하지 않으면 검색어가 나중에 한 자리 이동합니다.

2.


B가 A와 일치하지 않으면 검색어가 뒤로 이동합니다.

삼.

문자열에 검색어의 첫 번째 문자와 동일한 문자가있을 때까지.

4.

그런 다음 문자열을 검색어의 다음 문자와 비교해도 여전히 동일합니다.

5.

문자열에 검색어에 해당하는 문자와 동일하지 않은 문자가있을 때까지.

6.

이때 가장 자연스러운 반응은 전체 검색어를 한 곳씩 뒤로 이동하고 처음부터 하나씩 비교하는 것입니다. 이것이 가능하지만 "검색 위치"를 이미 비교 된 위치로 이동하고 비교를 반복해야하기 때문에 매우 비효율적입니다.

7.

기본 사실은 공백이 D와 일치하지 않으면 실제로 처음 6 개의 문자가 "ABCDAB"라는 것을 알고 있다는 것입니다. KMP 알고리즘의 아이디어는이 알려진 정보를 사용하려고 시도하고 "검색 위치"를 비교 된 위치로 다시 이동하지 않고 계속 뒤로 이동하여 효율성을 향상시키는 것입니다.

8.

검색어의 경우 '부분 데이터 이동 색인'을 계산합니다. 이 테이블이 생성되는 방법은 여기에서 사용할 수있는 한 나중에 소개 될 것입니다.

9.

알려진 공백이 D와 일치하지 않으면 처음 6 자 "ABCDAB"가 일치합니다. 표를 보면 마지막으로 일치하는 문자 B에 해당하는 "부분 일치 값"이 2임을 알 수 있으므로 다음 공식에 따라 뒤로 이동 한 비트 수를 계산합니다.

  시프트 수 = 일치하는 문자 수-해당 부분 일치 값 (검색어 "접두어"및 "접미사"의 가장 긴 공통 요소의 길이)

6-2는 4와 같으므로 검색어를 4 자리 뒤로 이동합니다.

10.

공백이 C와 일치하지 않기 때문에 검색어는 계속 뒤로 이동해야합니다. 이때 일치하는 문자의 수는 2 ( "AB")이고 해당 "부분 일치 값"은 0입니다. 따라서 시프트 수 = 2-0이고 결과는 2이므로 검색어가 2 자리 뒤로 이동합니다.

11.

공간이 A와 일치하지 않으므로 계속해서 한 비트 뒤로 이동하십시오.

12.

C와 D가 일치하지 않을 때까지 조금씩 비교합니다. 따라서 자릿수 = 6-2로 이동하고 검색어를 계속해서 4 자리 뒤로 이동합니다.

13.

비트별로 비교하면 검색어의 마지막 비트까지 정확히 일치하는 항목이 발견되고 검색이 완료됩니다. 검색을 계속하려면 (즉, 모든 일치 항목 찾기) 자릿수를 7-0으로 이동 한 다음 검색어를 7 자리 뒤로 이동하므로 여기서 반복하지 않습니다.

14.

다음은 "부분 데이터 이동 색인"이 생성되는 방법을 설명합니다.

먼저 "접두사"와 "접미사"라는 두 가지 개념을 이해해야합니다. "접두사"는 마지막 문자를 제외한 문자열의 모든 머리 조합을 나타내고 "접미사"는 첫 번째 문자를 제외한 문자열의 모든 꼬리 조합을 나타냅니다.

15.

"부분 일치 값"은 "접두사"및 "접미사"의 가장 긴 공통 요소의 길이입니다. "ABCDABD"를 예로 들어 보겠습니다.

                                  공용 요소의 접두사 길이

    "A"빈 세트 빈 세트 0

    "AB"[A] [B] 0

  "ABC"[A, AB] [BC, C] 0

  "ABCD"[A, AB, ABC] [BCD, CD, D] 0

  "ABCDA"[A, AB, ABC, ABCD] [BCDA, CDA, DA, A] 1

  "ABCDAB"[A, AB, ABC, ABCD, ABCDA] [BCDAB, CDAB, DAB, AB, B] 2

  "ABCDABD"[A, AB, ABC, ABCD, ABCDA, ABCDAB] [BCDABD, CDABD, DABD, ABD, BD, D] 0

16.

"부분 일치"의 핵심은 때때로 문자열의 시작과 끝이 반복된다는 것입니다. 예를 들어 "ABCDAB"에 두 개의 "AB"가있는 경우 "부분 일치 값"은 2 ( "AB"의 길이)입니다. 검색어가 이동하면 첫 번째 "AB"가 4 자리 (문자열 길이-부분 일치 값) 뒤로 이동 한 다음 두 번째 "AB"위치로 올 수 있습니다.

17. 다음 어레이

다음 배열은 "최대 길이 값"에 해당하며 전체가 오른쪽으로 1 비트 이동 된 후 초기 값이 -1로 지정됩니다.

이동 횟수 = 일치하지 않는 문자의 위치 (아래 첨자는 0부터 시작)-일치하지 않는 문자에 해당하는 다음 값

18 개의 다음 어레이 최적화 버전

같으면 next [j] = next [k]

j = 3 , k = 0 , 다음 [0] =-1

j = 5 , k = 1 , 다음 [1] = 0

j = 7 , k = 1 , 다음 [1] = 0

j = 8, k = 2, 다음 [2] = 0
——————————————
재 인쇄 주소 : https://blog.csdn.net/v_JULY_v/article/details/7041827

 

추천

출처blog.csdn.net/qq_30507287/article/details/105219189