5. KMP 알고리즘

2023. 3. 23. 13:32·다양한 글들/자료구조와 알고리즘
Reference:
- 이것이 자료구조+알고리즘이다 with C언어 / 박상현 / 한빛미디어
- 건국대학교 컴퓨터공학과 자료구조 수업 / 김성렬 교수님
- https://inuplace.tistory.com/314 / 이누의 개발성장기
KMP 알고리즘

KMP (Knuth-Morris-Pratt) 알고리즘

: '고지식한 탐색' 처럼 탐색 위치를 본문 왼쪽부터 시작해서 오른쪽으로 옮겨가며 문자를 직접 비교하는 방식으로 동작

==> 하지만 요령을 눈곱만큼도 부리지 않는 고지식한 탐색과 달리, KMP 알고리즘은 비교할 필요 없는 부분은 지나치고 비교가 필요한 부분만 비교를 수행하는 똑똑한 알고리즘

==>  '어떤 정보'가 무엇인지와 이 정보를 '어떻게 활용하는가'에 대한 것


KMP 알고리즘의 동작 방식

어느 문자열이든 접두부(prefix)와 접미부(suffix)를 갖고 있음

 

접두부

: 문자열의 머리 부분

 

접미부

: 문자열의 꼬리 부분

 

경계

: KMP 알고리즘에서 빈 문자열이나 BAA처럼 문자열에서 일치하는 접두부와 접미부 쌍

*KMP 알고리즘은 이 경계를 활용해서 불필요한 문자 비교를 피한다*

 

 

ex) 가정해보면

본문 : BAABAABAB

패턴 : BAABAB

  • 탐색을 시작해보면 본문과 패턴의 0~4번 문자열(BAABA) 까지는 서로 일치
  • 그런데 5번 문자에서 불일치가 발생

 

  • 불일치가 발생하기 전까지 본문과 일치했던 0~4번 문자열을 살펴본다
  • BAABA는 빈 문자열과 BA, 이렇게 2개의 경계를 갖고 있다

 

  • 본문 [0...4]와 패턴[0...4]는 서로 일치
  • 이것은 곧 두 문자열의 경계가 서로 같다는 뜻
  • 본문 [0...4]의 접미부는 패턴[0...4]의 접두부와 동일하다는 의미이기도 함
  • 따라서 패턴 전체를 오른쪽으로 쭉 밀어서 패턴의 접두부와 본문[0...4]의 접미부를 일치하게 만들어두면 곧바로 5번부터 비교를 재개할 수 있게 된다.
  • 이때 패턴의 탐색 위치 이동 거리는 일치하는 부분 문자열 (BAABA)의 길이 (5)에서 경계 (BA)의 길이 (2)를 뺀 값과 같다

 

  • 이것이 고지식한 탐색이었다면 5번째 문자에서 불일치가 발견되더라도 다시 본문의 1번 문자(A)부터 탐색을 수행했을 것이다.
  • 하지만 KMP 알고리즘은 사전에 파악해둔 패턴의 경계를 이용해서 1번, 2번 문자를 뛰어넘어 3번 문자부터 탐색을 시작한다
  • 따라서 KMP 알고리즘은 본문의 길이가 n일 때 최대 n번만큼만 비교를 수행하면 본문에서 패턴과 일치하는 문자열의 위치를 알아낼 수 있다.

경계 정보 사전 계산 방법

KMP 알고리즘이 본문과 패턴을 서로 비교하다가 불일치가 발생할 경우 그 경계가 있는지 살펴보고 그 경계를 이용해서 불필요한 비교를 피해간다는 사실을 알았다

 

하지만

"경계를 찾는 데 소요되는 비용은 공짜가 아닐 텐데?"

 

맞다. 당연히 탐색 중간에 매번 경계를 찾는다면 그 비용은 만만치 않게 늘어난다.

그래서 KMP 알고리즘은 탐색을 수행하기 전에 미리 패턴으로부터 경계의 정보를 가진 테이블을 만든다.

 

