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 ¾Ë°í¸®Áò°ú °°´Ù.