맨위로가기

문자열 검색 알고리즘

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

문자열 검색 알고리즘은 주어진 텍스트 내에서 특정 문자열(패턴)의 위치를 찾는 알고리즘을 의미한다. 주요 알고리즘으로는 크누스-모리스-프랫 알고리즘, 보이어-무어 알고리즘, 라빈-카프 알고리즘 등이 있으며, 각 알고리즘은 전처리 시간, 매칭 시간, 공간 복잡도 측면에서 서로 다른 성능을 보인다. 알고리즘은 패턴 수, 전처리 여부, 검색 전략에 따라 분류될 수 있으며, 텍스트를 전처리하지 않는 단순 알고리즘부터 텍스트나 패턴을 전처리하는 다양한 알고리즘이 존재한다. 이러한 알고리즘은 텍스트 검색, 퍼지 검색 등 다양한 분야에 활용된다.

더 읽어볼만한 페이지

  • 문자열 검색 알고리즘 - 커누스-모리스-프랫 알고리즘
    커누스-모리스-프랫 알고리즘은 문자열 검색 알고리즘으로, 부분 일치 테이블을 이용하여 불필요한 비교를 줄여 효율적으로 특정 검색어의 위치를 찾으며 시간 복잡도는 O(n + k)이다.
  • 문자열 검색 알고리즘 - 아호 코라식 알고리즘
    아호-코라식 알고리즘은 1975년에 개발된 알고리즘으로 트라이 자료구조, 실패 링크, 출력 링크를 활용하여 텍스트 내에서 여러 문자열 패턴을 효율적으로 검색하며 스팸 필터링, 침입 탐지 시스템 등 다양한 분야에 활용된다.
  • 문자열 - 빈 문자열
    빈 문자열은 형식 언어 이론에서 길이가 0인 문자열을 의미하며 프로그래밍 언어에서 유효한 문자열로 취급되고, 0을 표현하거나 빈 줄을 나타내는 데 사용된다.
  • 문자열 - 문자열 연결
    문자열 연결은 프로그래밍 언어에서 문자열을 결합하는 연산으로, `+` 연산자나 별도의 연산자를 사용하며, 런타임 또는 컴파일 시점에 수행될 수 있고, 형식 언어 이론으로 확장되어 음성 합성 등 다양한 분야에서 활용된다.
문자열 검색 알고리즘

2. 역사적 배경

문자열 검색은 기본적으로 "대상 문자열"이라 불리는 긴 문자열 내에서 "검색 문자열"이라는 짧은 문자열을 찾는 것이다. 예를 들어, 주어진 문장에서 "to"라는 단어를 찾을 수 있다.

초기에는 단순한 문자열 검색이 주를 이루었지만, 점차 다양한 제약 조건이 추가되었다. 예를 들어, "to"처럼 완전한 단어만 검색하거나, "to be"와 같이 중간에 다른 문자가 있어도 검색 가능하게 하는 식이다.

여러 제약 조건은 다음과 같다.


  • 단어 단위 검색: "hew"나 "low"처럼 다른 문자와 붙어 있는 경우는 제외한다.
  • 정규화: "to"와 "be" 사이에 공백, 탭, 줄 바꿈 등이 있어도 검색한다.
  • 동의어 처리: 대소문자 구분 무시, 합자나 분음 부호 처리 등.
  • 자연어 처리: 대체 철자, 접사 등을 고려하여 검색한다.


더 복잡한 검색 방법으로는 정규 표현식이 있다. 예를 들어, "colou?r"는 "color"와 "colour"를 모두 찾을 수 있다.

생물 정보학 및 유전체학 분야에서는 최대 정확 일치(MEM) 문제가 도입되었다.[1] MEM은 두 문자열에서 확장 불가능한 공통 하위 문자열을 찾는 것이다.[2]

2. 1. 효율적인 알고리즘의 등장

유럽어와 같이 공백 문자로 구분되는 언어의 텍스트에 관해서는 효율적인 알고리즘이 알려져 있다. 그러나 일본어처럼 "어디서부터 어디까지 사전을 검색할 것인가"가 불분명한 경우에는, "어떤 바이트열에 대해, 부정 길이의 바이트열에 대한 검색을 수행"하는 작업이 필요하게 된다.

이러한 요구에 부응하는 것으로는 트리플 배열법 (및 트리플 배열법의 공간 효율을 개선하기 위해 개발된 더블 배열법)이 있지만, 지프의 법칙에 따라 "빈번하게 나타나는 바이트열에만 대처하면, 출현 빈도가 낮은 것에 대해서는 다른 (실행 효율이 낮은) 알고리즘을 사용하더라도 시스템 전체의 처리량에는 거의 영향을 미치지 않는다"는 경험칙이 있기 때문에, 트리플 배열법은 그다지 알려져 있지 않다.

