p = "is" # 찾을 패턴
t = "This is a book ~ !" # 전체 텍스트
M = len(p) # 찾을 패턴의 길이
N = len(t) # 전체 텍스트의 길이
def BruteForce(p,t):
i = 0 # t의 인덱스
j = 0 # p의 인덱스
while j < M and i < N :
if t[i] != p[j]:
i = i - j
j = -1
i = i + 1
j = j + 1
if j == M : return i - M # 검색성공
else: return -1 # 검색실패
불일치가 발생한 텍스트 스트링의 앞 부분에 어떤 문자가 있는지를 미리 알고 있으므로, 불일치가 발생한 앞부분에 대하여 다시 비교하지 않고 매칭을 수행
패턴을 전처리하여 배열 next[M]을 구해서 잘못된 시작을 최소화 함
시간 복잡도 : O(M+N)
매칭 실패시 되돌아 갈 곳을 기억해둔다.
오른쪽에서 왼쪽으로 비교찾고자 하는 문자열 패턴의 길이 : m, 총 문자열 : n
| 고지식한 패턴 | 카프-라빈 | KMP |
|---|---|---|
| O(mn) | Θ(n) | Θ(n) |
보이어 - 무어 알고리즘