초코레

KMP법 본문

알고리즘

KMP법

초코레 2020. 1. 1. 22:54
  • 브루트-포스법을 개선한 알고리즘으로 검사했던 위치 결과를 버리지 않고 이를 효율적으로 활용하는 알고리즘
  • 텍스트와 패턴의 겹치는 부분을 찾아내어 검사를 다시 시작할 위치를 구함으로써 패턴을 최소의 횟수로 옮겨 알고리즘의 효율을 높인다.
  • 몇 번째 문자부터 다시 검색할지에 대한 값을 미리 표로 만들어 둔다.
  • 건너뛰기 표를 작성할 때는 패턴 안에서 중복되는 문자의 나열을 먼저 찾아나기 위해 패턴끼리 겹쳐놓고 생각하여 만든다.
  • KMP법은 브루트-포스법보다는 복잡하고 Boyer-Moore법과는 성능이 같거나 좋지 않기 때문에 실제 프로그램에서는 거의 사용되지 않는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//KMP법에 의한 문자열 검색
 
static int kmpMatch(String txt, String pat) {
    int pt = 1;            //텍스트를 스캔하는 변수
    int pp = 0;            //패턴을 스캔하는 변수
    int[] skip = new int[pat.length() + 1];
    
    //건너뛰기 표
    skip[pt] = 0;
    while (pt != pat.length()) {
        if (pat.charAt(pt) == pat.charAt(pp)) {
            skip[++pt] = ++pp;
        } else if (pp == 0) {
            skip[++pt] = pp;
        } else {
            pp = skip[pp];
        }
    }
    
    //검색
    pt = pp = 0;
    while (pt != txt.length() && pp != pat.length()) {
        if (txt.charAt(pt) == pat.charAt(pp)) {
            pt++;
            pp++;
        } else if (pp == 0) {
            pt++;
        } else {
            pp = skip[pp];
        }
    }
    if (pp == pat.length()) {
        return pt - pp;
    }
    return -1;
}
cs

'알고리즘' 카테고리의 다른 글

포인터로 연결 리스트 만들기  (0) 2020.01.02
Boyer-Moore법  (0) 2020.01.01
브루트-포스법  (0) 2020.01.01
집합  (0) 2019.12.31
도수 정렬  (0) 2019.12.30