BM¹ý¿¡ µû¸£´Â ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕ


ÇÔ¼ö¸í
bmMatch  Boyer-Moore¿¡ ÀÇÇÑ Ä³¸¯ÅÍ ¶óÀÎ Á¶ÇÕ ¾Ë°í¸®Áò
bmSkip   ½¬ÇÁƮǥ 1ÀÇ ÀÛ¼º
bmNext   ½¬ÇÁƮǥ 2ÀÇ ÀÛ¼º
Çü½Ä
ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕ
    char *bmMatch(char *text, int len, char *pattern,
                  int patlen, int *skip, int *next);

½¬ÇÁƮǥ 1ÀÇ ÀÛ¼º
    int bmSkip(int *skip, int slen, char *pattern, int patlen);

½¬ÇÁƮǥ 2ÀÇ ÀÛ¼º
    int bmNext(int *next, int nlen, char *pattern, int patlen);
Àμö
ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕ ÇÔ¼ö¿¡ ´ëÇØ
    text     (ÀÔ·Â) ÅؽºÆ®
    len      (ÀÔ·Â) ÅؽºÆ®ÀÇ ±æÀÌ
    pattern  (ÀÔ·Â) Á¶ÇÕ ÆÐÅÏ
    patlen   (ÀÔ·Â) Á¶ÇÕ ÆÐÅÏÀÇ ±æÀÌ
    skip     (ÀÔ·Â) ½¬ÇÁƮǥ 1
    next     (ÀÔ·Â) ½¬ÇÁƮǥ 2

½¬ÇÁƮǥ 1ÀÇ ÀÛ¼º ÇÔ¼ö¿¡ ´ëÇØ
    skip     (ÀÔÃâ·Â) ½¬ÇÁƮǥ 1
    slen     (ÀÔ·Â)¡¡skip ¹è¿­ÀÇ ±æÀÌ
    pattern  (ÀÔ·Â) Á¶ÇÕ ÆÐÅÏ
    patlen   (ÀÔ·Â) Á¶ÇÕ ÆÐÅÏÀÇ ±æÀÌ

½¬ÇÁƮǥ 2ÀÇ ÀÛ¼º ÇÔ¼ö¿¡ ´ëÇØ
    next     (ÀÔÃâ·Â) ½¬ÇÁƮǥ 2
    nlen     (ÀÔ·Â)¡¡next ¹è¿­ÀÇ ±æÀÌ
    pattern  (ÀÔ·Â) Á¶ÇÕ ÆÐÅÏ
    patlen   (ÀÔ·Â) Á¶ÇÕ ÆÐÅÏÀÇ ±æÀÌ
ÇÔ¼öÄ¡
ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕ ÇÔ¼ö¿¡ ´ëÇØ
    Á¶ÇÕ ÆÐÅÏÀÌ ÅؽºÆ®·ÎºÎÅÍ ¹ß°ßµÇ¾úÀ» °æ¿ì´Â ±× Æ÷ÀÎÅÍ,
    ¹ß°ßµÇÁö ¾Ê¾Ò´ø °æ¿ì´Â 0 (NULL).

½¬ÇÁƮǥ 1ÀÇ ÀÛ¼º ÇÔ¼ö¿¡ ´ëÇØ
    ½¬ÇÁƮǥ 1À» Á¤»óÀûÀ¸·Î ÀÛ¼ºÇÒ ¼ö ÀÖ¾úÀ» °æ¿ì´Â 0, ½ÇÆÐÇßÀ» °æ¿ì´Â -1.

½¬ÇÁƮǥ 2ÀÇ ÀÛ¼º ÇÔ¼ö¿¡ ´ëÇØ
    ½¬ÇÁƮǥ 2¸¦ Á¤»óÀûÀ¸·Î ÀÛ¼ºÇÒ ¼ö ÀÖ¾úÀ» °æ¿ì´Â 0, ½ÇÆÐÇßÀ» °æ¿ì´Â -1.