ex)

  • BAABABAA라는 패턴이 있고 이 패턴으로 탐색을 시도했을 때 첫 번째 문자부터 불일치가 일어난다고 가정해보자
  • KMP 알고리즘에서는 불일치가 일어난 위치 이전의 일치 접두부에서 최대 경계를 찾고, 이 경계의 너비를 이용해서 비교할 필요가 없는 탐색 위치를 건너뛴다.
  • 그런데 1 번째 문자는 일치 접두부가 아예 존재하지 않는다
  • 그래서 1 번째 문자의 경계 너비는 항상 -1이다. 
  • 0은 이전 접두부가 존재하지만 경계가 없을 때 경계의 너비로 사용하기 때문에 -1로 시작하는 것이다

 

  • 이번에는 1 번째 문자가 일치하지만 2 번째 (인덱스: 1) 문자에서 불일치가 발생한다고 가정해보자
  • 불일치가 일어난 2 번째 문자 앞에 있는 일치 접두부는 B 하나뿐이다.
  • 따라서 경계가 존재하지 않으므로 일치 접두부의 최대 경계 너비는 0이 된다.
  • 3 번째 (인덱스 : 2) 문자는 어떨까?
  • 역시 경계가 존재하지 않으므로 경계 너비는 0이다.
  • 4 번째 (인덱스: 3) 문자도 마찬가지로 경계 너비가 0이다

 

  • 5 번째 (인덱스 : 4) 문자에서 불일치가 발생한 경우 일치 접두부는 BAAB이므로 최대 경계가 B이며 너비는 1이다
  • 6 번째 (인덱스 : 5) 문자의 일치 접두부는 BAABA는 최대 경계가 BA로 너비가 2이다.
  • 이런식으로 테이블을 완성해나가면 다음과 같은 결과를 얻을 수 있다.

 

  • 이제 보니 경계 테이블의  크기가 패턴 크기보다 1만큼 더 크다.
  • 테이블의 마지막 칸은 본문 내 문자열이 패턴과 일치하지만 이어서 탐색을 계속하고자 할 때 사용한다
  • 예를 들어 패턴 전체와 일치하는 부분을 찾았는데, 그 부분 뒤에 이어지는 본문의 문자가 패턴의 첫 번째 문자와 일치하지 않는 경우 이 경계의 너비값을 사용하게 된다. 그렇다면 마지막 칸을 채워보자
  • 일치 접두부는 BAABABAA이고 최대 경계는 BAA로 길이는 3이다.
  • 이 값을 기입하면 테이블이 완성된다

 

 

탐색 위치의 이동 거리를 계산하기 위해 경계 테이블을 만들어뒀으니, 불일치가 발생했을 때 탐색 위치의 이동 거리는 다음과 같다

탐색 위치의 이동 거리 = 일치 접두부의 길이 - 최대 경계 너비

 

우리가 만들어둔 경계 테이블을 예로 들면, 본문과 패턴이 0~4번 문자까지는 일치하는데 5번 문자에서 불일치가 발생한 경우 패턴의 이동 거리는 5-2=3이 된다


KMP 알고리즘 예제 프로그램

 

저작자표시 (새창열림)

'다양한 글들 > 자료구조와 알고리즘' 카테고리의 다른 글

1. 문자열 탐색 알고리즘의 개요  (0) 2023.03.23
6. 보이어-무어 알고리즘  (0) 2023.03.23
4. DFA 알고리즘  (0) 2023.03.23
3. 카프-라빈 알고리즘  (0) 2023.03.23
2. Naive 알고리즘 (고지식한 탐색 알고리즘)  (0) 2023.03.23
'다양한 글들/자료구조와 알고리즘' 카테고리의 다른 글
  • 1. 문자열 탐색 알고리즘의 개요
  • 6. 보이어-무어 알고리즘
  • 4. DFA 알고리즘
  • 3. 카프-라빈 알고리즘