3. 주요 알고리즘


  • 크누스-모리스-프랫 알고리즘
  • 보이어-무어 알고리즘
  • 퀵 서치 알고리즘: 보이어-무어 알고리즘의 변종 중 하나로, 가장 간단하고 빠르다.
  • 아호-코라식 알고리즘
  • 라빈-카프 알고리즘
  • 비트맵 알고리즘 (시프트-앤드, 시프트-오어 등으로도 알려짐) 외 비트 병렬 기법

3. 1. 단순 알고리즘 (Naive Algorithm)

하나의 문자열이 다른 문자열 안에 어디에 나타나는지 확인하는 간단하지만 비효율적인 방법은 각 인덱스에서 하나씩 확인하는 것이다. 먼저, 밀짚 더미(haystack)의 첫 번째 문자에서 시작하는 바늘(needle)의 복사본이 있는지 확인한다. 그렇지 않다면, 밀짚 더미의 두 번째 문자에서 시작하는 바늘의 복사본이 있는지 확인한다. 일반적인 경우, 잘못된 위치마다 한두 개의 문자만 살펴보면 잘못된 위치임을 알 수 있으므로, 평균적인 경우 이는 O(''n'' + ''m'') 단계가 걸린다. 여기서 ''n''은 밀짚 더미의 길이고 ''m''은 바늘의 길이다. 그러나 최악의 경우, "aaaaaaaaab"와 같은 문자열에서 "aaaab"와 같은 문자열을 검색하는 데에는 O(''nm'')이 걸린다.

다음 표에서 ''m''은 패턴의 길이, ''n''은 검색 가능한 텍스트의 길이, ''k'' = |Σ|는 알파벳의 크기를 나타낸다.

알고리즘전처리 시간매칭 시간[1]공간
단순 알고리즘없음평균 Θ(n+m),없음


3. 2. 크누스-모리스-프랫 알고리즘 (Knuth-Morris-Pratt Algorithm)

크누스-모리스-프랫 알고리즘은 검색할 문자열을 접미사로 갖는 입력을 인식하는 DFA를 계산한다.[8] 이 알고리즘은 전처리 시간으로 Θ(m)을, 매칭 시간으로 Θ(n)을, 공간 복잡도로는 Θ(m)을 가진다. 여기서 ''m''은 패턴의 길이, ''n''은 검색 가능한 텍스트의 길이를 의미한다.

다음 표는 크누스-모리스-프랫 알고리즘의 성능을 나타낸다.

알고리즘전처리 시간매칭 시간공간
크누스-모리스-프랫Θ(m)Θ(n)Θ(m)


3. 3. 보이어-무어 알고리즘 (Boyer-Moore Algorithm)

보이어-무어 알고리즘은 바늘(needle)의 끝에서부터 검색을 시작하므로, 일반적으로 각 단계마다 전체 바늘 길이만큼 건너뛸 수 있다.[8] 이 알고리즘은 실용적인 문자열 검색 문헌의 표준 벤치마크이다.

다음 표는 ''m''을 패턴의 길이, ''n''을 검색 가능한 텍스트의 길이, ''k'' = |Σ|를 알파벳의 크기로 정의하여 나타낸 것이다.

알고리즘전처리 시간매칭 시간공간
보이어-무어Θ(m + k)최선 Ω(n/m),
최악 O(mn)
Θ(k)



: 점근적 시간 복잡도는 O, Ω 및 Θ 표기법을 사용하여 표현된다.

코멘츠-월터 알고리즘은 보이어-무어 알고리즘을 확장한 것이다. 퀵 서치 알고리즘은 보이어-무어 알고리즘의 변종 중 하나로, 다양한 변종 중 가장 간단하고 빠르다.

3. 4. 라빈-카프 알고리즘 (Rabin-Karp Algorithm)

라빈-카프 알고리즘의 전처리 시간은 Θ(m)이며, 평균 매칭 시간은 Θ(n), 최악의 경우 O(mn)이다. 공간 복잡도는 O(1)이다.[1]

알고리즘전처리 시간매칭 시간공간
라빈-카프Θ(m)평균 Θ(n),
최악 O(mn)
O(1)


  • ''m''은 패턴의 길이, ''n''은 검색 가능한 텍스트의 길이를 나타낸다.


3. 5. 아호-코라식 알고리즘 (Aho-Corasick Algorithm)

