Page 331 - Do it! 자료구조와 함께 배우는 알고리즘(C 언어, 3쇄)
P. 331

0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15
                         A B C X D E  Z C A B A C A B A C
                                      A B A C
                                             모든 문자가 일치합니다.
                                [그림 8-17] 검색에 성공한 경우


                        그런데 Boyer-Moore 알고리즘도 각각의 문자를 만났을 때 패턴을 옮길 크기를 저장할 표

                        (건너뛰기 표)를 미리 만들어야 합니다. 패턴 문자열의 길이가 n일 때 옮길 크기는 아래와 같은
                        방법으로 결정합니다.                                  건너뛰기 표는 KMP법에서 이미 작성해 보았습니다.


                         패턴에 들어 있지 않은 문자를 만난 경우
                         1.   패턴을 옮길 크기는 n입니다. 그림 8-13을 다시 예로 들어 살펴보면 'X'는 패턴에 들어 있지 않으므로 4만
                           큼 옮깁니다.


                         패턴에 들어 있는 문자를 만난 경우
                         1.   마지막에 나오는 위치의 인덱스가 k이면 패턴을 옮길 크기는 n – k – 1입니다. 그림 8-16을 다시 예로 들면
                           'A'는 패턴의 두 곳에 들어 있지만 마지막 인덱스를 기준으로 하여 패턴을 1만큼(4-2-1) 옮깁니다.
                         2.   같은 문자가 패턴 안에 중복해서 들어 있지 않다면("ABAC"의 'C'는 패턴 안에 1개만 들어 있습니다) 패
                           턴을 옮길 크기는 n입니다.



                        위의 규칙에 의해 만든 건너뛰기 표를 그림 8-18에 나타냈습니다.

                           이 그림에 표시된 옮길 크기는 대문자뿐입니다. 이 표에 없는 문자(숫자나 기호 등)의 옮길 크기는 모두 4입니다.
                         텍스트 … "ABCXDEZCABACABAC" 패턴 … "ABAC"

                        A    B   C    D   E    F   G    H   I    J   K    L    M
                        1    2   4    4   4    4   4    4   4    4   4    4    4

                        N    O   P    Q   R    S   T    U   V    W   X    Y    Z
                        4    4   4    4   4    4   4    4   4    4   4    4    4

                                     [그림 8-18] Boyer-Moore법을 사용해 만든 건너뛰기 표


                        실습 8-14는 Boyer-Moore법을 사용한 프로그램입니다. 이때 패턴에 존재할 수 있는 모든
                        문자의 옮길 크기를 계산하고 저장해야 하기 때문에 건너뛰기 표의 요소 개수는 UCHAR_
                        MAX + 1입니다.

                           UCHAR_MAX는 표현할 수 있는 문자의 개수를 의미하며 <limits.h> 안에 객체 형식 매크로로 정의되어 있습니다. 자료
                        형은 unsigned char형입니다.
                           여기서 설명한 하나의 배열만 사용해서 검사하는 방법은 간단하게 구현한 Boyer-Moore 알고리즘입니다. 원래의 Boyer-
                        Moore법은 2개의 배열로 문자열을 검사합니다.




                                                                                      08•문자열 검색  331
   326   327   328   329   330   331   332   333   334   335   336