smile blog
smile blog
건국대 첨단바이오공학부 & 컴퓨터공학부 BT & IT 기술로 희망을 꿈 꿉니당
  • smile blog
    스마일 블로그
    smile blog
  • 전체
    오늘
    어제
    • 분류 전체보기 (826) N
      • 일상 생각들 (3)
      • 학과에 대해 (4)
        • 첨단바이오공학부 (4)
        • 컴퓨터공학부 (0)
      • -------- 프로젝트 -------- (0)
      • [DS] 토이 프로젝트 (1)
      • [Web, Game, XR] 토이 프로젝트 (11)
      • 경진대회 (1)
      • -------- 진로 -------- (0)
      • 생물정보학자 (18)
        • 데이터 과학이란? (0)
        • 되는 방법 (8)
        • 책 추천 (2)
        • 인강 (1)
        • 대학 (2)
        • 회사 (1)
        • 학원 (2)
        • 학회 (2)
      • 디지털 헬스케어 (72)
        • 방법 (8)
        • 생각들 (10)
        • 공부법 (4)
        • 책 추천 (2)
        • 학원 (2)
        • 참고 (2)
        • 대학 (3)
        • 회사 (3)
        • 인강 (2)
        • 게임 엔진들 (1)
        • 게임 프로그래머 개론 (2)
        • 게임 프로그래머 취업 전략 가이드 (7)
        • 취업 서류 (1)
        • 애정하는 게임들 (4)
        • XR 테크니컬 아티스트 (9)
        • 영화, 애니메이션 테크니컬 디렉터 (12)
      • -------- 기초 학문 -------- (0)
      • 생명과학 이야기 (2)
        • 대학 강의 (2)
      • 화학 이야기 (0)
      • 컴퓨터과학 이야기 (0)
      • 통계학 이야기 (0)
      • 수학 이야기 (1)
        • 공학 수학 (1)
      • 영어 이야기 (1)
      • 심리학 이야기 (7)
        • 현대인과 정신건강 (7)
      • -------- 컴퓨터 언어 -------- (0)
      • Python (3)
        • 나도코딩의 파이썬 입문 (1)
        • 파이썬 관련 정보 (1)
      • SQL (0)
      • C 언어 (32)
        • 혼자 공부하는 C언어 요약 (1)
        • [책 정리] 혼자 공부하는 C언어 (31)
      • C++ (33)
        • 명품 C++ 프로그래밍 요약 (1)
        • [책 정리] 명품 C++ 프로그래밍 (27)
        • C++ STL (0)
        • 뇌를 자극하는 C++ STL (5)
      • -------- 생명과학 -------- (0)
      • 생화학 (5)
        • 대학 강의 (5)
      • 분자세포생물학 (3)
        • 대학 강의 (3)
      • 유전자치료공학 (2)
        • 대학 강의 (2)
      • 생명정보학 (6)
        • 대학 강의 (6)
      • 약리학 (2)
        • 대학 강의 (2)
      • -------- 컴퓨터과학 -------- (0)
      • 자료구조와 알고리즘 (8)
        • 자료구조와 알고리즘의 정의 (3)
        • [책 정리] C언어로 쉽게 풀어쓴 자료구조 요약 (1)
        • [인강] 자료구조와 알고리즘 (2)
        • 코딩 테스트 대비하기! (1)
      • 컴퓨터 회로 (0)
      • 컴퓨터 구조 (43)
        • 컴퓨터 구조와 운영체제 요약 (1)
        • ---------------------------------------- (0)
        • [전공 책 정리] 컴퓨터 구조 및 설계 (1)
        • Ch1. 컴퓨터 추상화 및 관련 기술 (8)
        • Ch2. 명령어 : 컴퓨터 언어 (11)
        • Ch3. 컴퓨터 연산 (8)
        • Ch4. 프로세서 (11)
        • Ch5. 메모리 계층구조 (3)
        • Ch6. 병렬 프로세서 : 클라이언트에서 클라우드까지 (0)
      • 시스템 프로그래밍 (15)
        • [책 정리] 시스템 프로그래밍 유닉스 & 리눅스 (0)
        • [인강] 리눅스 시스템 프로그래밍 (2)
        • 리눅스에서 코딩이란? (8)
        • 대학교 강의 정리 (5)
      • 운영체제 (0)
      • 컴퓨터 네트워크 (37)
        • 모두의 네트워크 요약 (1)
        • [책 정리] 모두의 네트워크 (10)
        • ---------------------------------------- (0)
        • [전공 책 정리] 컴퓨터 네트워킹 하향식 접근 8판 (1)
        • Ch1. 컴퓨터 네트워크와 인터넷 (7)
        • Ch2. 애플리케이션 계층 (7)
        • Ch3. 트랜스포트 계층 (8)
        • Ch4. 네트워크 계층 : 데이터 평면 (3)
        • Ch5. 네트워크 계층 : 제어 평면 (0)
        • Ch6. 링크 계층과 근거리 네트워크 (0)
        • Ch7. 무선 및 이동 네트워크 (0)
        • Ch8. 컴퓨터 네트워크 보안 (0)
      • 데이터베이스 (1)
      • -------- 데이터과학 -------- (0)
      • 데이터 사이언스 (8)
        • 인강 (8)
      • 데이터 분석 (2)
        • 인강 (2)
      • 머신러닝 (2)
        • 대학 수업 (2)
      • 인공지능 (11)
        • 대학교 강의 정리 (10)
        • 인공지능 관련 정보 (1)
      • -------- +a -------- (0)
      • Visual Studio Community (7)
        • 설치법 (1)
        • 단축키 (1)
        • 오류 (5)
      • Visual Studio Code (0)
      • 노션 (1)
      • 깃허브 (7)
        • 깃허브 사용법 (5)
        • 유니티, 언리얼 & 깃허브 (1)
        • 깃허브 주의사항 (1)
      • 챗GPT 활용법 (0)
      • 기타 feat. 프로그래밍 (7)
        • 프로그래머로 살아남기 (5)
        • 코딩 vs 프로그래밍 (1)
        • 애플 비전 프로 (1)
      • 메타버스 (5)
      • -------- 예술 -------- (0)
      • 음악 (1)
      • 미술 (0)
      • -------- XR -------- (0)
      • 유니티 이야기 (23)
        • 레트로의 유니티 게임 프로그래밍 에센스 요약 (4)
        • 유니티 관련 정보 (1)
        • 유니티 디버깅 (13)
        • 유니티 인강 (3)
        • 대학교 게임 프로그래밍 강의 (2)
      • 언리얼 이야기 (0)
        • 인생 언리얼 교과서 요약 (0)
      • 컴퓨터 그래픽스 (6)
        • OpenGL (6)
      • 가상현실 & 증강현실 (4)
        • 유니티 vr (4)
      • HCI 와 UI UX (7)
        • [책 정리] HCI 개론 (6)
      • -------- Design -------- (0)
      • 캐릭터 (1)
        • 모델링 (0)
        • 리깅 (1)
      • 포토샵 (3)
      • 3ds Max (7)
      • Maya (9)
        • 블로그 (1)
        • 인강 (6)
        • 대학교 (2)
      • Blender (14)
        • 책 (1)
        • 인강 (7)
        • 기타 (3)
        • 대학교 (3)
      • 아트 작업물들 (2)
      • 에셋 사이트 (1)
      • -------- 건강관리 -------- (0)
      • 건강관리 ft. 정현 (12)
        • 목 디스크 (2)
        • 눈 관리 (2)
        • 일상생활 습관 (6)
        • 일상생활 꿀팁 (2)
        • 사무직 꿀팁 (0)
      • 헬스의 정석 ft. 정현 (28)
        • 헬스와 건강 (8)
        • 헬스 구체화 정보 (6)
        • 헬스 유튜버 (1)
        • 헬스 서적 (1)
        • 도전 바디프로필! (11)
        • 헬스장 패션 (1)
      • -------- etc -------- (0)
      • 진로 관련 잡다한 글들 (34)
        • 진도율 (9)
        • 진로 관련 글들 (15)
        • 학교 강의 관련 글들 (10)
      • 인생 꿀 Tip (23)
        • 컴퓨터 초기 설정 (9)
        • 원격 데스크톱 (1)
        • 노트북 발열 (1)
        • 전자기기 (2)
        • 중고기기 팔기 (1)
        • 아이패드 필기 어플 (1)
        • 에어팟 (1)
        • 커피 (1)
        • 맥북 (1)
        • lg 그램 (1)
        • 검색엔진에서 내 티스토리 검색 (1)
        • hELLO 다크 모드 없애기 (1)
        • 인터넷 연결 문제 (1)
        • 키보드 문제 해결 (1)
      • 유튜브 (3)
      • 청춘 그리고 추억 (1)
      • 인생 계획표 (2)
        • 2024년 2학기 (1)
        • 2024년 여름방학 (0)
        • 2024년 1학기 (0)
        • 2023년 겨울방학 (1)
      • 다양한 글들 (98)
        • C++ STL (6)
        • Win32 API (24)
        • PushPush 게임 (13)
        • 컴퓨터구조 (1)
        • 자료구조와 알고리즘 (50)
        • 게임의 정의 (3)
        • 영상 회사 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • Dream
    • 코딩을 시작한 이유
    • 나를 소개합니다!
    • 블로그 공부법
    • IT & 가치 있는 일들
  • 인기 글

  • 태그

    생명공학
    스택
    배열
    데이터과학
    블렌더
    인공지능
    알고리즘
    생물정보학
    포인터
    생명과학
    리눅스
    심리학
    데이터사이언스
    컴퓨터 네트워크
    C++
    첨단바이오공학부
    코딩
    unity
    의생명정보알고리즘
    AI
    컴퓨터구조
    C언어
    의생명공학
    유니티
    의생명공학과
    건국대
    자료구조
    함수
    명령어
    연산자
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
smile blog
5. KMP 알고리즘
상단으로

티스토리툴바