KR20120063879A - 다중 바이트 문자 집합 텍스트에서의 문자열 일치 검색 방법 - Google Patents

다중 바이트 문자 집합 텍스트에서의 문자열 일치 검색 방법 Download PDF

Info

Publication number
KR20120063879A
KR20120063879A KR1020100125043A KR20100125043A KR20120063879A KR 20120063879 A KR20120063879 A KR 20120063879A KR 1020100125043 A KR1020100125043 A KR 1020100125043A KR 20100125043 A KR20100125043 A KR 20100125043A KR 20120063879 A KR20120063879 A KR 20120063879A
Authority
KR
South Korea
Prior art keywords
pattern
byte
character
text
characters
Prior art date
Application number
KR1020100125043A
Other languages
English (en)
Other versions
KR101189617B1 (ko
Inventor
김은상
김진욱
박근수
Original Assignee
서울대학교산학협력단
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 서울대학교산학협력단 filed Critical 서울대학교산학협력단
Priority to KR1020100125043A priority Critical patent/KR101189617B1/ko
Publication of KR20120063879A publication Critical patent/KR20120063879A/ko
Application granted granted Critical
Publication of KR101189617B1 publication Critical patent/KR101189617B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F17/00Digital computing or data processing equipment or methods, specially adapted for specific functions
    • G06F17/10Complex mathematical operations

Landscapes

  • Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Theoretical Computer Science (AREA)
  • Mathematical Physics (AREA)
  • Data Mining & Analysis (AREA)
  • General Physics & Mathematics (AREA)
  • Mathematical Analysis (AREA)
  • Mathematical Optimization (AREA)
  • Computational Mathematics (AREA)
  • Pure & Applied Mathematics (AREA)
  • Databases & Information Systems (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Algebra (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

본 발명은 한글과 같은 다중 바이트 문자에 대하여 KMP 알고리즘, 또는 Sunday알고리즘 등에서 발생하는 오검색 문제를 해결할 수 있는 완전 일치 검색 알고리즘을 적용한 문자열 일치 검색 방법에 관한 것이다.

Description

다중 바이트 문자 집합 텍스트에서의 문자열 일치 검색 방법{Method for Searching String Matching on Multi-byte Character Set Texts}
본 발명은 문자열 일치 검색 방법에 관한 것으로서, 특히, 문자가 모두 1바이트인 영어와는 달리 한글과 같이 1개의 문자가 여러 바이트로 이루어져 있으며 문자에 따라 바이트의 길이가 달라질 수 있는 다중 바이트 문자에 대하여 KMP 알고리즘, 또는 Sunday알고리즘 등에서 발생하는 오검색 문제를 해결할 수 있는 완전 일치 검색 알고리즘을 적용한 문자열 일치 검색 방법에 관한 것이다.
문자열 완전 일치 검색(exact string matching) 문제는, 유한한 개수의 알파벳 Σ 개로 이루어진 텍스트 T 와 패턴 P가 주어졌을 때 텍스트 T 에서 패턴 P 가 존재하는 모든 위치를 찾는 문제이다. 문자열 완전일치 검색을 위해서 많은 알고리즘이 개발되었고, 이 알고리즘들은 3가지 접근방식으로 분류할 수 있다. KMP(Knuth-Morris-Pratt) 알고리즘과 같은 접두사 접근방식(Prefix-based approach), 보이어-무어(Boyer-Moore)알고리즘과 같은 접미사 접근방식(Suffix-based approach), 그리고 BOM(Backward Oracle Matching) 알고리즘과 같은 요소 접근방식(Factor-based approach)이 그 3가지다.
표준 ASCII 문자집합에서는 영어 알파벳, 숫자, 특수문자 등을 7 비트로 표현 가능하고, 그 외의 서양 언어특수 문자를 포함하더라도 8 비트로 표현할 수 있다. 그러나 한글, 중국어, 일본어 등은 훨씬 많은 문자(character)를 가지고 있으며, 이러한 언어의 문자 1개를 표현하기 위해서 2바이트(byte) 이상을 사용하게 되었다. 편의를 위해 기존의 ASCII 문자들을 1바이트로 표현하기 때문에, 하나의 텍스트에 1바이트 문자와 다중바이트(multi-byte) 문자가 공존하게 되었다. 예를 들면, UTF-8(Korean Extended-Unix-Code) 텍스트에서는 1바이트로 표현되는 ASCII 문자들과 2바이트로 표현되는 한글문자가 공존한다. 지금까지의 문자열 완전일치 검색 알고리즘들은 대부분 다중바이트 문자에 대한 고려가 없이 연구되었기 때문에, 다중바이트 문자를 포함한 문자열에 그대로 적용할 수 없는 문제가 있다. UTF-8 텍스트에서 기존의 문자열 완전일치 검색 알고리즘을 사용했을 때 오검색(false match)이 발생하는 것도 그 중의 한가지이다.
오검색 문제를 해결하기 위해서 다중바이트 문자집합의 DFA(Deterministic Finite Automata)와 Aho-Corasick 오토마타(Aho-Corasick Automata, AC Automata)를 결합한 방법이 제안되 왔으며, 패턴에 포함된 문자 단위로 bit-vector를 구성하여 bit-parallel shift-and 알고리즘을 적용한 방법도 연구된 바 있다. 조사한 바에 의하면, 다중바이트 문자집합을 위한 문자열 검색 알고리즘 중에서 문자 단위의 접미사 접근방식과 문자 단위의 요소 접근방식은 제안된 적이 없다. 그리고 실제로 널리 사용되고 있는 공개소스 편집기인 Vim과 Emacs에서는 오검색 문제를 해결하기 위해서 각각 Naive알고리즘을 사용하거나, 텍스트와 패턴을 UTF-8 인코딩으로 변환하여 Horspool[8] 알고리즘을 사용하고 있다.
현재까지의 오검색 문제를 해결하기 위한 알고리즘들은 검색 속도에 초점을 두지 않았으며, 오검색 문제를 해결하기 위해서는 텍스트를 전부 확인해야 하기 때문에 접두사 접근방식(prefix-based approach)알고리즘이 선호되었다. 그러나 기존의 문자열 검색 알고리즘 중에서는, 접미사 접근방식(suffix-based approach)이 접두사 접근방식에 비해 훨씬 더 빠른 속도를 보인다는 것이 Sunday알고리즘 등에서 알려져 있다.
본 발명에서는 한글과 같은 다중 바이트 문자에 대하여 KMP 알고리즘, 또는 Sunday알고리즘 등에서 발생하는 오검색 문제를 해결할 수 있는 완전일치 검색 알고리즘들을 제안하고자 한다.
따라서, 본 발명은 상술한 문제점을 해결하기 위한 것으로서, 본 발명의 목적은, 한글과 같은 다중 바이트 문자에 대하여 KMP 알고리즘, 또는 Sunday알고리즘 등에서 발생하는 오검색 문제를 해결할 수 있는 완전 일치 검색 알고리즘을 적용한 문자열 일치 검색 방법을 제공하는 데 있다.
먼저, 본 발명의 특징을 요약하면, 상기와 같은 본 발명의 목적을 달성하기 위한 본 발명의 일면에 따른, 문자열 일치 검색 장치에서 문자열 일치 검색 방법은, 다중 바이트로 이루어지는 복수의 문자들에 대한 코드들을 데이터베이스에 저장하는 단계; 및 상기 데이터베이스에 저장된 코드들을 기초로 입력 텍스트에 대한 해당 코드와 입력 패턴에 대한 해당 코드를 비교하여 상기 텍스트에 상기 패턴이 포함된 위치 정보를 제공하는 단계를 포함하고, 상기 위치 정보를 제공하는 단계에서 바이트 단위가 아닌 다중 바이트 문자 단위로 상기 텍스트에 상기 패턴에 포함된 문자와 일치하는 지 여부를 판단하여 해당 문자 길이만큼 상기 패턴을 이동시키면서 상기 텍스트에 상기 패턴이 포함된 위치를 검색하는 것을 특징으로 한다.
상기 위치 정보를 제공하는 단계는, 상기 패턴(P)의 문자열 P[1..q']의 접미사이면서 상기 텍스트와 일치하는 문자가 존재하는 상기 패턴의 가장 긴 접두사의 문자 길이(k')를 검색하기 위하여, 접두사 함수 π[q] = max{k : P[1..k]는 P[1..q]의 접미사이고, P[q]와 P[k]가 모두 1바이트 문자이거나 2바이트 문자의 두 번째 바이트}를 이용하여, π[q]=k(π[q]=k는 P[1..q]의 접미사이면서 텍스트와 일치하는 문자가 존재하는 패턴 P의 가장 긴 접두사의 바이트 길이(k)이고, P[q]와 P[k]가 모두 1바이트 문자이거나 2바이트 문자의 두 번째 바이트)를 검색하는 단계; 및 상기 π[q] 바이트만큼 상기 텍스트와 상기 패턴이 일치하도록 상기 패턴(P)을 q-π[q]만큼 문자 단위로 이동(shift)시키는 단계를 포함한다.
또한, 본 발명의 다른 일면에 따른, 문자열 일치 검색 장치에서 문자열 일치 검색 방법은, 다중 바이트로 이루어지는 복수의 문자들에 대한 코드들을 데이터베이스에 저장하는 단계; 및 상기 데이터베이스에 저장된 코드들을 기초로 입력 텍스트에 대한 해당 코드와 입력 패턴에 대한 해당 코드를 비교하여 상기 텍스트에 상기 패턴이 포함된 위치 정보를 제공하는 단계를 포함하고, 상기 위치 정보를 제공하는 단계에서 상기 텍스트에 상기 패턴에 포함된 문자와 일치하는 지 여부를 판단하여 소정 이동 테이블에 따라 상기 패턴을 이동시키면서 상기 텍스트에 상기 패턴이 포함된 위치를 검색하되, 해당 위치에서 상기 텍스트와 상기 패턴이 일치하면, 어떤 문자의 바이트 길이와 그 문자의 몇번째 바이트인지 여부가 미리 알려진 대표 바이트의 위치와 상기 패턴이 일치한 해당 위치와의 거리에 따라 상기 텍스트와 상기 패턴의 문자 단위 일치를 판단하는 것을 특징으로 한다.
상기 위치 정보를 제공하는 단계에서, 텍스트 T[j..j+m-1]과 패턴 P[1..m]가 일치한 경우, {(j-1)-z} mod 2=0인지 여부를 판단하여 상기 텍스트와 패턴의 문자 단위 일치 여부에 대한 정보를 제공하고, 여기서, z는 텍스트 T[j-1]부터 왼쪽으로 스캔해 가면서 처음 등장하는 대표 바이트를 포함한 문자를 Tz'이라고 할 때, Tz'의 마지막 바이트의 인덱스인 것을 특징으로 한다.
그리고, 본 발명의 또 다른 일면에 따른, 문자열 일치 검색 장치에서 문자열 일치 검색 방법은, 다중 바이트로 이루어지는 복수의 문자들에 대한 코드들을 데이터베이스에 저장하는 단계; 및 상기 데이터베이스에 저장된 코드들을 기초로 입력 텍스트에 대한 해당 코드와 입력 패턴에 대한 해당 코드를 비교하여 상기 텍스트에 상기 패턴이 포함된 위치 정보를 제공하는 단계를 포함하고, 상기 위치 정보를 제공하는 단계에서 상기 텍스트에 상기 패턴에 포함된 문자와 일치하는 지 여부를 판단하여 소정 문자 단위의 이동 테이블에 따라 해당 문자 단위의 길이만큼 상기 패턴을 이동시키면서 상기 텍스트에 상기 패턴이 포함된 위치를 검색하는 것을 특징으로 한다.
상기 위치 정보를 제공하는 단계에서, 문자 단위의 텍스트 Tj' .. j' + m' -1과 패턴 P1..m'을 비교하여 모두 일치할 경우, 텍스트(T)에 패턴(P)가 포함된 해당j'번째 위치에 대한 정보를 제공하는 것을 특징으로 한다.
상기 위치 정보를 제공하는 단계는, 상기 패턴(P)의 문자열 P[1..m]로부터 문자 단위 이동 테이블 Δ'[σ'] = min{m'-i'+1 : Pi' = σ'}(여기서, i'는 패턴에서 텍스트와 같은 문자 σ'가 위치하는 가장 우측의 인덱스 값)를 생성하는 단계; 및 Tj'+m'과 Pi'를 정렬시키되, Pi'는 Tj' + m'과 같으면서 패턴에서 가장우측에 위치한 문자가 되도록, Δ'[σ'] = Δ[T[j'+m']]의 값만큼 상기 패턴을 이동시키는 단계를 포함한다.
여기서, 2바이트의 상기 패턴의 문자를 41377(0xA1A1)~65278(0xFEFE) 사이의 정수(integer) 값으로 매핑하고 정수값의 σ'를 이용하여 처리하는 것을 특징으로 한다.
상기 테이블 Δ'[σ']로부터 상기 패턴의 k번째 바이트를 구분하여 각 바이트별로 생성한 문자 단위 이동 테이블 Δ'k[σ] = min{m-i+k : P[i] = σ이고P[i]는 P[i]를 포함한 문자의 k번째 바이트}(여기서, i는 패턴에서 텍스트와 같은 바이트 σ가 위치하는 가장 우측의 인덱스 값)에 기초하여 Δ'[Tj'+m']이 max{Δ'1[Tj'+m'[1]], Δ'2[Tj'+m'[2]]}(여기서, [1]은 해당 문자의 첫번째 바이트, [2]는 해당 문자의 두번째 바이트)되도록 상기 패턴을 이동하는 것을 특징으로 한다.
상기 테이블 Δ'[σ']로부터 상기 패턴의 k번째 바이트를 구분하여 각 바이트별로 생성한 문자 단위 이동 테이블 Δ'k[σ] = min{m-i+k : P[i] = σ이고P[i]는 P[i]를 포함한 문자의 k번째 바이트}(여기서, i는 패턴에서 텍스트와 같은 바이트 σ가 위치하는 가장 우측의 인덱스 값)에 기초하여 Δ'[Tj'+m']=Δ'2[Tj'+m'[2]](여기서, [2]는 해당 문자의 두번째 바이트)되도록 상기 패턴을 이동하는 것을 특징으로 한다.
상기의 문자들은 문자가 모두 1바이트로 이루어지는 언어는 제외하고, 1개의 문자가 복수 바이트로 이루어져 있으며 문자에 따라 바이트의 길이가 달라지는 언어(한글 등)를 포함한다.
본 발명에 따른 문자열 일치 검색 방법에 따르면, 한글과 같은 다중 바이트 문자에 대하여 KMP 알고리즘, 또는 Sunday알고리즘 등에서 발생하는 오검색 문제를 해결할 수 있다.
도 1은 본 발명의 일실시예에 따른 문자열 일치 검색 시스템을 설명하기 위한 도면이다.
도 2는 문자 코드 데이터베이스에 저장되는 문자들에 대한 UTF-8 등의 표준 코드들을 설명하기 위한 도면이다.
도 3은 UTF-8 문자열 바이트 순서의 일례이다.
도 4는 UTF-8 텍스트 상에서 발생하는 오검색의 일례이다.
도 5는 텍스트의 두번째 바이트부터 패턴과 비교하는 경우의 일례이다.
도 6은 텍스트의 두번째 바이트부터 패턴과 비교하는 경우의 다른 예이다.
도 7은 본 발명의 제1 알고리즘의 동작에서 접두사 함수 π'을 설명하기 위한 도면이다.
도 8은 본 발명의 제1 알고리즘의 동작에서 접두사 함수 π'의 수정을 설명하기 위한 도면이다.
도 9는 기존 KMP 알고리즘과 본 발명의 개선된 KMP 알고리즘 간의 접두사 함수를 비교 설명하기 위한 도면이다.
도 10은 본 발명의 제1 알고리즘의 실험 결과를 설명하기 위한 성능 비교 그래프이다
도 11은 기존 Sunday 알고리즘의 이동 테이블을 설명하기 위한 도면이다.
도 12는 기존 Sunday 알고리즘의 동작을 설명하기 위한 도면이다.
도 13은 기존 Sunday 알고리즘에서의 오검색 동기화를 설명하기 위한 도면이다.
도 14는 본 발명의 제2 알고리즘의 간단한 알고리즘의 동작을 설명하기 위한 도면이다.
도 15는 본 발명의 제2 알고리즘의 문자 단위의 처리 방식을 설명하기 위한 도면이다.
도 16은 본 발명의 제2 알고리즘의 이동 테이블을 설명하기 위한 도면이다.
도 17은 본 발명의 제2 알고리즘의 문자 단위 처리 방식을 설명하기 위한 도면이다.
도 18은 본 발명의 제2 알고리즘의 동작을 설명하기 위한 도면이다.
도 19는 본 발명의 제2 알고리즘의 실험 결과를 설명하기 위한 성능 비교 그래프이다.
이하 첨부 도면들 및 첨부 도면들에 기재된 내용들을 참조하여 본 발명의 바람직한 실시예를 상세하게 설명하지만, 본 발명이 실시예들에 의해 제한되거나 한정되는 것은 아니다.
도 1은 본 발명의 일실시예에 따른 문자열 일치 검색 장치(100)을 설명하기 위한 도면이다.
도 1을 참조하면, 본 발명의 일실시예에 따른 문자열 일치 검색 장치(100)는, 코드 추출부(110), 문자코드 데이터베이스(111), 및 일치 검색부(120)를 포함한다. 문자열 일치 검색 장치(100)의 위와 같은 구성 요소들은 소프트웨어, 하드웨어, 또는 이들의 조합으로 실현될 수 있으며, 어느 하나 이상의 구성 요소가 다른 구성요소에 포함되어 해당 기능이 실현되도록 할 수 있다.
본 발명의 일실시예에 따른 문자열 일치 검색 장치(100)는, 한글과 같은 다중 바이트 문자에 대하여 KMP 알고리즘, 또는 Sunday알고리즘 등에서 발생하는 오검색 문제를 해결하기 위하여, 아래에서 기술될 2가지 완전 일치 검색 알고리즘에 따라 한글과 같은 다중 바이트 문자에 대하여도 좀 더 정확히 문자열 완전 일치 검색이 이루어지도록 함으로써, 다양한 검색 시스템에 적용하여 텍스트(T)와 패턴(P) 간의 일치 여부에 대한 검색 결과를 제공할 수 있도록 한다. 예를 들어, 인터넷 검색 시스템에 이용되는 경우에는, 인터넷 상의 각 인터넷 서버에 관리되는 뉴스, 게시판, 쇼핑 정보, 블로그, 카페 등 인터넷 상에서 공유되어 검색될 수 있는 모든 텍스트 정보(제목, 내용 등의 정보에 포함된 단어, 구, 문장 등)가 위와 같은 텍스트(T)에 해당할 수 있고, 사용자가 검색창에 입력할 수 있는 검색어가 위와 같은 패턴(P)에 해당할 수 있다.
문자코드 데이터베이스(111)에는 도 2와 같은 다중 바이트 문자에 대한 코드가 저장된다. 이하에서 한글을 예로 들어 설명하지만, 이에 한정되는 것은 아니며 일본, 중국, 대만, 유니코드 등 다중 바이트 문자로 이루어지는 언어들에 유사하게 적용될 수 있다.
코드 추출부(110)는 문자코드 데이터베이스(111)를 참조하여 입력 텍스트(T)에 대한 해당 코드를 추출하며, 입력 패턴(P)에 대한 해당 코드를 추출할 수 있다. 일치 검색부(120)는 본 발명에 따른 입력 텍스트(T)에 대한 해당 코드와 입력 패턴(P)에 대한 해당 코드에 대하여 아래에서 기술될 2가지 알고리즘을 통해 완전 일치 검색을 수행하며 텍스트(T)에 패턴(P)가 포함된 모든 위치를 검색 결과로서 제공할 수 있다.
도 2는 문자 코드 데이터베이스(111)에 저장되는 문자들에 대한 UTF-8 등의 표준 코드들을 설명하기 위한 도면이다.
먼저, UTF-8은 KS X 1001 문자집합과 KS X 1003 문자집합을 사용하는, 대표적인 한글 완성형 인코딩 방식이다. 먼저, KS X 1003은 한국산업표준(KS)으로 지정된 "정보 교환용 부호(로마 문자)"이며, ASCII와 거의 동일한 문자집합이지만, 역슬래시(\)가 원화 기호(₩)로 바뀐 것만 다르다. 다음으로 KS X 1001은 한국산업표준으로 지정된 "정보 교환용 부호계(한글 및 한자)"이며, KS X 1001로 번호가 변경되기 전에는 KS C 5601이었다. KS X 1001은 0xA1A1~0xFEFE 사이의 영역에서 한글 2350자, 한자 4888자와 그 외 특수 문자 등을 표현하는 문자집합이다. 즉, UTF-8은 1바이트 문자집합인 KS X 1003을0x00~0x7F 사이의 영역에서 표현하며, 2바이트 문자집합인 KS X 1001을 0xA1A1~0xFEFE 영역에서 표현하게 된다. 예를 들어, "abc가나다"라는 문자열은 도 3과 같은 바이트 순서(byte sequences)의 코드를 갖게 된다.
이와 같이, 다중 바이트 문자 집합이란 문자1개를 표현하기 위해서1바이트 또는 2바이트 이상을 사용하는 문자집합이다. 영어나 서유럽어의 경우1바이트로 표현이 가능하지만, 한글, 중국어, 일본어 등 문자의 갯수가 256보다 많은 경우에는 문자 1개를 표현하기 위해서 2바이트 이상이 필요하다. 한글은 위와 같이 1바이트 문자집합인KS X 1003과 2바이트 문자 집합인KS X 1001을 표준으로 하여, 1바이트 문자와 2바이트 문자가 공존하는 다중바이트 문자집합을 이루게 된다. 이와 같이 문자집합에 속한 모든 문자들을 컴퓨터가 이해할 수 있도록 각각 유일한 코드값으로 인코딩하여 각각의 코드를 문자 코드 데이터베이스(111)에 저장할 수 있다.
도 2에서, 일본어 인코딩인EUC-JP는 JIS X 0201, JIS X 0208, JIS X 0212 문자집합을 매핑한다. ASCII와 동일한 JIS X 0201 문자집합의 하위 부분을 0x00~0x7E로 표현하며, JIS X 0201의 상위 부분을 2바이트로 표현하되 첫번째 바이트를 0x8E, 두번째 바이트를 0xA1~0xDF로 표현한다. 그리고, JIS X 0208은 UTF-8의KS X 1001매핑과 동일하게 첫번째 바이트와 두번째 바이트 모두 0xA1~0xFE로 표현한다. 마지막으로 JIS X0212는3바이트로 표현하며 첫번째 바이트를0x8F, 두번째와 세번째 바이트를0xA1~0xFE로 표현한다.
중국어 인코딩인 EUC-CN은 ASCII 문자와 GB2312 중국어 간체 문자집합을 매핑한다. UTF-8, EUC-JP와 동일하게 ASCII 문자를 0x00~0x7E로 표현하며, GB2312는 2바이트로 표현하며 첫번째 바이트는0xA1~0xF7, 두번째 바이트는0xA1~0xFE의 값을 가진다.
EUC-TW 인코딩은 중국어 정체 문자집합인 CNS 11643을 매핑한다. CNS 11643 문자집합은16개의 평면으로 구성되며 각 평면에94*94개의 한자를 포함하고 있다. EUC-TW은 ASCII 문자를 0x00~0x7E로 표현하며, 평면1의 94*94개의 한자를2바이트로 표현하며 첫번째 바이트와 두번째 바이트 모두0xA1~0xFE값을 가진다. 또한 다른 평면의 한자를 4바이트로 표현하되, 첫번째 바이트는 0x8E, 두번째 바이트는 0xA1~0xB0의 값으로 평면 번호를 나타내며, 세번째 바이트와 네번째 바이트는0xA1~0xFE 값을 갖는다.
한편, 전세계의 모든 문자를 하나의 문자집합에 표현하기 위해서 Unicode 가 정의되었으며, 이를 인코딩하는방식으로UTF-8, UTF-16, UTF-32등이 있다. UTF-8인코딩은 Unicode 문자를 1바이트에서 4바이트까지 인코딩하며, 도 2와 같이 Unicode 값이 00~7F 인 경우에 1바이트를 사용하여 표현하며, 하위 7비트에 00~7E 값을 적는다. Unicode 값이 80~7FF 인 경우에는 2바이트를 사용하여 표현하며, 첫번째 바이트의 중간 3비트에 0~7을, 첫번째 바이트의 하위 2비트와 두번째 바이트의 하위 6비트에 00~FF 값을 적어서 80~7FF 값을 표현한다. Unicode 값이800~FFFF 인 경우에는 3바이트를 사용하며, 첫번째 바이트의 하위 4비트와 두번째 바이트의 중간 4비트에 08~FF 값을, 두번째 바이트의 하위 2비트와 세번째 바이트의 하위 6비트에 00~FF를 적어서 800~FFFF 값을 표현한다. Unicode 값이 10000~10FFFF 인 경우에는 4바이트를 사용한다.
이하 이와 같이 한글 등의 다중 바이트 문자에 대한 코드가 저장된 문자코드 데이터베이스(111)를 참조하여, 일치 검색부(120)가 완전 일치 검색을 수행하는데 적용하는 2가지 알고리즘에 대하여 각각 배경지식과 동작, 및 해당 실험결과의 순서로 기술한다.
<제1 알고리즘의 배경지식>
UTF-8과 같은 다중 바이트 문자집합 텍스트 상에서 기존의 문자열 완전일치 검색 알고리즘을 사용하면 오검색(false match)이 발생할 가능성이 있다. 오검색이란, 텍스트 상에서는 실제로 해당 패턴이 존재하지 않지만 검색 알고리즘이 패턴이 존재한다고 결과를 출력하는 것을 말한다. 예를 들면, 텍스트가 '영도'(BFB5 B5B5)이고 '도'(B5B5)라는 패턴이 있는지를 검색한다고 하자. 1바이트 기반 문자열 검색 알고리즘에서는 텍스트를 BF B5 B5 B5 라는 4개의 바이트로 인식하고, 검색하고자 하는 패턴 문자열을 B5 B5라는 2개의 바이트로 인식하기 때문에 도 4와 같이 오검색을 하게 된다('영도'와 '도'는 동일하지 않음). 패턴의 첫 번째 문자의 첫 번째 바이트와 텍스트의 첫번째 문자의 두 번째 바이트가 일치하고, 패턴의 첫 번째 문자의 두 번째 바이트와 텍스트의 두 번째 문자의 첫 번째 바이트가 같아서 텍스트의 첫 번째 문자의 두번째 바이트 위치에서 오검색이 발생한 경우이다. UTF-8 인코딩은 2바이트 문자의 첫 번째 바이트와 두 번째 바이트를 모두 A1~FE 영역에서 표현하기 때문에, 패턴의 문자들이 모두 같은 영역에서 표현되는 경우에 패턴과 텍스트를 비교할 때 문자의 경계를 알 수 없게 됨으로 인해 오검색이 발생한다. 반면에, UTF-8과 같이 다중바이트 문자 인코딩의 첫 번째 바이트와 두 번째 이상의 바이트의 영역이 다른 경우에는 오검색이 발생하지 않는다.
다중 바이트 문자집합에서 오검색 문제를 해결하기 위한 기존의 연구 결과는 다음과 같다. 먼저 다중바이트 문자집합의 인코딩을 수용하는 DFA와 AC 오토마타를 결합하여 동기화와 검색을 동시에 수행하는 방법이 제안되었다. 또한, 패턴에 포함된 문자 단위로 Bit-vector를 구성하고 패턴에 포함된 문자들의 AC 오토마타를 사용하여 텍스트의 현재 문자가 패턴에 존재하는 문자인지를 검색하는 문자 단위 Bit-parallel Shift-and 알고리즘도 연구되었다. 그리고 Vim 편집기에서는 텍스트의 현재 문자와 패턴의 첫 번째 문자를 비교하는 작업을 계속 진행하다가 서로 같을 경우 C library의 strncmp() 함수를 사용하여 패턴의 길이만큼 바이트 순서가 일치하는지 검사하는 Naive 알고리즘을 사용하고 있다. Emacs편집기에서는 텍스트와 패턴을 UTF-8 인코딩으로 변환하여 오검색이 발생하지 않도록 한 후에 접미사 접근방식 중의 하나인 Horspool 알고리즘을 사용하고 있다. 이러한 오검색을 피하기 위해서는 기본적으로 패턴과 텍스트가 서로 문자 단위로 동기화(Synchronization)되었는지 확인하는 것이 필요하다. 동기화 여부를 확인하는 간단한 방법으로는, 패턴의 첫 번째 바이트와 비교하는 텍스트 상의 바이트가 어떤 문자의 첫 번째 바이트인지 확인하는 것이다. 그런데 동기화 여부를 확인하기 위해서는 텍스트를 처음부터 차례대로 읽어가면서 텍스트의 현재 바이트가 어떤 문자의 첫 번째 바이트인지 확인해야 하기 때문에 일반적으로 접두사 접근방식의 문자열 검색 알고리즘이 선호된다.
본 발명의 제1 알고리즘에서는 기존의 KMP 알고리즘을 문자 단위로 동작하도록 개선하여 동기화와 문자열 검색을 동시에 수행할 수 있도록 하였다.
먼저, 이하에서 사용되는 기호들의 의미는 다음과 같다. 텍스트 T의 길이를 n, 패턴 P의 길이를 m로 표기한다. T[i]는 텍스트 T 의 i번째 바이트를 의미하며, 동일하게 P[i]는 패턴 P의 i번째 바이트를 의미한다. 또한 |S|가 문자열 S의 바이트 길이이고 1 ≤ i ≤ j ≤ |S|인 조건 하에서, S[i..j]는 문자열 S의 부분 문자열 S[i]S[i+1]…S[j]을 의미한다. 그리고 Si는 문자열 S의 i번째 문자를, ||S||가 문자열 S의 문자 길이이고 1 ≤ i ≤ j ≤||S||인 조건 하에서 Si..j는 문자열 S의 부분 문자열 SiSi +1…Sj를 의미한다. UTF-8 텍스트에서는 1바이트 문자와 2바이트 문자가 공존하기 때문에, 바이트와 문자의 의미가 서로 다르다. 예를 들면, 도 3에서 5번째 문자는 '나'이지만, 5번째 바이트는 'A1'이다.
KMP 알고리즘은 접두사 함수(prefix function)를 사용하여 문자열이 존재하는 위치를 검색함으로써, Naive알고리즘에서 필요없는 비교 연산을 줄이도록 한 알고리즘이다. 접두사 함수 π는 π : {1,2,..,m} → {0,1,..,m-1}인 함수(1~m의 값에서 0~(m-1)로 가는 함수)이며, π[q] = max{k : P[1..k]는 P[1..q]의 접미사}로 표현할 수 있다. 즉, π는 P[1..q]의 접미사이면서 텍스트와 일치하는 바이트가 존재하는 패턴 P의 가장 긴 접두사의 길이를 의미한다. KMP 알고리즘의 흐름은 전처리(preprocessing) 과정에서 접두사 함수를 만들고, 검색(matching) 과정에서 접두사 함수를 사용하여 문자열이 존재하는 위치를 검색하게 된다. 어느 문자열에서 텍스트와 패턴이 q바이트만큼 일치하고 q+1번째 바이트가 서로 다른 바이트일 때(mismatch), 패턴을 q-π[q]만큼 이동(shift)하면 π[q] 바이트만큼 텍스트와 패턴이 일치하고 π[q]+1번째 바이트부터 다시 텍스트와 패턴을 비교하게 된다. KMP 알고리즘은 이 작업을 반복하여 검색 과정을 진행한다.
도 4와 같이 UTF-8 텍스트 상의 어떤 문자의 두번째 바이트부터 패턴과 비교하고 그 위치에서 패턴이 존재하는 경우에 오검색이 발생했던 것처럼, KMP 알고리즘에서도 이와 같은 현상이 발생한다. KMP 알고리즘에서 텍스트 상의 어떤 문자의 두 번째 바이트부터 패턴과 비교하게 되는 경우는 다음과 같이 2가지가 있다.
도 5는 텍스트의 두번째 바이트부터 패턴과 비교하는 경우의 일례이다. π[q] = k, k > 0일 때 (즉, P[1..k] = P[q-k+1..q]), P[q-k+1]이 어떤 문자의 두 번째 바이트인 경우이다. 예를 들어, 패턴이 '도시'(B5B5 BDC3) 라고 하자. 도 5와 같이 P[3](BD 위치)에서 T[i]와 미스매치가 발생하면 π[2] = 1(P[1..2]의 접미사이면서, π: {1,2,..,m} → {0,1,..,m-1}에 따라 P[2]부터 텍스트와 일치하는 바이트가 존재하는 패턴 P의 가장 긴 접두사의 길이는 1)이므로 패턴을 1바이트(q-π=1) 이동시킨다. 패턴을 이동시킨 후에 텍스트 T[i-1]이 P[1]과 정렬(align)되게 된다. 그런데 T[i-1]은 어떤 문자의 두번째 바이트이므로, 텍스트 상의 어떤 문자의 두 번째 바이트부터 패턴과 비교하는 경우가 된다.
도 6은 텍스트의 두번째 바이트부터 패턴과 비교하는 경우의 다른 예이다. π[q] = 0이어서 패턴의 첫 번째 바이트부터 텍스트와 비교할 때, 텍스트의 위치가 어떤 문자의 두 번째 바이트인 경우이다. 예를 들면, 패턴이 '도시'(B5B5BDC3)라고 하자. 텍스트와 패턴이 도 6과 같이 P[3]과 T [i]에서 미스매치가 발생하고, 패턴의 위치를 1 증가시켜서 비교하게 되는데, 이때 텍스트 상의 어떤 문자의 두 번째 바이트부터 패턴과 비교하는 경우가 된다.
위와 같은 2가지 경우에 KMP 알고리즘에서 오검색이 발생하며, 이를 피하기 위해서 동기화 작업이 추가로 필요하다.
<제1 알고리즘의 동작>
본 발명의 제1 알고리즘에서는 기존의 KMP 알고리즘에서 발생하는 오검색을 제거하기 위하여 문자 단위의 검색이 이루어지도록 개선하여 동기화와 문자열 검색을 동시에 수행할 수 있도록 하였다. 일치 검색부(120)는 문자코드 데이터베이스(111)를 참조하여 다음과 같은 제1 알고리즘에 따라 문자 단위의 검색 방식으로 완전 일치 검색을 수행할 수 있다. 제1 알고리즘에 따라 바이트 단위가 아닌 문자 단위로 검색을 하게 되면, 오검색이 발생하는 상황을 피할 수 있게 되며 동기화를 위해서 텍스트의 현재 바이트가 어떤 문자의 첫 번째 바이트인지 확인해야하는 작업이 불필요해진다.
도 7은 본 발명의 제1 알고리즘의 동작에서 접두사 함수 π'을 설명하기 위한 도면이다. 도 8은 본 발명의 제1 알고리즘의 동작에서 접두사 함수 π'의 수정을 설명하기 위한 도면이다.
문자 단위의 접두사 함수 π'은 π'[q'] = max{k': P1..k' 은 P1..q' 의 접미사}로 정의할 수 있다. 즉, π'[q']=k'는 P[1..q']의 접미사이면서 텍스트와 일치하는 문자가 존재하는 패턴 P의 가장 긴 접두사의 문자 길이(k')를 의미한다. 이를 도식화하면 도 7과 같으며, 패턴(P)의 각 문자는 Pq' - k' +1 = P1, Pq' - k' +2 = P2,.., Pq' = Pk' 이 된다. 기존의KMP 알고리즘의 접두사 함수는 바이트 단위로 정의되지만, 여기서는 새로운 접두사 함수 π'가 문자 단위를 기본으로 한다.
그런데, 위에서 정의한 문자 단위의 접두사 함수를 실제로 구현하기 위해서는 바이트 단위로 수정할 필요가 있다. UTF-8 텍스트에 적용하기 위해서 문자 단위의 접두사 함수를 바이트 단위로 수정해 보면, 접두사 함수 π'[q']는 π[q] = max{k : P[1..k]는 P[1..q]의 접미사이고, P[q]와 P[k]가 모두 1바이트 문자이거나 2바이트 문자의 두 번째 바이트}인 것으로 정의할 수 있다. UTF-8 문자집합은 1바이트 문자와 2바이트 문자의 바이트가 서로 다른 영역을 사용하는 특성을 가지고 있기 때문에, 1바이트 문자가 2바이트 문자의 바이트와 매치되는 경우가 발생하지 않는다. 그러므로 P[q-k+1..q] = P[1..k]이고P[q]와 P[k]가 같은 종류의 바이트(모두 1바이트 문자이거나 2바이트 문자의 두 번째 바이트)일 때 도 8과 같이 마지막 문자인 Pq'과 Pk'은 서로 같은 문자가 된다. 또한, 그 앞의 문자들도 자동적으로 매치가 된다. 즉, Pq' - k' +1 = P1, Pq' - k' +2 = P2,.., Pq' -1 = Pk' -1. 그러므로 위와 같이 접두사 함수를 수정하면, UTF-8 패턴 상에서 문자 단위 접두사 함수와 동일한 값을 갖게 된다.
도 9에서 위와 같이 개선된 KMP 알고리즘의 전처리 과정을 통해 생성된 패턴 '도도돈’(B5B5 B5B5 B5b7)의 접두사 함수를 확인할 수 있다. 개선된 KMP 알고리즘에서, 예를 들어, π[3]=0은, π: {1,2,..,m} → {0,1,..,m-1}에 따라 P[1..3]의 접미사이면서 텍스트와 일치하는 문자가 존재하는 패턴 P의 가장 긴 접두사의 문자 길이가 0을 의미하고, π[4]=2은, π: {1,2,..,m} → {0,1,..,m-1}에 따라 P[1..4]의 접미사이면서 텍스트와 일치하는 문자가 존재하는 패턴 P의 가장 긴 접두사의 문자 길이가 1(바이트 길이가 2)을 의미한다. 검색 과정에서는 문자 단위로 텍스트와 패턴을 비교하기 위해서, 텍스트 상에서 현재 비교하려는 바이트 T[i]가 1바이트 문자인 경우에는 1바이트만 비교하도록 하고, T[i]가 2바이트 문자의 첫 번째 바이트인 경우에 접두사 함수 비교는 2바이트(T [i]와 T [i+1])를 한꺼번에 패턴과 비교한다. UTF-8의 1바이트 문자는 0x00~0x7F 사이에서 정의되므로, T[i]≥0x80인지를 확인하면 T[i]가 2바이트 문자의 첫 번째 바이트인지 알 수 있다.
일치 검색부(120)의 동작을 정리하면,
(1) 일치 검색부(120)는 입력된 텍스트(T)와 패턴(P)의 코드를 비교하여, 문자 단위의 접두사 함수 π'[q'] = max{k': P1 .. k' 은 P1 .. q' 의 접미사}를 이용하여 π'[q']=k'를 찾는다. π'[q']=k'는 P[1..q']의 접미사이면서 텍스트와 일치하는 문자가 존재하는 패턴 P의 가장 긴 접두사의 문자 길이(k')를 의미한다. 이때, 이를 수정한 π[q] = max{k : P[1..k]는 P[1..q]의 접미사이고, P[q]와 P[k]가 모두 1바이트 문자이거나 2바이트 문자의 두 번째 바이트}를 이용하여, π[q]=k(π[q]=k는 P[1..q]의 접미사이면서 텍스트와 일치하는 문자가 존재하는 패턴 P의 가장 긴 접두사의 바이트 길이(k)이고, P[q]와 P[k]가 모두 1바이트 문자이거나 2바이트 문자의 두 번째 바이트)를 찾는다. 여기서, T[i]≥0x80인지를 확인하면 T[i]가 2바이트 문자의 첫 번째 바이트인지 알 수 있으므로, 이를 이용하여 P[q]와 P[k]가 모두 1바이트 문자이거나 2바이트 문자의 두 번째 바이트인지 여부도 알 수 있다.
(2) 일치 검색부(120)는 π[q] 바이트만큼 텍스트(T)와 패턴(P)이 일치하도록 패턴(P)을 q-π[q]만큼 문자 단위로 이동(shift)시켜 π[q]+1번째 바이트가 시작되는 문자부터 다시 텍스트(T)와 패턴(P)을 비교하여 해당 위치에서 텍스트(T)와 패턴(P)이 일치하는 지 여부를 판단한다. 판단 결과 해당 위치에서 텍스트(T)과 패턴(P)이 일치하지 않으면 일치 검색부(120)는 해당 위치에서 문자 단위의 접두사 함수 π'[q']=k'를 다시 찾는다.
(3) 일치 검색부(120)는 (2)의 과정을 반복하여 텍스트(T)에 패턴(P)가 포함된 위치를 모두 찾을 수 있으며, 해당 위치들에 대한 정보를 제공할 수 있다.
<제1 알고리즘의 실험결과>
도 10은 본 발명의 제1 알고리즘의 실험 결과를 설명하기 위한 성능 비교 그래프이다. 도 10에는, 본 발명의 제1 알고리즘(New KMP), UTF-8 DFA와오토마타를 결합한 PMM(Pattern Matching Machine), Vim 편집기, Emacs 편집기의 검색 알고리즘의 속도를 비교한 결과를 나타내었다. GNU/LINUX (Fedora Core 11) 2.6.29.6-217.2.3. 운영체제와 gcc 4.4.0 컴파일러를 사용하였으며, 2.4GHz Intel Core2Quad CPU Q6600과 8GB RAM이 장착된 시스템에서실험을 진행하였다. 도 10의 실험 데이터는 한글 웹사이트에서 모은 약 2000 페이지 중에서 script와 HTML tag등을 제외한 평문(약28MB)을 텍스트로 하고, 바이트 길이가 2, 4, 6, 8, 10,12, 18, 24, 30, 36, 42, 48, 54, 60인 문자열을 텍스트에서 랜덤하게 100개씩 추출하여 패턴으로 사용하였다. 14가지 길이의 패턴에 대하여 4가지 알고리즘이 각각 사용한 시간의 평균값을 도 10에 나타내었다. 4가지 알고리즘 중에서 New KMP 알고리즘이 속도가 가장 빠른 것을 확인할 수 있으며, Vim의 Naive 알고리즘에 비해서 약 20% 빠른 속도를 보였다. 한편, PMM 알고리즘의 속도가 느린 것은 오토마타를 계속해서 확인하고 그 state를 유지 및 변화시켜가는 추가비용으로 인한 것이며, Emacs의 알고리즘의 경우, UTF-8 텍스트를 UTF-8인코딩으로 변환하는 시간과 검색 시간을 합한 결과가New KMP 알고리즘보다 느린 것을 확인할 수 있었다.
<제2 알고리즘의 배경지식>
먼저, 기호들의 의미는 다음과 같다. 텍스트 T의 바이트 길이를 n, 패턴 P의 바이트 길이를 m으로 표기한다. T[i]는 텍스트 T의 i번째 바이트를 의미하며, 동일하게P[i]는 패턴P의 i번째 바이트를 의미한다. 또한 |S|가 문자열 S의 바이트 길이이고 1 ≤ i ≤ j ≤ |S|인 조건 하에서, S[i..j]는 문자열S의 부분문자열S[i]S[i+1]..S[j]을의 미한다. 그리고 Si는 문자열 S의 i번째 문자를 의미하며, ||S||가 문자열 S의 문자 길이이고, 1 ≤ i ≤j ≤ ||S||인 조건 하에서 Si ..j는 문자열 S의 부분 문자열SiSi +1.. Sj를 의미한다. Si[j]는 문자열S의i번째 문자 중에서 j번째 바이트를 가리킨다. 또한, 텍스트 T의 문자 길이를 n', 패턴P의 문자 길이를 m'으로 표기한다. 즉, ||T|| = n', ||P|| = m'이다. 다중 바이트 텍스트에서는 1바이트 문자와 2바이트 이상의 문자가 공존하기 때문에, 바이트와 문자의 의미가 서로 다르다. Sunday(또는Quick Search) 알고리즘은 Boyer-Moore(또는 BM) 알고리즘의 bad-character shift 와 good-suffix shift 중에서 bad-character shift만을 사용하여 검색을 진행하는 알고리즘이다. Sunday 알고리즘은 크게 전처리 과정과 검색과정으로 나뉘며, 검색과정은 다시 텍스트와 패턴의 매칭과 패턴 이동으로 나눌 수 있다. 이 과정은 다음과 같다.
1. 전처리 과정 : 패턴 P[1..m]을 한번 읽으면서 도 11과 같은 이동 테이블 Δ[σ] = min{m-i+1 : P[i] = σ}를 만든다. 즉, i는 패턴에서 σ(텍스트와 같은 바이트)가 위치하는 가장 우측의 인덱스 값이다. 패턴에 σ 가 존재하지 않는 경우(텍스트와 같은 바이트가 없는 경우)에는 Δ[σ] = m+1이다.
2. 검색 과정
(1) 텍스트와 패턴의 매칭 : 도 12와 같이 텍스트 T[j..j+m-1]과 패턴 P[1..m]을 비교한다고 하자. T[j+m-1]과P[m], T[j+m-2]와P[m-1],.., T[j]와P[1]까지 우측에서 좌측으로 매칭을 진행한다. 이때 모두 일치할 경우, 텍스트의 j번째 위치에 패턴이 존재한다고 출력한다.
(2) 패턴이동 : 텍스트와 패턴의 비교를 마친 후, Δ[T[j+m]]의 값만큼 패턴을 이동한다(j값을 Δ[T[j+m]]만큼 증가시킨다). 즉, T[j+m]과 P[i]를 정렬시키되, P[i]는 T[j+m]과 같으면서 패턴에서 가장우측에 위치한 바이트가 된다. 이렇게 패턴을 이동한 후, j≤n-m+1이면 다시 2-(1)의 과정을 진행한다.
BM 알고리즘 중에서 bad-character shift만을 사용하여 검색을 진행하는 방식은Horspool알고리즘에서 먼저 제안되었으나, Horspool알고리즘은 전처리 과정에서 이동테이블 Δ[σ] = min{m-i : P[i] = σ}를 만들고, 검색 과정에서T[j+m-1]을 기준으로 Δ[T[j + m -1]]만큼 패턴을 이동시킨다는 점이 다르다.
도 13은 기존 Sunday 알고리즘에서의 오검색 동기화를 설명하기 위한 도면이다.
특정 인코딩을 사용한 다중바이트 문자집합 텍스트 상에서 위와 같은 기존의 문자열 완전일치 검색 알고리즘을 사용하면 오검색(false match)이 발생할 가능성이 있다. 다중 바이트 텍스트 T는 일반적으로 n'<n이다. 즉, 텍스트 T의 문자길이가 바이트 길이보다 작으며, 어떤 문자는 2바이트 이상을 포함하기 때문이다. 패턴 P를 다중바이트 텍스트 T에서 검색할 때, 도 13과 같이 P[1..m] = T[i+1..i+m]이지만P1.. m' ≠ Ti' +1..i' + m'인 경우가 있을 수 있다. 이를 오검색이라고 한다. 즉, 오검색은, 어떤 위치 상에서 텍스트와 패턴의 바이트 순서(byte sequence)는 동일하지만 문자 순서(character sequence)는 달라서 실제로 패턴이 그 위치에 존재하지 않으나 검색 알고리즘은 패턴이 그 위치에 존재한다고 출력하는 것을 말한다. 이와 같이 UTF-8 인코딩은 2바이트 문자의 첫번째 바이트와 두번째 바이트를 모두0xA1~0xFE영역에서 표현하기 때문에, 패턴의 문자들이 모두2바이트인 경우에 텍스트와 패턴의 바이트 순서가 모두 일치하더라도 문자 순서가 일치하는지 알 수 없어서 오검색이 발생할 가능성이 존재한다.
<제2 알고리즘의 동작>
위와 같은 오검색을 피하기 위하여, 패턴과 텍스트가 서로 문자 단위로 동기화(Synchronization)되었는지 확인하는 것이 필요하다. 즉P[i..m] = T[i+1..i+m]일때, 1≤j'≤m'인 모든 j'에 대하여 Pj' = Ti' + j'인지 확인한다. 그런데P[i..m] = T[i+1..i+m]이므로1≤j'≤m'인 어떤 j'에 대하여 Pj' = Ti' + j'이면 Pj'-1 = Ti' + j' -1, Pj' +1 = Ti' + j' +1이고, 모든 j'에 대하여 Pj'=Ti' + j'임을 알 수 있다. 그러므로, 패턴과 텍스트의 바이트 순서가 일치하였을 때 1개의 문자만 동기화되었는지 확인하면 오검색 여부를 판단할 수 있다. 또한 Pj'과 Ti' + j'의 동기화 여부는 문자 Pj'에 포함된 바이트 P[j]와 문자 Ti' + j'에 포함된 바이트 T[i+j]가 각각 문자 Pj'과 Ti' + j'에서 동일한 위치(1바이트 문자인지 또는 2바이트의 첫번째/두번째 바이트)에 있는 바이트인지 확인함으로써 알 수 있다.
한편, EUC 인코딩 텍스트에서 패턴을 찾고자 할 때, 패턴에 1바이트 문자나 3바이트 문자(EUC-JP), 또는 4바이트문자(EUC-TW)가 존재하면 오검색이 발생하지 않는다. 또한UTF-8인코딩 텍스트에서도 오검색이 발생하지 않는다. 바이트 S[i]가 문자 Si'의 어느 한 바이트라고 할 때, S[i]값을 보고 Si'의 바이트 길이와 S[i]가 Si'의 몇번째 바이트인지 알 수 있다면, S[i]를 대표 바이트(Representative byte)라고 하자. 예를 들어서, 0x00≤S[i]≤0x7F이면 Si'은 1바이트 문자라는 것을 알 수 있고 S[i]가 Si'의 첫번째 바이트라는 것을 알 수 있으므로 S[i]는 대표 바이트가 된다. 0xA1≤S[i]≤0xFE라면, Si'은 2바이트 문자라는 것을 알 수 있으나 S[i]가 몇 번째 바이트인지 알 수 없으므로 대표 바이트가 될 수 없다. UTF-8인코딩에서는S[i]의 상위k+1비트가1k0이라면(2≤k≤4), Si'은k바이트 문자이며S[i]는 Si_의 첫번째 바이트라는 것을 알 수 있기 때문에 S[i]는 대표 바이트가 된다. EUC 인코딩의 1바이트 문자, 0x8E로 시작하는 2바이트 문자(EUC-JP), 그리고 3바이트 문자(EUC-JP)는 대표바이트를 가지고 있으며, UTF-8인코딩은1바이트 문자부터 4바이트 문자까지 모든 문자가 대표 바이트를 가지고 있다.
P[1..m] = T[i+1..i+m]일 때, P[j]가 대표 바이트라고 하자. P[j] = T[i+j]이고, 대표바이트는 항상 문자의 특정 위치(EUC 인코딩과 UTF-8 인코딩에서는 첫번째 위치)에 있기 때문에P[j]와T[i+j]는 서로 같은 종류의 바이트가 된다. 그러므로 P[j]를 포함하는 문자 Pj'과 T[i+j]를 포함하는 Ti'+j'은 서로 동기화가 되었다는 것을 알 수 있으며, 이는 패턴이 대표 바이트를 포함하는 경우에 오검색이 발생하지 않는다는 것을 의미한다.
도 14는 본 발명의 제2 알고리즘의 간단한 알고리즘(New Sunday)의 동작을 설명하기 위한 도면이다.
위에서 기술한 바와 같이 EUC인코딩 텍스트 중에서 패턴을 검색할 때, 패턴이 대표 바이트가 없는 2바이트 문자로만 이루어진 경우에 기존의 문자열 검색 알고리즘을 사용하면 오검색이 발생할 수 있다. 그러므로1바이트, 3바이트, 또는4바이트 문자들이 패턴에 포함된 경우에는 기존의 문자열 검색 알고리즘을 사용하더라도 오검색이 발생하지 않는다.
패턴이 대표 바이트가 없는 2바이트 문자로만 이루어진 경우에도, 일치 검색부(120)는 하기와 같은 간단한 알고리즘(New Sunday)을 통해 패턴이 발견되는 위치에서 텍스트와 패턴이 동기화 되었는지 확인할 수 있다. 즉, 위의 2-(1)에서 기술한 바와 같이 Sunday 알고리즘의 과정에서 패턴을 찾은 경우에 텍스트와 패턴의 동기화 여부를 확인한다. 동기화 여부를 확인하기 위해서T[j]의 바이트가2바이트 문자의 첫번째 바이트인지 확인한다. 이를 위해서T[j-1]부터 왼쪽으로 대표 바이트가 나올 때까지 텍스트를 살펴본다. 도 14와 같이 T[j-1]부터 왼쪽으로 스캔해 가면서 처음 등장하는 대표 바이트를 포함한 문자를 Tz'이라고 하자. 그리고 Tz'의 마지막 인덱스를z라고 하자. (T[1]까지 살펴봐도 대표 바이트를 찾지 못한 경우에는 z = 0이 된다.) 텍스트의 인덱스 j-1과 z + 1 사이에는 대표 바이트가 존재하지 않으므로, 모두 0xA1~0xFE 사이의 값을 가지며, 모두 2바이트 문자의 바이트들이 된다. 그러므로, {(j-1)-z}mod 2=0이면 T[j]은 2바이트 문자의 첫번째 바이트임을 알 수 있다.
일치 검색부(120)의 간단한 알고리즘(New Sunday Simple)의 동작을 정리하면,
(1) (전처리 과정) 일치 검색부(120)는 입력된 텍스트(T)와 패턴(P)의 코드를 비교하여, 전처리 과정으로서, 패턴 P[1..m]을 한번 읽으면서 도 11과 같은 이동 테이블 Δ[σ] = min{m-i+1 : P[i] = σ}를 만든다. 즉, i는 패턴에서 σ(텍스트와 같은 바이트)가 위치하는 가장 우측의 인덱스 값이다. 패턴에 σ 가 존재하지 않는 경우(텍스트와 같은 바이트가 없는 경우)에는 Δ[σ] = m+1이다.
(2) (패턴 매칭) 일치 검색부(120)는 텍스트 T[j..j+m-1]과 패턴 P[1..m]을 비교하여, 모두 일치할 경우, 텍스트(T)에 패턴(P)가 포함된 해당 위치에 대한 정보(j번째 위치)를 제공할 수 있다. 이때, T[j+m-1]과P[m], T[j+m-2]와P[m-1],.., T[j]와P[1]까지 우측에서 좌측으로 매칭을 진행하여 모두 일치하는 것으로 판단한 경우이다. 다만, 일치 검색부(120)는 {(j-1)-z}mod 2=0인지 여부를 판단하여 T[j]가 2바이트 문자의 첫번째 바이트임 확인하고 j번째 위치에 패턴이 포함된 것으로 판단한다. 여기서, z는 텍스트 T[j-1]부터 왼쪽으로 스캔해 가면서 처음 등장하는 대표 바이트를 포함한 문자를 Tz'이라고 할 때, Tz'의 마지막 인덱스이다. 예를 들어, 한글의 경우에 0x00≤S[i]≤0x7F이면 Si'은 1바이트 문자라는 것을 알 수 있고 S[i]가 Si'의 첫번째 바이트라는 것을 알 수 있으므로 S[i]는 대표 바이트가 된다.
(3) (패턴 이동) 일치 검색부(120)는 (2)의 과정에서 일치 하지 않는 것으로 판단한 경우에, Δ[σ] = Δ[T[j+m]]의 값만큼 패턴을 이동한다(j값을 Δ[T[j+m]]만큼 증가시킨다)(도 12 참조). 즉, T[j+m]과 P[i]를 정렬시키되, P[i]는 T[j+m]과 같으면서 패턴에서 가장우측에 위치한 바이트가 된다. 이렇게 패턴을 이동한 후, j≤n-m+1이면 다시 (2)의 과정을 진행한다.
(4) 일치 검색부(120)는 (3)의 과정을 반복하여 텍스트(T)에 패턴(P)가 포함된 위치를 모두 찾을 수 있으며, 해당 위치들에 대한 정보를 제공할 수 있다.
이하 본 발명의 제2 알고리즘의 문자 단위의 처리 방식을 설명한다.
도 15는 본 발명의 제2 알고리즘의 문자 단위의 처리 방식을 설명하기 위한 도면이다.
위와 같은 간단한 알고리즘(New Sunday)의 문제는 텍스트에 대표 바이트가 거의 존재하지 않을 때 (텍스트의 거의 대부분이 2바이트 문자로 이루어져 있을 때), 동기화를 확인하기 위해서 텍스트를 스캔하여 확인하는 비용이 너무 크게 발생한다는 것이다. 그러므로 이 문제를 해결하기 위해서는 검색과정을 진행하면서, 현재까지 가장 우측에 존재하는 어떤 문자의 마지막 바이트 z의 위치를 계속 갱신해야 한다. z값을 갱신하기 위해서, 패턴을 이동할 때마다 도 15와 같이 T[j+m-1]부터 왼쪽으로 스캔하면서 이전의z보다 크면서T[z-l+1]이 대표 바이트인 새로운 z값을 찾는다. l은 T[z]를 포함하는 문자 Tz'의 바이트 길이이다.
앞에서처럼 T[z+1]부터 T[j+m-1]까지는 모두 0xA1~0xFE 사이의 값을 가지며, {(j+m-1)-z} mod 2=0이면 T[j+m-1]은 어떤 문자의 마지막 바이트임을 알 수 있다. 그러므로 T[j+m]값을 확인하고 T[j+m]을 포함하는 문자 Tj' + m'의 마지막 바이트를 새로운 z값으로 갱신한다. 나머지가 1인 경우에는T[j+m-1]이 어떤 문자의 첫번째 바이트이며, z값을 T[j + m - 1]을 포함한 문자의 바지막 바이트의 위치로 갱신한다.
한편, 이동 테이블을 문자 단위로 구성할 경우 2가지 장점이 있다. 먼저, 패턴에 동일한 바이트가 존재할 확률보다 동일한 문자가 존재할 확률이 더 적기 때문에 이동 테이블을 바이트 단위로 구성했을 때보다 값을 더 크게 할 수 있다. 다음으로, 문자 단위의 이동 테이블을 사용해서 패턴을 이동할 경우에는 해당 문자의 위치에서 자동으로 동기화가 되기 때문에 패턴이 일치할 경우에 추가로 동기화를 확인할 필요가 없다는 것이다. 그런데 문자 단위로 패턴을 이동할 경우에는, T[j+m]을 포함한 문자 T[j'+m']의 경계를 정확히 알아야 하는 단점이 존재한다. 그런데 z값을 계속 갱신하는 과정에서 T[j+m-1]이 어떤 문자의 몇번째 바이트인지 확인할 수 있고, T[j+m]을 포함한 문자 Tj'+m'의 바이트 길이와 마지막 바이트의 위치를 알 수 있다.
일치 검색부(120)의 문자 단위 처리 방식을 정리하면,
(1) (전처리 과정) 일치 검색부(120)는 입력된 텍스트(T)와 패턴(P)의 코드를 비교하여, 전처리 과정으로서, 패턴 P[1..m]을 한번 읽으면서 도 16과 같은 문자 단위 이동 테이블 Δ'[σ'] = min{m'-I'+1 : Pi' = σ'}를 만든다. 즉, i'는 패턴에서 문자 σ'(텍스트와 같은 문자)가 위치하는 가장 우측의 인덱스 값이다.
문자 단위의 이동 테이블 Δ'는 다음과 같이 3가지로 구현될 수 있다. 첫번째(New Sunday 1)는, 2바이트 문자를 41377(0xA1A1)~65278 (0xFEFE) 사이의 정수(integer) 값으로 매핑하여 σ'에 대하여 정수값이 나오는 Δ'을 구현할 수 있다.
두번째(New Sunday2)는, 위와 같이 정의한 문자 단위의 이동 테이블 Δ'을 2개의 이동 테이블 Δ'k(Δ'1, Δ'2)로 구분하여 만들어 구현할 수 있다. Δ'k는2개의 이동테이블 중에서k번째 이동테이블을 의미하며, 패턴에 포함된 문자들의k번째 바이트들로 만들어진다. 즉, Δ'k[σ] = min{m-i+k : P[i] = σ이고P[i]는 P[i]를 포함한 문자의 k번째 바이트}이다. Δ'[Tj'+m']은max{Δ'1[Tj'+m'[1]], Δ'2[Tj'+m'[2]]}으로 계산한다.
세번째(New Sunday3)는, New Sunday 2의 방법에서 하위 바이트즉, 2번째 바이트로 생성한 이동 테이블 Δ'2만을 사용하는 것이다. 즉 Δ'[Tj'+m']=Δ'2[Tj'+m'[2]]가 된다. 하기 패턴이동 과정(3)에서Tj'+m'가2바이트 문자가 아닌 경우에는m+|Tj'+m'| 만큼 이동시키게 된다.
이와 같은 세가지 방법 중 첫번째에서 세번째로 갈 수록 이동 테이블을 저장하는 메모리는 줄어들지만, 이동량도 줄어들게 된다. 또한 첫번째와 두번째 방법은 각각 2바이트 문자를 integer로 매핑하는 것과 max를 취하는 것에서 추가비용이 발생할 수 있다.
(2) (패턴 매칭) 일치 검색부(120)는 텍스트 Tj' .. j' + m' -1과 패턴 P1 .. m'을 비교하여(도 17 참조), 모두 일치할 경우, 텍스트(T)에 패턴(P)가 포함된 해당 위치에 대한 정보(j'번째 문자 위치)를 제공할 수 있다. 이때, Tj' + m' -1과Pm', Tj' + m' -2와Pm' -1,.., Tj'와P1까지 우측에서 좌측으로 매칭을 진행하여 모두 일치하는 것으로 판단한 경우이다.
(3) (패턴 이동) 일치 검색부(120)는 (2)의 과정에서 일치 하지 않는 것으로 판단한 경우에(Tj' + m' -1의 마지막 바이트와 Pm'의 마지막 바이트가 일치되지 않은 경우) 패턴을 재정렬하면서 z값을 Tj' + m'의 마지막 바이트의 위치로 갱신하도록, Δ'[σ'] = Δ[T[j'+m']]의 값만큼 패턴을 이동한다(j'값을 Δ'[T[j'+m']]만큼 증가시킨다)(도 17 참조). 즉, Tj' + m'과 Pi'를 정렬시키되, Pi'는 Tj' + m'과 같으면서 패턴에서 가장우측에 위치한 문자가 된다. 이렇게 패턴을 이동한 후, j'≤n'-m'+1이면 다시 (2)의 과정을 진행한다.
(4) 일치 검색부(120)는 (3)의 과정을 반복하여 텍스트(T)에 패턴(P)가 포함된 위치를 모두 찾을 수 있으며, 해당 위치들에 대한 정보를 제공할 수 있다.
한편, 위와 같은 패턴 매칭 과정(2)에서, 텍스트Tj' .. j' + m' -1과P1 .. m'의 매칭은T[j..j+m-1]과P[1..m]을 바이트 단위로 우측에서 좌측으로 매칭해보면 확인할 수 있다. 매칭이 모두 일치할 경우에는, 이동 테이블을 통해서 문자 단위로 텍스트와 패턴을 정렬시켰으므로 이미 동기화가 되어 있음을 알 수 있다. 그러므로 텍스트의 j번째 바이트 위치에서 패턴이 존재한다고 출력한다.
그런데 미스매치가 발생한 경우에는, Tj' + i'과 Pi'은 이미 동기화되었으나(도 18 참조), 텍스트 Tj' + i' +1.. j' + m' -1 상에서 2바이트 문자가 아닌 다른 길이의 문자가 존재할 때 Tj' + m' -1의 마지막 바이트와 Pm'의 마지막 바이트가 정렬되지 않을 수 있다. 이를 수정하기 위해서 텍스트의 바이트T[j+m-1]이 어떤 문자의 마지막 바이트인지 확인하고, 마지막 바이트가 아닌 경우(예를 들어, 도 18과 같이 첫번째 바이트)에 패턴을 재정렬하는 추가적인 작업이 필요할 수 있다. 앞에서 설명했던 z값을 갱신하는 과정에서 T[j+m-1]이 T[j+m-1]을 포함한 문자의 몇번째 바이트인지 알 수 있으므로, T[j+m-1]이 j번째 바이트라고 할 때 패턴을 왼쪽으로 j만큼 이동시키면 된다.
<제2 알고리즘의 실험결과>
도 19는 본 발명의 제2 알고리즘의 실험 결과를 설명하기 위한 성능 비교 그래프이다. 도 19에는, Vim 편집기, Emacs편집기의 검색 알고리즘과, 문자 단위 KMP 알고리즘(New KMP), 문자 단위 Sunday 알고리즘(New Sunday Simple, New Sunday1, New Sunday2, New Sunday3)의 처리 속도에 대한 비교 결과를 나타내었다. 실험 데이터는 한글 웹사이트에서 모은 약 2000 페이지중에서 script와 HTML tag등을 제외한 UTF-8 평문(약28MB)을 텍스트로 하고, 바이트 길이가 2, 4, 6, 8, 10, 12,18, 24, 30, 36, 42, 48, 54, 60인 문자열을 텍스트에서 랜덤하게100개씩 추출하여 패턴으로 사용하였다. 14가지 길이의 패턴에 대하여4가지 알고리즘이 각각 사용한 시간의 평균값을 나타낸다. 도 19에서 대표 바이트를 포함한 문자들이 많을 경우에z값을 계속 유지 및 갱신하는 추가비용이 발생하지 않는New Sunday Simple알고리즘의 속도가 가장 빠르다는 것을 확인할 수 있으며, 다음으로 빠른 알고리즘은 New Sunday1~3의 3가지로 거의 동일한 속도를 보였다. 한편, 패턴의 길이가 길어질 수록 제안된 알고리즘들(New Sunday Simple, New Sunday1, New Sunday2, New Sunday3)과 New KMP 알고리즘과의 속도 차이는 크게 벌어졌다. New KMP알고리즘은 접두사 접근 방식이기 때문에 텍스트의 모든 바이트를 1번 이상씩 읽게 되지만, New Sunday 알고리즘은 접미사 접근 방식에 기반하여 패턴이 길어질 수록 이동 테이블에 의해 패턴이 이동하는 거리가 커지고 이에 따라 읽지 않고 건너뛰는 텍스트의 길이가 길어져서 훨씬 빠른 속도를 보였다. Emacs의 알고리즘의 경우, UTF-8텍스트를 UTF-8 인코딩으로 변환하는 시간과 검색 시간을 합한 결과가 4개의 알고리즘 중에서 가장 느린 것을 확인할 수 있었다.
이상과 같이 본 발명은 비록 한정된 실시예와 도면에 의해 설명되었으나, 본 발명은 상기의 실시예에 한정되는 것은 아니며, 본 발명이 속하는 분야에서 통상의 지식을 가진 자라면 이러한 기재로부터 다양한 수정 및 변형이 가능하다. 그러므로, 본 발명의 범위는 설명된 실시예에 국한되어 정해져서는 아니 되며, 후술하는 특허청구범위뿐 아니라 이 특허청구범위와 균등한 것들에 의해 정해져야 한다.
문자열 일치 검색 장치(100)
코드 추출부(110)
문자코드 데이터베이스(111)
일치 검색부(120)

Claims (11)

  1. 문자열 일치 검색 장치에서 문자열 일치 검색 방법에 있어서,
    다중 바이트로 이루어지는 복수의 문자들에 대한 코드들을 데이터베이스에 저장하는 단계; 및
    상기 데이터베이스에 저장된 코드들을 기초로 입력 텍스트에 대한 해당 코드와 입력 패턴에 대한 해당 코드를 비교하여 상기 텍스트에 상기 패턴이 포함된 위치 정보를 제공하는 단계를 포함하고,
    상기 위치 정보를 제공하는 단계에서 바이트 단위가 아닌 다중 바이트 문자 단위로 상기 텍스트에 상기 패턴에 포함된 문자와 일치하는 지 여부를 판단하여 해당 문자 길이만큼 상기 패턴을 이동시키면서 상기 텍스트에 상기 패턴이 포함된 위치를 검색하는 것을 특징으로 하는 문자열 일치 검색 방법.
  2. 제1항에 있어서,
    상기 위치 정보를 제공하는 단계는,
    상기 패턴(P)의 문자열 P[1..q']의 접미사이면서 상기 텍스트와 일치하는 문자가 존재하는 상기 패턴의 가장 긴 접두사의 문자 길이(k')를 검색하기 위하여, 접두사 함수 π[q] = max{k : P[1..k]는 P[1..q]의 접미사이고, P[q]와 P[k]가 모두 1바이트 문자이거나 2바이트 문자의 두 번째 바이트}를 이용하여, π[q]=k(π[q]=k는 P[1..q]의 접미사이면서 텍스트와 일치하는 문자가 존재하는 패턴 P의 가장 긴 접두사의 바이트 길이(k)이고, P[q]와 P[k]가 모두 1바이트 문자이거나 2바이트 문자의 두 번째 바이트)를 검색하는 단계; 및
    상기 π[q] 바이트만큼 상기 텍스트와 상기 패턴이 일치하도록 상기 패턴(P)을 q-π[q]만큼 문자 단위로 이동(shift)시키는 단계
    를 포함하는 것을 특징으로 하는 문자열 일치 검색 방법.
  3. 문자열 일치 검색 장치에서 문자열 일치 검색 방법에 있어서,
    다중 바이트로 이루어지는 복수의 문자들에 대한 코드들을 데이터베이스에 저장하는 단계; 및
    상기 데이터베이스에 저장된 코드들을 기초로 입력 텍스트에 대한 해당 코드와 입력 패턴에 대한 해당 코드를 비교하여 상기 텍스트에 상기 패턴이 포함된 위치 정보를 제공하는 단계를 포함하고,
    상기 위치 정보를 제공하는 단계에서 상기 텍스트에 상기 패턴에 포함된 문자와 일치하는 지 여부를 판단하여 소정 이동 테이블에 따라 상기 패턴을 이동시키면서 상기 텍스트에 상기 패턴이 포함된 위치를 검색하되, 해당 위치에서 상기 텍스트와 상기 패턴이 일치하면, 어떤 문자의 바이트 길이와 그 문자의 몇번째 바이트인지 여부가 미리 알려진 대표 바이트의 위치와 상기 패턴이 일치한 해당 위치와의 거리에 따라 상기 텍스트와 상기 패턴의 문자 단위 일치를 판단하는 것을 특징으로 하는 문자열 일치 검색 방법.
  4. 제3항에 있어서,
    상기 위치 정보를 제공하는 단계에서,
    텍스트 T[j..j+m-1]과 패턴 P[1..m]가 일치한 경우, {(j-1)-z}mod 2=0인지 여부를 판단하여 상기 텍스트와 패턴의 문자 단위 일치 여부에 대한 정보를 제공하고,
    여기서, z는 텍스트 T[j-1]부터 왼쪽으로 스캔해 가면서 처음 등장하는 대표 바이트를 포함한 문자를 Tz'이라고 할 때, Tz'의 마지막 바이트의 인덱스인 것을 특징으로 하는 문자열 일치 검색 방법.
  5. 문자열 일치 검색 장치에서 문자열 일치 검색 방법에 있어서,
    다중 바이트로 이루어지는 복수의 문자들에 대한 코드들을 데이터베이스에 저장하는 단계; 및
    상기 데이터베이스에 저장된 코드들을 기초로 입력 텍스트에 대한 해당 코드와 입력 패턴에 대한 해당 코드를 비교하여 상기 텍스트에 상기 패턴이 포함된 위치 정보를 제공하는 단계를 포함하고,
    상기 위치 정보를 제공하는 단계에서 상기 텍스트에 상기 패턴에 포함된 문자와 일치하는 지 여부를 판단하여 소정 문자 단위의 이동 테이블에 따라 해당 문자 단위의 길이만큼 상기 패턴을 이동시키면서 상기 텍스트에 상기 패턴이 포함된 위치를 검색하는 것을 특징으로 하는 문자열 일치 검색 방법.
  6. 제5항에 있어서,
    상기 위치 정보를 제공하는 단계에서,
    문자 단위의 텍스트 Tj' .. j' + m' -1과 패턴 P1 .. m'을 비교하여 모두 일치할 경우, 텍스트(T)에 패턴(P)가 포함된 해당j'번째 위치에 대한 정보를 제공하는 것을 특징으로 하는 문자열 일치 검색 방법.
  7. 제6항에 있어서,
    상기 위치 정보를 제공하는 단계는,
    상기 패턴(P)의 문자열 P[1..m]로부터 문자 단위 이동 테이블 Δ'[σ'] = min{m'-i'+1 : Pi' = σ'}(여기서, i'는 패턴에서 텍스트와 같은 문자 σ'가 위치하는 가장 우측의 인덱스 값)를 생성하는 단계; 및
    Tj' + m'과 Pi'를 정렬시키되, Pi'는 Tj' + m'과 같으면서 패턴에서 가장우측에 위치한 문자가 되도록, Δ'[σ'] = Δ[T[j'+m']]의 값만큼 상기 패턴을 이동시키는 단계
    를 포함하는 것을 특징으로 하는 문자열 일치 검색 방법.
  8. 제7항에 있어서,
    2바이트의 상기 패턴의 문자를 41377(0xA1A1)~65278(0xFEFE) 사이의 정수(integer) 값으로 매핑하고 정수값의 σ'를 이용하여 처리하는 것을 특징으로 하는 문자열 일치 검색 방법.
  9. 제7항에 있어서,
    상기 테이블 Δ'[σ']로부터 상기 패턴의 k번째 바이트를 구분하여 각 바이트별로 생성한 문자 단위 이동 테이블 Δ'k[σ] = min{m-i+k : P[i] = σ이고P[i]는 P[i]를 포함한 문자의 k번째 바이트}(여기서, i는 패턴에서 텍스트와 같은 바이트 σ가 위치하는 가장 우측의 인덱스 값)에 기초하여 Δ'[Tj'+m']이 max{Δ'1[Tj'+m'[1]], Δ'2[Tj'+m'[2]]}(여기서, [1]은 해당 문자의 첫번째 바이트, [2]는 해당 문자의 두번째 바이트)되도록 상기 패턴을 이동하는 것을 특징으로 하는 문자열 일치 검색 방법.
  10. 제7항에 있어서,
    상기 테이블 Δ'[σ']로부터 상기 패턴의 k번째 바이트를 구분하여 각 바이트별로 생성한 문자 단위 이동 테이블 Δ'k[σ] = min{m-i+k : P[i] = σ이고P[i]는 P[i]를 포함한 문자의 k번째 바이트}(여기서, i는 패턴에서 텍스트와 같은 바이트 σ가 위치하는 가장 우측의 인덱스 값)에 기초하여 Δ'[Tj'+m']=Δ'2[Tj'+m'[2]](여기서, [2]는 해당 문자의 두번째 바이트)되도록 상기 패턴을 이동하는 것을 특징으로 하는 문자열 일치 검색 방법.
  11. 제1항, 제3항, 또는 제5항 중 어느 한 항에 있어서,
    상기 문자들은 문자가 모두 1바이트로 이루어지는 언어는 제외하고, 1개의 문자가 복수 바이트로 이루어져 있으며 문자에 따라 바이트의 길이가 달라지는 언어를 포함하는 것을 특징으로 하는 문자열 일치 검색 방법.