아호-코라식은 전처리 시간 Θ(''m''), 매칭 시간 Θ(''n'' + ''o''), 공간 Θ(''m'')을 갖는다.[1] 여기서 ''M''은 가장 긴 패턴의 길이, ''m''은 전체 패턴의 길이, ''n''은 검색 가능한 텍스트의 길이, ''o''는 발생 횟수이다. 확장된 알고리즘은 크누스-모리스-프랫이다.

3. 6. 접미사 트리/배열 (Suffix Tree/Array)

더 빠른 검색 알고리즘은 텍스트를 사전 처리한다. 예를 들어, 접미사 색인 (접미사 트리 또는 접미사 배열)을 구축한 후, 패턴의 발생 위치를 빠르게 찾을 수 있다. 예를 들어, 접미사 트리는 \Theta(n) 시간에 구축될 수 있으며, 알파벳의 크기가 일정하고 접미사 트리의 모든 내부 노드가 자신 아래에 어떤 잎이 있는지 알고 있다는 가정 하에, 패턴의 모든 z번의 발생 위치를 O(m) 시간에 찾을 수 있다. 후자는 접미사 트리의 루트에서 깊이 우선 탐색(DFS) 알고리즘을 실행하여 수행할 수 있다.[1]

4. 한국어 특화 알고리즘

유럽어와 같이 공백 문자로 구분되는 언어의 텍스트에 관해서는 효율적인 알고리즘이 알려져 있다. 그러나 일본어처럼 "어디서부터 어디까지 사전을 검색할 것인가"가 불분명한 경우에는, "어떤 바이트열에 대해, 부정 길이의 바이트열에 대한 검색을 수행"하는 작업이 필요하게 된다.

이러한 요구에 부응하는 것으로는 트리플 배열법(및 트리플 배열법의 공간 효율을 개선하기 위해 개발된 더블 배열법)이 있지만, 지프의 법칙에 따라 "빈번하게 나타나는 바이트열에만 대처하면, 출현 빈도가 낮은 것에 대해서는 다른 (실행 효율이 낮은) 알고리즘을 사용하더라도 시스템 전체의 처리량에는 거의 영향을 미치지 않는다"는 경험칙이 있기 때문에, 트리플 배열법은 그다지 알려져 있지 않다.

5. 알고리즘 분류

유럽어와 같이 공백 문자로 구분되는 언어의 텍스트에 대해서는 효율적인 알고리즘이 알려져 있다. 그러나 일본어처럼 "어디서부터 어디까지 사전을 검색할 것인가"가 불분명한 경우에는, "어떤 바이트열에 대해, 부정 길이의 바이트열에 대한 검색을 수행"하는 작업이 필요하다.

이러한 요구에 부응하는 것으로는 트리플 배열법 (및 트리플 배열법의 공간 효율을 개선하기 위해 개발된 더블 배열법)이 있지만, 지프의 법칙에 따라, "빈번하게 나타나는 바이트열에만 대처하면, 출현 빈도가 낮은 것에 대해서는 다른 (실행 효율이 낮은) 알고리즘을 사용하더라도 시스템 전체의 처리량에는 거의 영향을 미치지 않는다"는 경험칙이 있기 때문에, 트리플 배열법은 그다지 알려져 있지 않다.

5. 1. 패턴의 수

다양한 알고리즘은 각 알고리즘이 사용하는 패턴의 수에 따라 분류할 수 있다.

5. 2. 전처리 여부

다른 분류 방법도 가능하다. 가장 일반적인 방법 중 하나는 전처리 과정을 거치는지에 따라 분류하는 것이다.

문자열 검색 알고리즘 분류[9]
텍스트를 전처리하지 않음텍스트를 전처리함
패턴을 전처리하지 않음기본 알고리즘색인 방법
패턴을 전처리함구성된 검색 엔진시그니처 방법[10]



유럽어와 같이 공백 문자로 구분되는 언어의 텍스트에 대해서는 효율적인 알고리즘이 알려져 있다. 그러나 일본어처럼 "어디서부터 어디까지 사전을 검색할 것인가"가 불분명한 경우에는, "어떤 바이트열에 대해, 부정 길이의 바이트열에 대한 검색을 수행"하는 작업이 필요하게 된다.

이러한 요구에 부응하는 것으로는 트리플 배열법 (및 트리플 배열법의 공간 효율을 개선하기 위해 개발된 더블 배열법)이 있지만, 지프의 법칙에 따라, "빈번하게 나타나는 바이트열에만 대처하면, 출현 빈도가 낮은 것에 대해서는 다른 (실행 효율이 낮은) 알고리즘을 사용하더라도 시스템 전체의 처리량에는 거의 영향을 미치지 않는다"는 경험칙이 있기 때문에, 트리플 배열법은 그다지 알려져 있지 않다.

5. 3. 매칭 전략

