Notice
Recent Posts
Recent Comments
초코레
KMP법 본문
- 브루트-포스법을 개선한 알고리즘으로 검사했던 위치 결과를 버리지 않고 이를 효율적으로 활용하는 알고리즘
- 텍스트와 패턴의 겹치는 부분을 찾아내어 검사를 다시 시작할 위치를 구함으로써 패턴을 최소의 횟수로 옮겨 알고리즘의 효율을 높인다.
- 몇 번째 문자부터 다시 검색할지에 대한 값을 미리 표로 만들어 둔다.
- 건너뛰기 표를 작성할 때는 패턴 안에서 중복되는 문자의 나열을 먼저 찾아나기 위해 패턴끼리 겹쳐놓고 생각하여 만든다.
- 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 |