라이타 알고리즘
Raita algorithm컴퓨터 과학에서 Raita 알고리즘은 Boyer-Moore의 성능을 향상시키는 문자열 검색 알고리즘입니다.호스풀 알고리즘이 알고리즘은 패턴을 검색하는 문자열을 사전 처리합니다.이것은 Boyer-Moore 문자열 검색 알고리즘과 유사합니다.특정 문자열 내의 특정 서브스트링의 검색 패턴은 Boyer-Moore-와는 다릅니다.호스풀 알고리즘이 알고리즘은 1991년에 [1]Timo Raita에 의해 발행되었습니다.
묘사
라이타 알고리즘은, 주어진 텍스트내의 패턴의 각 문자를 비교함으로써, 주어진 텍스트내의 패턴 「P」를 검색한다.검색은 다음과 같이 이루어집니다.텍스트 "T"의 창은 "P"의 길이로 정의됩니다.
- 우선, 패턴의 마지막 문자와 창의 오른쪽 끝 문자를 비교한다.
- 일치하는 경우 패턴의 첫 번째 문자는 창의 왼쪽 끝 문자와 비교됩니다.
- 두 문자가 다시 일치하면 패턴의 중간 문자와 창의 중간 문자를 비교합니다.
사전 체크의 모든 것이 성공했을 경우, 원래의 비교는 두 번째 문자부터 마지막 문자까지 시작됩니다.알고리즘의 어느 단계에서 미스매치가 있는 경우, 전처리 단계에서 계산된 불량 문자 이동 함수를 실행한다.불량 문자 이동 함수는 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개씩 이동할 수 없습니다.알고리즘이 종료됩니다.대문자로 된 글자는 본문 패턴과 정확히 일치합니다.
복잡성
- 전처리 단계에는 O(m) 시간이 소요되며, 여기서 "m"은 패턴 "P"의 길이입니다.
- 검색 단계에는 O(mn) 시간 복잡도가 필요합니다. 여기서 "n"은 텍스트 "T"의 길이입니다.
「 」를 참조해 주세요.
레퍼런스
- ^ a b RAITA T., 1992, Tuning the Boyer-Moore-Horspool 문자열 검색 알고리즘, 소프트웨어 - Practice & Experience, 22(10): 879-884 [1]
- ^ "⚙ D27068 Improve string::find". LLVM Code Review.