• 티스토리 홈
  • 프로필사진
    홀쑥
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
홀쑥
  • 프로필사진
    홀쑥
    • 분류 전체보기 (57)
      • Language & Framework (14)
        • Java (1)
        • Python (13)
      • DataBase (4)
        • NoSQL (1)
        • RDBMS (3)
      • Big Data & Ecosystem (9)
        • Hadoop (5)
        • Hive (2)
        • Sqoop (1)
        • Zeppelin (1)
      • Data Engineering (1)
        • Airflow (1)
      • Cloud & DevOps (1)
        • AWS (0)
        • GCP (1)
      • Monitoring & Logging (2)
        • ElasticSearch (2)
      • Infrastructure (12)
        • OS (12)
        • Docker (0)
        • Kubernetes (0)
      • Algorithm & CS (7)
        • 백준 알고리즘 (6)
      • Troubleshooting (5)
        • 오류 모음 (5)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • [KMP Algorithm] 문자열 검색 KMP 알고리즘
        2023년 01월 07일
        • 홀쑥
        • 작성자
        • 2023.01.07.:12

        KMP (Knuth-Morris-Pratt)  Algorithm

        KMP 알고리즘은 주어진 문자열(M)에서 찾고자 하는 문자열(N)을 빠르게 찾아내는 알고리즘이다.

        KMP 알고리즘은 O(N+M)으로 문자열을 전체비교하는 문자열 완전검탐색 (Brute Force, 시간복잡도 : O(NM))보다 더욱 빠르게 원하는 문자열을 검색할 수 있다.

         

        KMP 알고리즘 이해

        KMP 알고리즘의 이해는 다음 글들을 참고하면 좋을 것 같다.

         

        KMP : 문자열 검색 알고리즘

        문자열 검색이 뭐지? 워드프로세서를 사용할 때 찾기 기능을 사용한적 있을 겁니다. 브라우저에서도 Ctrl+F 단축키를 눌러 검색할 수 있습니다. 아래 이미지는 브라우저에서 "테이프"를 검색했을

        bowbowbow.tistory.com

         

        [알고리즘/ 파이썬] KMP 알고리즘 알아보기

        KMP 알고리즘(Knuth-Morris-Pratt algorithm)이란 문자열 검색을 매우 빠르게 해주는 알고리즘이다. 특정 패턴이 주어졌을 때 전체 문자열을 빠르게 검색하여 그 패턴이 어디에 등장하는 지 찾아준다. KMP

        yiyj1030.tistory.com

        KMP 알고리즘 구현

        KMP 알고리즘은 Python으로 다음과 같이 구현할 수 있다.

        def get_pi(pattern : str) -> list:
        	tb = [0 for _ in range(len(pattern))]
        	i = 0
        	for j in range(1, len(pattern)):
        		while i > 0 and pattern[i] != pattern[j]:
        			i = tb[i-1]
        		if pattern[i] == pattern[j]:
        			i += 1
        			tb[j] = i
        	return tb
        
        def kmp(target : str, pattern : str) -> list:
        	tb = get_pi(pattern)
        	# kmp
        	result = []
        	i = 0
        	for j in range(len(target)):
        		while i > 0 and pattern[i] != target[j]:
        			i = tb[i-1]
        		if pattern[i] == target[j]:
        			i += 1
        			if i == len(pattern):
        				result.append(j - i + 1)
        				j = tb[i-1]
        	retern result

        하지만 내가 업무에 사용할 내용은 일치하는 문자열을 모두 찾는 것이 아닌 일치하는 문자열이 있는가를 찾는 알고리즘이였다.

        따라서 다음과 같이 kmp 함수를 변경하였다.

        def kmp(target : str, pattern : str) -> bool:
        	tb = get_pi(pattern)
        	# kmp
        	i = 0
        	for j in range(len(target)):
        		while i > 0 and pattern[i] != target[j]:
        			i = tb[i-1]
        		if pattern[i] == target[j]:
        			i += 1
        			if i == len(pattern):
        				return True
        	return False

         

        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바