27
문문문 문문 (1) [DevRookie] 문문문문

문자열 검색 (1)

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: 문자열 검색 (1)

문자열 검색 (1)[DevRookie] 꽝매니아

Page 2: 문자열 검색 (1)

문자열 검색이란 ? 왜 알아야 하는가 ? BrutalForce 오토마타를 이용한 매칭 카프 - 라빈 알고리즘 정리 ???

개요

Page 3: 문자열 검색 (1)

탐색 알고리즘의 종류 데이터 안에서 특정 패턴을 찾아내는 방법 본문 : 검색 대상이 되는 문자열 패턴 : 검색어 Shift : 탐색위치를 옮기는 것

문자열 검색이란 ?

Page 4: 문자열 검색 (1)

검색 알고리즘의 공부 다양한 활용분야 게임개발에도 쓰인다 대부분 만들어져

있는것을 잘 활용하는 것

하지만 직접 만들어야 될 수도 있다 .

왜 알아야 하는가 ?

Page 5: 문자열 검색 (1)

왜 알아야 하는가 ?

Page 6: 문자열 검색 (1)

다양한 분야에서 쓰이는 응용 사례 Search Engine Data Parsing Data Compress, Encoding/Decoding Query Text Editor Language Code 비속어 필터링 , 채팅창 명령 , 커뮤니티 부분 활용 등 작업 분야에 따라 그리 소용 없을지도… 왜 그럴까 ? 문자열 비교는 정말 느리다 ! 다른 타입으로 비교하자 !

왜 알아야 하는가 ?

Page 7: 문자열 검색 (1)

유치원 (?) 에서나 배울 것 같은 방법 맨 처음 생각하게 되는 가장 단순한 방법 본문 ( 앞 / 뒤 ) 에서 부터 순차적으로 패턴 ( 앞 / 뒤 ) 를

검사하는 방식

BrutalForce (Naïve Search)

Page 8: 문자열 검색 (1)

BrutalForce

Page 9: 문자열 검색 (1)

BrutalForce

Page 10: 문자열 검색 (1)

문제 해결 절차를 상태간의 이동 ( 전이 ) 로 나타낸 것 .

오토마타를 활용한 검색

Page 11: 문자열 검색 (1)

오토마타를 활용한 검색

Page 12: 문자열 검색 (1)

오토마타를 활용한 검색

Page 13: 문자열 검색 (1)

목표 상태가 굳이 하나일 필요가 없다 . 즉 , 검색 과정에서 중간 결과를 도출 할 수도 있다 . 입력 문자 타입이 많으면 공간을 많이 차지하므로 좋지

않다 . O(n) 의 복잡도를 보여준다 . 테이블을 미리 만드는 작업에 대한 복잡도 고려 필요

오토마타를 활용한 검색

Page 14: 문자열 검색 (1)

증분 검색이란 ? 사용자가 글자를 입력하는 중에 계속적으로 해당

내용을 찾아주는 기능 . 오토마타를 활용한 검색을 이용해 볼 수 있는 방법 . Visual Studio 에서는 CTRL + I, CTRL + SHIFT

+ I CTRL + F 보다 편하죠 ?

쉬어 갑니다 .

Page 15: 문자열 검색 (1)

라빈 – 카프 알고리즘

이 알고리즘은 HASH를 사용합니다 .

수식이 왜이리 복잡해 !

Page 16: 문자열 검색 (1)

패턴 문자를 해쉬와 공식을 사용해서 숫자로 바꿔준다 . 본문의 비교 문자열도 똑같은 공식으로 숫자로

바꿔준다 . 숫자 대 숫자 비교를 하게 된다 .

라빈 – 카프 알고리즘

Page 17: 문자열 검색 (1)

패턴의 문자들을 이용해 수치화 한다 . 예 : Σ = {a, b, c, d, e} • |Σ| = 5 • a, b, c, d, e 를 각각 0, 1, 2, 3, 4 에 대응시킨다 • 문자열 “ cad” 를 수치화하면 2*52+0*51+3*50

= 28

라빈 – 카프 알고리즘

Page 18: 문자열 검색 (1)

라빈 – 카프 알고리즘

의외로 숫자가 좀 큰듯 ?

Page 19: 문자열 검색 (1)

라빈 – 카프 알고리즘

오버 플로우 날듯 !

나누면 되지 !

뭘루여…ㅜㅜ

Page 20: 문자열 검색 (1)

라빈 – 카프 알고리즘

입력되는 숫자의 진수를 고려해서

큰 소수로 나머지 연산 처리 .

Page 21: 문자열 검색 (1)

라빈 – 카프 알고리즘

패턴에 대한 수치화 값 계산할때 나머지 연산 하기도 전에

계산 하다가 오버 플로우 날수도 있겠네요…

패턴의 길이를 무작정 길게 쓸수는 없으니 글자 수를 꽤 짧게 제한해야 겠네요…

Page 22: 문자열 검색 (1)

라빈 – 카프 알고리즘

이것은 해쉬 비교일뿐 ! 해쉬는 충돌할 수 있어요 !

해쉬값이 같아도 일치하는지 확인해야 됩니다 .

Page 23: 문자열 검색 (1)

라빈 – 카프 알고리즘

검색 위치 이동후에는 해당 자리수의 해쉬값에서 빠져나간 앞칸 값을 빼고

새로 추가된 해쉬값을 더해준다 .해당 공식을 매번 할 필요는 없다 .

Page 24: 문자열 검색 (1)

이게 다일까요 ? 천만에요… 다음주 KMP, Boyer-Moore 를 기대하세요… 무식하게 검색한다 . BrutalForce(Naïve) 검색 패턴의 해결 절차를 만든다 . 오토마다 . 해쉬를 이용해 수치비교 한다 . 라빈 - 카프

정리

Page 25: 문자열 검색 (1)

문자열 알고리즘 종류를 간단히 (?) 알고 싶다면… ( 정형 / 비정형 ) 검색 , 색인을 알고 싶다면…

If (Iterator == here)

Page 26: 문자열 검색 (1)

Brute force algorithm Search with an automaton KarpRabin algorithm Shift Or algorithm MorrisPratt algorithm KnuthMorrisPratt algorithm imon algorithm olussi algorithm alilGiancarlo algorithm ApostolicoCrochemore algorithm Not So Naive algorithm Forward Dawg Matching algorithm BoyerMoore algorithm TurboBM algorithm ApostolicoGiancarlo algorithm Reverse Colussi algorithm Horspool algorithm Quick Search algorithm Tuned BoyerMoore algorithm ZhuTakaoka algorithm BerryRavindran algorithm Smith algorithm Raita algorithm Reverse Factor algorithm Turbo Reverse Factor algorithm Backward Oracle Matching algorithm GalilSeiferas algorithm Two Way algorithm String Matching on Ordered Alphabets Optimal Mismatch algorithm Maximal Shift algorithm Skip Search algorithm KmpSkip Search algorithm Alpha Skip Search algorithm

( 참고 1) 문자열 알고리즘 종류

Page 27: 문자열 검색 (1)

정형데이터색인기법 - 역파일 - 접미사트리와접미사배열 - 요약파일 비정형데이터색인및검색기법 - 공간접근방법 - 다차원색인방법 - R- 트리 - 순차탐색 - GEMINI

( 참고 2) 정형 / 비정형 색인