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¸¯ÅÍ ¶óÀÎ Á¶ÇÕ ¾Ë°í¸®Áò ¿¡ ºñÇϸé(ÀÚ), ½Ç¿ë»óÀÇ ¼º´ÉÀ¸·Î µÚ¶³¾îÁø´Ù.