KR1020100125043A 2010-12-08 2010-12-08 다중 바이트 문자 집합 텍스트에서의 문자열 일치 검색 방법 KR101189617B1 (ko)

Priority Applications (1)

Application Number Priority Date Filing Date Title
KR1020100125043A KR101189617B1 (ko) 2010-12-08 2010-12-08 다중 바이트 문자 집합 텍스트에서의 문자열 일치 검색 방법

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020100125043A KR101189617B1 (ko) 2010-12-08 2010-12-08 다중 바이트 문자 집합 텍스트에서의 문자열 일치 검색 방법

Publications (2)

Publication Number Publication Date
KR20120063879A true KR20120063879A (ko) 2012-06-18
KR101189617B1 KR101189617B1 (ko) 2012-10-12

Family

ID=46684192

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020100125043A KR101189617B1 (ko) 2010-12-08 2010-12-08 다중 바이트 문자 집합 텍스트에서의 문자열 일치 검색 방법

Country Status (1)

Country Link
KR (1) KR101189617B1 (ko)

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101595189B1 (ko) * 2014-11-14 2016-02-19 인하대학교 산학협력단 압축된 문자열에 대한 Boyer-Moore-Horspool 알고리즘 기반 패턴매칭 방법
KR101630383B1 (ko) * 2015-04-02 2016-06-27 한국과학기술원 다중 패턴 매칭 알고리즘 및 이를 이용한 처리장치
KR101662957B1 (ko) * 2015-07-30 2016-10-05 인하대학교 산학협력단 해싱기반의 순위다중패턴매칭 방법
CN107220333A (zh) * 2017-05-24 2017-09-29 电子科技大学 一种基于Sunday算法的字符搜索方法
CN112000714A (zh) * 2020-08-21 2020-11-27 扬州大学 一种提取教学知识点关联的挖掘方法
CN113051925A (zh) * 2019-12-26 2021-06-29 ***通信集团有限公司 时间识别方法、装置、设备及计算机存储介质

