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


ÇÔ¼ö¸í
kmpMatch  Knuth-Morris-Pratt¿¡ ÀÇÇÑ Ä³¸¯ÅÍ ¶óÀÎ Á¶ÇÕ ¾Ë°í¸®Áò
kmpNext   ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕÀ» À§ÇÑ ½¬ÇÁƮǥÀÇ ÀÛ¼º
Çü½Ä
ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕ
    char *kmpMatch(char *text, int len, char *pattern,
                   int patlen, int *next);
½¬ÇÁƮǥÀÇ ÀÛ¼º
    int kmpNext(int *next, int nlen, char *pattern, int patlen);
Àμö
ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕ ÇÔ¼ö¿¡ ´ëÇØ
    text     (ÀÔ·Â) ÅؽºÆ®
    len      (ÀÔ·Â) ÅؽºÆ®ÀÇ ±æÀÌ
    pattern  (ÀÔ·Â) Á¶ÇÕ ÆÐÅÏ
    patlen   (ÀÔ·Â) Á¶ÇÕ ÆÐÅÏÀÇ ±æÀÌ
    next     (ÀÔ·Â) ½¬ÇÁƮǥ

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

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

ÇÁ·Î±×·¥(kmpMatch.c )
char *kmpMatch(char *text, int len, char *pattern, int patlen, int *next)
{
    char *pp;
    char *textEnd, *patEnd;

    if (len < patlen) return NULL;

    textEnd = text + len;
    patEnd  = pattern + patlen;

    pp = pattern;
    while (text ! = textEnd) {
        if (*text++ == *pp) pp++;
        else if (pp ! = pattern) {
            pp = pattern + *(next + (pp - pattern));
            text--;
        }
        if (pp == patEnd) return text - patlen;
    }

    return NULL;
}

int kmpNext(int *next, int nlen, char *pattern, int patlen)
{
    char *tp, *pp;
    char *patEnd;

    if (nlen < patlen) return -1;

    patEnd  = pattern + patlen;
    *next = 0;

    tp = pp = pattern;
    while (++tp ! = patEnd) {
        *(next + (tp - pattern)) = pp - pattern;
        if (*tp == *pp) pp++;
    }

    return 0;
}
¼³¸í
¼Ò¹ÚÇÑ ¾Ë°í¸®Áò¿¡¼­µµ, ½Ç¿ëÀûÀ¸·Î ºÁ ±×¸¸Å­ÀÇ ¹®Á¦Á¡Àº ¾øÁö¸¸, ÃÖ¾ÇÀÇ °æ¿ìÀÇ °è»ê·®Àº mn¿¡ ºñ·ÊÇÏ´Â Á¡À¸·Î °³·®ÀÇ ¿©Áö°¡ ³²¾Æ ÀÖ´Ù. °è»ê·®ÀÌ ÀÌ Á¤µµ°¡ µÇ´Â °ÍÀº, ¾î´À À§Ä¡¿¡ ÆÐÅÏÀ» µÎ¾î ºñ±³ÇßÀ» ¶§¿¡ ¾òÀ» ¼ö ÀÖ´Â Á¤º¸¸¦ ÃæºÐÈ÷ È°¿ëÇØ ¾ø±â ¶§¹®ÀÌ´Ù.

ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕÀÇ ¼Óµµ¸¦ ¿Ã¸®·Á¸é , ÀÏÄ¡ÇÑ´Ù, ¶Ç´Â ÀÏÄ¡ÇÏÁö ¾Ê´Â °Í (À»)¸¦ ¾Ë°í ÀÖ´Â ¾µµ¥¾ø´Â ºñ±³¸¦ °¡´ÉÇÑ ÇÑ ÇÇÇÏ´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÏ´Ù. ±× ¶§¹®¿¡ ¿¡´Â, Á¶ÇÕÀ» ½ÃÀÛÇϱâ Àü¿¡ Áغñ¸¦ ÇØ µÎ´Â °ÍÀÌ ÇÊ¿äÇÏ´Ù. Áï, k ¹®ÀÚ¸¸ ÀÏÄ¡ÇÑ ´ÙÀ½¿¡ ºÒÀÏÄ¡°¡ ¹ß°ßµÇ¾úÀ» ¶§¿¡, ÅؽºÆ®ÀÇ ¾î´À ¹®ÀÚ¿Í ÆÐÅÏÀÇ ¾î´À ¹®ÀÚÀÇ ºñ±³·ÎºÎÅÍ Á¶ÇÕÀ» °è¼ÓÇϸé ÁÁÀº°¡¸¦ ¹Ì¸® Á¶»çÇØ µÐ´Ù. ºÒÀÏÄ¡°¡ µÈ À§Ä¡¿¡¼­ ÁÂÃø k¹®ÀÚ¸¦ ¾Ë ¼ö ÀÖ°í ÀÖ´Â °ÍÀ» ÀÌ¿ëÇØ, ¾µµ¥¾ø´Â ºñ±³¸¦ ÇÇÇϵµ·Ï(µíÀÌ) ¼³Á¤ÇÏ´Â °ÍÀÌ´Ù. ÀÌ°ÍÀ» °Ñ(Ç¥)ÀÇ ÇüÅ·Π±â·ÏÇÑ´Ù. ÀÌ ½¬ÇÁƮǥ¸¦ ¿ä±¸ÇÏ´Â °è»ê¿¡ ´ëÇؼ­´Â, Á¶»çÇÏ´Â ´ë»óÀº ÆÐÅÏ»ÓÀÌ´Ù.

KMP ¾Ë°í¸®ÁòÀÇ ºñ±³ ȸ¼ö´Â, ÃÖ´ë 2n ȸÀÌ´Ù. Áï °è»ê·®Àº O(n) ÀÌ´Ù. ´Ù¸¸, n ´Â ÅؽºÆ®ÀÇ ±æÀ̸¦ ³ªÅ¸³½´Ù.

±×·¯³ª,BM¹ý¿¡ µû¸£´Â ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕ ¾Ë°í¸®Áò ¿¡ ºñÇϸé(ÀÚ), ½Ç¿ë»óÀÇ ¼º´ÉÀ¸·Î µÚ¶³¾îÁø´Ù.

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