검색 전략에 따른 알고리즘 분류는 다음과 같다.[11]

  • 접두사 우선 일치: 크누스-모리스-프랫 알고리즘, 시프트-앤드 알고리즘, 아호-코라식 알고리즘
  • 접미사 우선 일치: 보이어-무어 알고리즘 및 그 변형, 코멘츠-월터 알고리즘
  • 최적 인자 우선 일치: BNDM, BOM, Set-BOM
  • 기타 전략: 단순 문자열 검색, 라빈-카프 알고리즘, 벡터화


유럽어와 같이 공백 문자로 구분되는 언어의 텍스트에 대해서는 효율적인 알고리즘이 알려져 있다. 그러나 일본어처럼 "어디서부터 어디까지 사전을 검색할 것인가"가 불분명한 경우에는, "어떤 바이트열에 대해, 부정 길이의 바이트열에 대한 검색을 수행"하는 작업이 필요하게 된다.

이러한 요구에 부응하는 것으로는 트리플 배열법 (및 트리플 배열법의 공간 효율을 개선하기 위해 개발된 더블 배열법)이 있지만, 지프의 법칙에 따라 "빈번하게 나타나는 바이트열에만 대처하면, 출현 빈도가 낮은 것에 대해서는 다른 (실행 효율이 낮은) 알고리즘을 사용하더라도 시스템 전체의 처리량에는 거의 영향을 미치지 않는다"는 경험칙이 있기 때문에, 트리플 배열법은 그다지 알려져 있지 않다.

6. 현대적 응용

문자열 검색은 컴퓨터 과학 분야에서 널리 사용되는 기술로, 다양한 응용 분야를 가지고 있다. 현대적인 응용 분야는 다음과 같다.


  • 텍스트 편집기 및 워드 프로세서: 텍스트 편집기와 워드 프로세서에서 특정 단어나 구문을 찾고 바꾸는 기능("찾기 및 바꾸기")은 문자열 검색 알고리즘을 기반으로 한다.
  • 검색 엔진: 검색 엔진은 방대한 웹 페이지에서 사용자가 입력한 검색어와 일치하는 문서를 찾기 위해 문자열 검색 알고리즘을 사용한다.
  • 데이터베이스 시스템: 데이터베이스 시스템에서 특정 레코드를 검색하거나, 특정 조건을 만족하는 데이터를 추출하는 데 문자열 검색 알고리즘이 사용된다.
  • 정규 표현식 검색: 정규 표현식을 사용하면 단순한 문자열뿐만 아니라, 특정한 패턴을 가진 문자열을 검색할 수 있다. 예를 들어, "colou?r"는 "color"와 "colour"를 모두 찾을 수 있는 정규 표현식이다.
  • 생물 정보학 및 유전체학: 생물 정보학 및 유전체학 분야에서 DNA 염기서열이나 단백질 서열에서 특정 패턴을 찾거나, 최대 정확 일치(MEM)를 찾는 데 문자열 검색 알고리즘이 활용된다.[1] 최대 정확 일치(MEM)는 두 문자열에서 불일치 없이 왼쪽이나 오른쪽으로 확장할 수 없는 공통 부분 문자열을 의미한다.[2]

참조

[1] 논문 Versatile and open software for comparing large genomes 2004
[2] 논문 A practical algorithm for finding maximal exact matches in large sequence datasets using sparse suffix arrays 2009-07-01
[3] 논문 Two-way string-matching http://monge.univ-ml[...] 2019-04-05
[4] 서적 Combinatorial Pattern Matching Springer Berlin Heidelberg 2019-11-22
[5] 서적 2009 Fourth International Conference on Internet Computing for Science and Engineering 2019-11-22
[6] 웹사이트 glibc/string/str-two-way.h https://code.woboq.o[...] 2022-03-22
[7] 웹사이트 musl/src/string/memmem.c http://git.musl-libc[...] 2019-11-23
[8] 논문 Fast String Searching
[9] 간행물 Text Searching Algorithms. Volume I: Forward String Matching https://web.archive.[...] Melichar, Borivoj, Jan Holub, and J. Polcar. Text Searching Algorithms. Volume I: Forward String Matching. Vol. 1. 2 vols., 2005. http://stringology.org/athens/TextSearchingAlgorithms/ 2016-03-04
[10] 간행물 Fast nGramBased String Search Over Data Encoded Using Algebraic Signatures http://www.cse.scu.e[...] 33rd International Conference on Very Large Data Bases (VLDB)
[11] 서적 Flexible Pattern Matching Strings: Practical On-Line Search Algorithms for Texts and Biological Sequences Cambridge University Press 2008
[12] conference A String Matching Algorithm Fast on the Average http://www.hs-albsig[...] Springer



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com