라이타 알고리즘

Raita algorithm

컴퓨터 과학에서 Raita 알고리즘은 Boyer-Moore의 성능을 향상시키는 문자열 검색 알고리즘입니다.호스풀 알고리즘이 알고리즘은 패턴을 검색하는 문자열을 사전 처리합니다.이것은 Boyer-Moore 문자열 검색 알고리즘과 유사합니다.특정 문자열 내의 특정 서브스트링의 검색 패턴은 Boyer-Moore-와는 다릅니다.호스풀 알고리즘이 알고리즘은 1991년에 [1]Timo Raita에 의해 발행되었습니다.

묘사

라이타 알고리즘은, 주어진 텍스트내의 패턴의 각 문자를 비교함으로써, 주어진 텍스트내의 패턴 「P」를 검색한다.검색은 다음과 같이 이루어집니다.텍스트 "T"의 창은 "P"의 길이로 정의됩니다.

  1. 우선, 패턴의 마지막 문자와 창의 오른쪽 끝 문자를 비교한다.
  2. 일치하는 경우 패턴의 첫 번째 문자는 창의 왼쪽 끝 문자와 비교됩니다.
  3. 두 문자가 다시 일치하면 패턴의 중간 문자와 창의 중간 문자를 비교합니다.

사전 체크의 모든 것이 성공했을 경우, 원래의 비교는 두 번째 문자부터 마지막 문자까지 시작됩니다.알고리즘의 어느 단계에서 미스매치가 있는 경우, 전처리 단계에서 계산된 불량 문자 이동 함수를 실행한다.불량 문자 이동 함수는 Boyer-Moore-에서 제안된 함수와 동일합니다.호스풀 [1]알고리즘

유사한 사전 점검의 현대적인 공식은 에서 찾을 수 있습니다.std::string::findlibc++ 및 libstdc++의 선형/오디오 스트링 매처.적절하게 최적화된 버전의memcmp"[2]원래 비교"에서 문자를 건너뛰지 않는 것이 패턴이 정렬될 가능성이 높기 때문에 더 효율적인 경향이 있습니다.

Raita 알고리즘의 C 코드

#실패하다 <고객명>님.h> #실패하다 <stdef.h>  #알파벳의 정의ET_SIZE (1 < CHAR _ BITS )/* 보통 256 * /  /* 전처리: BMH 불일치 테이블.*/ 정적인 인라인 무효 BmBc 이전( *쓰다듬다, size_t lpat, ptrdiff_t bmBc[]) {   size_t i;   위해서 (i = 0; i < > 알파벳_사이즈; ++i)     bmBc[i] = lpat;   위해서 (i = 0; i < > lpat - 1; ++i)     bmBc[쓰다듬다[i]] = lpat - i - 1; }  무효 레이타( *쓰다듬다, size_t lpat,  *s, size_t n) {   ptrdiff_t bmBc[알파벳_사이즈];    /* 퀵 엣지 케이스*/   한다면 (lpat == 0    lpat > n)     돌아가다;    한다면 (lpat == 1) {      *match_ptr = s;     하는 동안에 (match_ptr < > s + n) {       match_ptr = 메모리(match_ptr, 쓰다듬다[0], n - (match_ptr - s));       한다면 (match_ptr != 특수한 순서) {         산출량(match_ptr - s);         match_ptr++;       } 또 다른         돌아가다;     }   }    BmBc 이전(쓰다듬다, lpat, bmBc);    /* 프리매치 윈도*/    첫 번째 = 쓰다듬다[0];    미들치 = 쓰다듬다[lpat / 2];    라스트 Ch = 쓰다듬다[lpat - 1];    /* 검색 중 */   ptrdiff_t j = 0;   하는 동안에 (j <=> n - m) {      c = s[j + lpat - 1];     /* 긴 패턴에서는 데이터 인접성을 해칠 수 있습니다.이 경우, 삭감하는 것을 검토한다. * 사전 분석 또는 더 많은 클러스터된 인덱스를 사용하는 수.*/     한다면 (라스트 Ch == c & & 미들치 == s[j + lpat / 2] & & 첫 번째 == s[j] & &         메모리(&쓰다듬다[1], &s[j+1], lpat - 2) == 0)       산출량(j);     j += bmBc[c];   } } 

패턴: abdb

텍스트: abbaababdbadbb

처리 전 단계:

a b d 4 3 1
시행 1: abbaababdbadb .....b 4 시프트 (bmBc[a])

창의 오른쪽 끝 문자와 패턴의 마지막 문자 비교.미스매치이며 전처리 단계의 값에 따라 4만큼 어긋납니다.

시도 2: abbaababadbb A.d.B 3 시프트 (bmBc[b])

여기서 패턴의 마지막 문자와 첫 번째 문자는 일치하지만 중간 문자는 불일치입니다.따라서 패턴은 전처리 단계에 따라 이동됩니다.

시행 3: abbaababadbabadb ABDDB 3 시프트(bmBc[b])

여기서 정확한 일치를 찾았지만 알고리즘은 더 이상 움직일 수 없을 때까지 계속됩니다.

시도 4: 아바바ABDDBabadbb ....b 4 (bmBc[a])

이 단계에서는 4개씩 이동해야 하는데 패턴을 4개씩 이동할 수 없습니다.알고리즘이 종료됩니다.대문자로 된 글자는 본문 패턴과 정확히 일치합니다.

복잡성

  1. 전처리 단계에는 O(m) 시간이 소요되며, 여기서 "m"은 패턴 "P"의 길이입니다.
  2. 검색 단계에는 O(mn) 시간 복잡도가 필요합니다. 여기서 "n"은 텍스트 "T"의 길이입니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ a b RAITA T., 1992, Tuning the Boyer-Moore-Horspool 문자열 검색 알고리즘, 소프트웨어 - Practice & Experience, 22(10): 879-884 [1]
  2. ^ "⚙ D27068 Improve string::find". LLVM Code Review.

외부 링크