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()¸¦ ÀÌ¿ëÇÏ´Â °Í.µ¡ºÙ¿© ÇÑÀÚ Ä«³ª±³»ç¸®ÀÇ Ä³¸¯ÅÍ ¶óÀÎ Á¶ÇÕ¿¡´Â ¹Ì´ëÀÀÀÌ´Ù.
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; }
BM¾Ë°í¸®ÁòÀÇ ÀåÁ¡Àº, ÅؽºÆ®ÁßÀÇ ¹®ÀÚÀÇ ´ëºÎºÐÀ» Á¶»çÇÏÁö ¾Ê°í ³¡³ª´Â °¡´É ¼ºÀÌ ÀÖ´Â °ÍÀÌ´Ù. ¼Ò¹ÚÇÑ ¾Ë°í¸®ÁòÀ̳ª KMP ¾Ë°í¸®Áò¿¡¼´Â, Å×Å°½º Æ®¾ÈÀÇ ¹®ÀÚ¸¦ °¢°¢ 1ȸ´Â Á¶»çÇÏÁö ¾ÊÀ¸¸é ¾È µÈ´Ù. ºñ±³´Â ÃÖ¾ÇÀ̾ n ȸ°¡ µÈ´Ù. ÀÌ°Í¿¡ ´ëÇؼ, BM¾Ë°í¸®Áò¿¡¼´Â n/m °³(n´Â ÅؽºÆ®ÀÇ Àå , m´Â Á¶ÇÕ ÆÐÅÏÀÇ ±æÀ̸¦ ³ªÅ¸³½´Ù)ÀÇ ¹®Àڿ͸¸ ºñ±³Çϸé ÁÁÀº ÀÏÀÌ ÀÖ´Ù. ÀÌ°Í¿¡ ÀÇÇØ, ƯÈ÷ Á¶ÇÕ ÆÐÅÏÀÌ ±æ ¶§¿¡, °è»ê ½Ã°£ÀÇ ´ëÆøÀûÀÎ ´ÜÃàÀ» ±â´ëÇÒ ¼ö ÀÖ´Ù.
ÀÌ Æ¯Â¡À¸·ÎºÎÅÍ, BM¾Ë°í¸®ÁòÀº, ½Ç¿ë»ó ±ØÈ÷ Áß¿äÇÑ ¾Ë°í¸®Áò°ú º¸¿©Áö°í ÀÖ´Ù. ÅؽºÆ® Ž»öÀÇ »ç¿ë ºóµµ°¡ ³ôÀº ¸¸Å ±× °¡Ä¡´Â Å©´Ù.
BM¾Ë°í¸®Áòµµ, ¼Ò¹ÚÇÑ ¾Ë°í¸®Áò°ú °°ÀÌ, ÅؽºÆ®¸¦ ¿ÞÂÊÀ¸·ÎºÎÅÍ ¼ø¼¿¡ Á¶ ¶ó°í °£´Ù. ±×·¯³ª, ÀÏ´Ü ÅؽºÆ®»óÀÇ À§Ä¡°¡ °áÁ¤µÇ¸é(ÀÚ), Á¶ÇÕ ÆÐÅÏ ¿¡ ´ëÇؼ´Â, ¹Ý´ë·Î ¿À¸¥ÂÊ¿¡¼ ¿ÞÂÊÀ» ÇâÇØ Á¶»çÇÑ´Ù. Á¶ÇÕ ÆÐÅÏÀ» ¿ª¹æÇâ¿¡ Á¶»ç ÀÏÀÌ BM¾Ë°í¸®ÁòÀÇ ¿äÁ¡ÀÌ´Ù. ¹°·Ð, Á¶ÇÕÀ» ÁøÇà½ÃÅ°±â¿¡ ÁîÀ½ÇØ (Àº)´Â, ±× ÀÌÀü¿¡ °£ ºñ±³ÀÇ °á°ú·Î¼ ¾òÀ» ¼ö ÀÖ´ø Á¤º¸¸¦ °¡´ÉÇÑ ÇÑ È°¿ëÇØ, ºñ±³ÀÇ È¸¼ö¸¦ ÁÙÀ̵µ·Ï(µíÀÌ) ³ë·ÂÇÑ´Ù. ÀÌ°ÍÀº KMP ¾Ë°í¸®Áò°ú °°´Ù.