ÁÖÀÇ »çÇ×
bmSkip()¿Í bmNext()¸¦ È£ÃâÇØ ½¬ÇÁƮǥ¸¦ ÀÛ¼ºÇÑ ÈÄ, ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕ ÇÔ¼ö
bmMatch()¸¦ ÀÌ¿ëÇÏ´Â °Í. 

µ¡ºÙ¿© ÇÑÀÚ Ä«³ª±³»ç¸®ÀÇ Ä³¸¯ÅÍ ¶óÀÎ Á¶ÇÕ¿¡´Â ¹Ì´ëÀÀÀÌ´Ù.

¿ë·Ê(bmMatch-test.c )

ÇÁ·Î±×·¥(bmMatch.c )
char *bmMatch(char *text, int len, char *pattern, int patlen, int *skip, int *next){
    int i, j;

    i = patlen - 1;
    while (i < len) {
        j = patlen - 1;
        while (j >= 0 && text[i] == pattern[j]) {
            i--;
            j--;
        }
        if (j < 0) return text + i + 1;
        if (skip[text[i] & 0x00ff] >= next[j])
            i += skip[text[i] & 0x00ff];
        else i += next[j];
    }
    return NULL;
}

int bmSkip(int *skip, int slen, char *pattern, int patlen){
    int j;

    if (slen < 256) return -1;
    for (j = 0; j < 256; j++) skip[j] = patlen;
    for (j = 0; j < patlen - 1; j++)
        skip[pattern[j] & 0x00ff] = patlen-1-j;
    return 0;
}

int bmNext(int *next, int nlen, char *pattern, int patlen){
    int  j, k, s;
    int  *g;

    if (nlen < patlen) return -1;
    if ((g = (int *) malloc(sizeof(int) *patlen)) == NULL) return -1;
    for (j = 0; j < patlen; j++) next[j] = 2*patlen - 1 - j;
    j = patlen;
    for (k = patlen - 1; k >= 0; k--) {
        g[k] = j;
        while (j ! = patlen && pattern[j] ! = pattern[k]) {
            next[j] = (next[j] <= patlen-1-k) ?  next[j] : patlen-1-k;
            j = g[j];
        }
        j--;
    }
    s = j;
    for (j = 0; j < patlen; j++) {
        next[j] = (next[j] <= s+patlen-j) ?  next[j] : s+patlen-j;
        if (j >= s) s = g[s];
    }
    free(g);
    return 0;
}
¼³¸í
Boyer-MooreÀÇ ¾Ë°í¸®Áò, »ý·«ÇØ BM¾Ë°í¸®ÁòÀº, KMP ¾Ë°í¸®Áòº¸´Ù ÇÑÃþ ´õ °í¼ÓÀÇ Á¶ÇÕ ¾Ë°í¸®ÁòÀÌ´Ù. Á¶ÇÕ ÆÐÅÏÀÌ ¾î´À Á¤µµ ÀÌ»ó(º¸Åë 5 ¹®ÀÚ ÀÌ»ó Á¤µµ)ÀÇ ±æÀ̸¦ °¡Áö´Â °æ¿ì¿¡´Â, °¡Àå ºü¸¥ ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕ ¾Ë°í¸®ÁòÀ̶ó¸é ¸» ±úÁö°í ÀÖ´Ù. KMP ¾Ë°í¸®Áò°ú °°ÀÌ, °è»ê·®Àº ÃÖ¾ÇÀÇ °æ¿ì¿¡¼­µµ O(n)·Î ÀÖ´Ù.

