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()¸¦ ÀÌ¿ëÇÏ´Â °Í.
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;
}
ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕÀÇ ¼Óµµ¸¦ ¿Ã¸®·Á¸é , ÀÏÄ¡ÇÑ´Ù, ¶Ç´Â ÀÏÄ¡ÇÏÁö ¾Ê´Â °Í (À»)¸¦ ¾Ë°í ÀÖ´Â ¾µµ¥¾ø´Â ºñ±³¸¦ °¡´ÉÇÑ ÇÑ ÇÇÇÏ´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÏ´Ù. ±× ¶§¹®¿¡ ¿¡´Â, Á¶ÇÕÀ» ½ÃÀÛÇϱâ Àü¿¡ Áغñ¸¦ ÇØ µÎ´Â °ÍÀÌ ÇÊ¿äÇÏ´Ù. Áï, k ¹®ÀÚ¸¸ ÀÏÄ¡ÇÑ ´ÙÀ½¿¡ ºÒÀÏÄ¡°¡ ¹ß°ßµÇ¾úÀ» ¶§¿¡, ÅØ½ºÆ®ÀÇ ¾î´À ¹®ÀÚ¿Í ÆÐÅÏÀÇ ¾î´À ¹®ÀÚÀÇ ºñ±³·ÎºÎÅÍ Á¶ÇÕÀ» °è¼ÓÇϸé ÁÁÀº°¡¸¦ ¹Ì¸® Á¶»çÇØ µÐ´Ù. ºÒÀÏÄ¡°¡ µÈ À§Ä¡¿¡¼ ÁÂÃø k¹®ÀÚ¸¦ ¾Ë ¼ö ÀÖ°í ÀÖ´Â °ÍÀ» ÀÌ¿ëÇØ, ¾µµ¥¾ø´Â ºñ±³¸¦ ÇÇÇϵµ·Ï(µíÀÌ) ¼³Á¤ÇÏ´Â °ÍÀÌ´Ù. À̰ÍÀ» °Ñ(Ç¥)ÀÇ ÇüÅ·Π±â·ÏÇÑ´Ù. ÀÌ ½¬ÇÁƮǥ¸¦ ¿ä±¸ÇÏ´Â °è»ê¿¡ ´ëÇØ¼´Â, Á¶»çÇÏ´Â ´ë»óÀº ÆÐÅÏ»ÓÀÌ´Ù.
KMP ¾Ë°í¸®ÁòÀÇ ºñ±³ ȸ¼ö´Â, ÃÖ´ë 2n ȸÀÌ´Ù. Áï °è»ê·®Àº O(n) ÀÌ´Ù. ´Ù¸¸, n ´Â ÅØ½ºÆ®ÀÇ ±æÀ̸¦ ³ªÅ¸³½´Ù.
±×·¯³ª,BM¹ý¿¡ µû¸£´Â ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕ ¾Ë°í¸®Áò ¿¡ ºñÇϸé(ÀÚ), ½Ç¿ë»óÀÇ ¼º´ÉÀ¸·Î µÚ¶³¾îÁø´Ù.