Cited By (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101595189B1 (ko) * 2014-11-14 2016-02-19 인하대학교 산학협력단 압축된 문자열에 대한 Boyer-Moore-Horspool 알고리즘 기반 패턴매칭 방법
KR101630383B1 (ko) * 2015-04-02 2016-06-27 한국과학기술원 다중 패턴 매칭 알고리즘 및 이를 이용한 처리장치
KR101662957B1 (ko) * 2015-07-30 2016-10-05 인하대학교 산학협력단 해싱기반의 순위다중패턴매칭 방법
CN107220333A (zh) * 2017-05-24 2017-09-29 电子科技大学 一种基于Sunday算法的字符搜索方法
CN107220333B (zh) * 2017-05-24 2020-01-31 电子科技大学 一种基于Sunday算法的字符搜索方法
CN113051925A (zh) * 2019-12-26 2021-06-29 ***通信集团有限公司 时间识别方法、装置、设备及计算机存储介质
CN112000714A (zh) * 2020-08-21 2020-11-27 扬州大学 一种提取教学知识点关联的挖掘方法

Also Published As

Publication number Publication date
KR101189617B1 (ko) 2012-10-12

Similar Documents

Publication Publication Date Title
KR101189617B1 (ko) 다중 바이트 문자 집합 텍스트에서의 문자열 일치 검색 방법
KR100902966B1 (ko) 비교를 위해 스트링을 맵핑하는 방법 및 시스템
US8239188B2 (en) Example based translation apparatus, translation method, and translation program
JP2001505330A (ja) テキストストリーム中の単語の切れ目を与える方法及び装置
CN104008093A (zh) 用于中文姓名音译的方法和***
CN116562297B (zh) 基于HTrie树的中文敏感词变形体识别方法及***
Chew et al. Language identification of web pages based on improved n-gram algorithm
CN110096481B (zh) 文件编码的识别方法及计算机可读存储介质
WO2009113289A1 (ja) 新規事例生成装置、新規事例生成方法及び新規事例生成用プログラム
Matsuoka et al. Examination of effective features for CRF-based bibliography extraction from reference strings
CN107967314A (zh) 文本特征值的提取方法、装置及电子设备
US10514889B2 (en) Multipattern regular expression search systems and methods therefor
CN113419742B (zh) 一种字符串编码和查找方法
Hyyrö et al. On bit-parallel processing of multi-byte text
CN110598190B (zh) 一种基于区块链的链上文本数据确权方法
Akash et al. An approach to sort Unicode based Bengali text using Trie
Heninger Analyzing Unicode text with regular expressions
Nugues Encoding and Annotation Schemes
JP4139805B2 (ja) 字句をデータに変換する装置、方法及びプログラム
Van et al. Khmer word segmentation and out-of-vocabulary words detection using collocation measurement of repeated characters subsequences
JPH04123185A (ja) 文書認識方式
JPH07192013A (ja) 文書データ処理装置
Aliprand Unicode Standard
Sarkar Regular Expression Matching for Multi-script Databases.
JP2006106896A (ja) データベース登録システム、データベース検索システム、語彙索引登録方法及び異表記同一視検索方法

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant
FPAY Annual fee payment

Payment date: 20160217

Year of fee payment: 5

FPAY Annual fee payment

Payment date: 20170925

Year of fee payment: 6

FPAY Annual fee payment

Payment date: 20181001

Year of fee payment: 7

FPAY Annual fee payment

Payment date: 20191001

Year of fee payment: 8