DFA 기반 KMP

먼저 전처리를 위해, 찾을 패턴 안의 모든 문자열과 패턴을 행과 열로 가져야 한다. 예를 들어 패턴이 ABABAC일 경우, 행으로 A, B, C 열로 A, B, A, B, A, C 를 가져야 한다. 고로 문자 집합이 크다면 메모리를 많이 잡아먹게 된다. 대신 속도는 빠름 !!

사용 되는 예시 환경

  1. 네트워크 패킷 필터링
  2. 하드웨어 기반 문자열 검색 (FPGA / ASIC)
  3. 고속 로그 분석 시스템

DFA 테이블 전처리

Deterministic Finite-State Automata

내가 텍스트에서 찾아야 할 패턴이 ABABAC 라고 가정하자.

여기서 표의 제목 열은 상태 번호를 의미하고, 변수 X는 패턴 미스매치 시에 돌아가야 할 상태 번호를 의미한다.

0 1 2 3 4 5
A B A B A C
A 1
B 0
C 0
x 0

초기에 A로 시작해야 다음 상태로 전이될 수 있으므로 A외의 다른 문자들은 시작될수가 없으므로 0이다. X의 초깃값 또한 0이다.

0 1 2 3 4 5
A B A B A C
A 1 1
B 0 2
C 0 0
x 0 0

이전 상태의 x 변수의 상태값으로 이동해서 해당 상태들을 복사해온다. 그 후, 상태 1 에서 B가 매치되면 다음 상태로 전이될 수 있으므로 DFA[B][1] 을 2로 바꾸어 준다. 그 다음, X값을 정해줘야 하는데 이전 상태(그러니까 x값)에서 현재 찾아야 할 문자 (B)의 값 ( DFA[B][previous x] ) 을 이번 상태의 x값으로 정해준다. 0번째 상태의 B 값의 0이므로 1번째 상태의 x값은 0이다.

0 1 2 3 4 5
A B A B A C
A 1 1 3
B 0 2 0
C 0 0 0
x 0 0 1

이전 상태의 x 변수값은 0이다. 그러므로 2번 상태값은 0번 상태값을 모두 복사해온다. 그 후 A가 매칭되면 3번으로 이동할 수 있으므로 DFA[A][2] 의 값을 3으로 바꾸어준다. x값을 정하기 위해 이전 상태 x 변수값 이전 상태값으로 사용하여 이동한 다음 현재 매치된 문자 A가 상태값이 얼마인지 채워준다. 여기서 DFA[A][previous x]의 값은 1 이므로 이번 상태의 x 변수값은 1이다