문자열 탐색 KMP
2019. 9. 25. 17:15ㆍ알고리즘/암기
N의 길이의 텍스트에서 M의 길이를 가진 패턴을 찾으려고 할 때(N>=M) 일반적인 문자열 탐색 알고리즘. 즉 브루트포스로 모든 문자를 검색한다고 하면 시간복잡도는 O(NM)이 된다. 즉 NM이 1억이 넘어가면 1초 안에 해결할 수 없을뿐더러 텍스트의 길이가 헤아릴 수 없다는 점에서 NM은 매우 비효율적이다. 따라서 해결할 수 있는 방법인 KMP다. KMP는 시간복잡도 O(N)에 해결할 수 있다
1. KMP를 구현하기 위해선 패턴의 접두사, 접미사가 같은 최대 길이를 알아야 한다. 이는 KMP에서 점프를 할 때 유용하게 쓰이는 데이터 중 하나다. 보통 이를 실패 배열이라고 부른다.
2. 문자열 탐색 중 어긋나는 경우, 그 전까지는 다 맞다고 할 수 있다. 따라서 맞은 부분 문자열에서 실패 배열을 통해 맞은 부분 문자열은 생략하고, 실패 배열에 있는 값으로 j를 점프할 수 있다
3. 텍스트의 인덱스는 지속적으로 증가하면서, 2번을 수행하기 때문에 O(N)에 해결할 수 있다고 말할 수 있다
'알고리즘 > 암기' 카테고리의 다른 글
내림차순 정렬된 배열을 뒤집기 (0) | 2019.10.09 |
---|---|
퀵 정렬 알고리즘 (0) | 2019.10.08 |
map을 정렬하는 방법 (0) | 2019.09.22 |
sort 함수에서의 compare function 동작 로직 (0) | 2019.09.21 |
c++ string token (0) | 2019.09.18 |