BM¾Ë°í¸®ÁòÀÇ ÀåÁ¡Àº, ÅؽºÆ®ÁßÀÇ ¹®ÀÚÀÇ ´ëºÎºÐÀ» Á¶»çÇÏÁö ¾Ê°í ³¡³ª´Â °¡´É ¼ºÀÌ ÀÖ´Â °ÍÀÌ´Ù. ¼Ò¹ÚÇÑ ¾Ë°í¸®ÁòÀ̳ª KMP ¾Ë°í¸®Áò¿¡¼­´Â, Å×Å°½º Æ®¾ÈÀÇ ¹®ÀÚ¸¦ °¢°¢ 1ȸ´Â Á¶»çÇÏÁö ¾ÊÀ¸¸é ¾È µÈ´Ù. ºñ±³´Â ÃÖ¾ÇÀ̾ n ȸ°¡ µÈ´Ù. ÀÌ°Í¿¡ ´ëÇؼ­, BM¾Ë°í¸®Áò¿¡¼­´Â n/m °³(n´Â ÅؽºÆ®ÀÇ Àå , m´Â Á¶ÇÕ ÆÐÅÏÀÇ ±æÀ̸¦ ³ªÅ¸³½´Ù)ÀÇ ¹®Àڿ͸¸ ºñ±³Çϸé ÁÁÀº ÀÏÀÌ ÀÖ´Ù. ÀÌ°Í¿¡ ÀÇÇØ, ƯÈ÷ Á¶ÇÕ ÆÐÅÏÀÌ ±æ ¶§¿¡, °è»ê ½Ã°£ÀÇ ´ëÆøÀûÀÎ ´ÜÃàÀ» ±â´ëÇÒ ¼ö ÀÖ´Ù.

ÀÌ Æ¯Â¡À¸·ÎºÎÅÍ, BM¾Ë°í¸®ÁòÀº, ½Ç¿ë»ó ±ØÈ÷ Áß¿äÇÑ ¾Ë°í¸®Áò°ú º¸¿©Áö°í ÀÖ´Ù. ÅؽºÆ® Ž»öÀÇ »ç¿ë ºóµµ°¡ ³ôÀº ¸¸Å­ ±× °¡Ä¡´Â Å©´Ù.

BM¾Ë°í¸®Áòµµ, ¼Ò¹ÚÇÑ ¾Ë°í¸®Áò°ú °°ÀÌ, ÅؽºÆ®¸¦ ¿ÞÂÊÀ¸·ÎºÎÅÍ ¼ø¼­¿¡ Á¶ ¶ó°í °£´Ù. ±×·¯³ª, ÀÏ´Ü ÅؽºÆ®»óÀÇ À§Ä¡°¡ °áÁ¤µÇ¸é(ÀÚ), Á¶ÇÕ ÆÐÅÏ ¿¡ ´ëÇؼ­´Â, ¹Ý´ë·Î ¿À¸¥ÂÊ¿¡¼­ ¿ÞÂÊÀ» ÇâÇØ Á¶»çÇÑ´Ù. Á¶ÇÕ ÆÐÅÏÀ» ¿ª¹æÇâ¿¡ Á¶»ç ÀÏÀÌ BM¾Ë°í¸®ÁòÀÇ ¿äÁ¡ÀÌ´Ù. ¹°·Ð, Á¶ÇÕÀ» ÁøÇà½ÃÅ°±â¿¡ ÁîÀ½ÇØ (Àº)´Â, ±× ÀÌÀü¿¡ °£ ºñ±³ÀÇ °á°ú·Î¼­ ¾òÀ» ¼ö ÀÖ´ø Á¤º¸¸¦ °¡´ÉÇÑ ÇÑ È°¿ëÇØ, ºñ±³ÀÇ È¸¼ö¸¦ ÁÙÀ̵µ·Ï(µíÀÌ) ³ë·ÂÇÑ´Ù. ÀÌ°ÍÀº KMP ¾Ë°í¸®Áò°ú °°´Ù.

°ü·Ã ÇÔ¼ö
¼Ò¹Ú¹ý¿¡ µû¸£´Â ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕ, KMP¹ý¿¡ µû¸£´Â ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕ, RK¹ý¿¡ µû¸£´Â ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕ, Á¤±Ô Ç¥Çö¿¡ ÀÇÇÑ Ä³¸¯ÅÍ ¶óÀÎ Á¶ÇÕ