rkMatch ¶óºó-Ä«ÇÁ¿¡ ÀÇÇÑ Ä³¸¯ÅÍ ¶óÀÎ Á¶ÇÕ ¾Ë°í¸®Áò rkHash Á¶ÇÕ ÆÐÅÏÀÇ ÇØ½¬ ÇÔ¼öÄ¡
ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕ
char *rkMatch(char *text, int len, int patlen,
unsigned long patHash, unsigned long dm);
Á¶ÇÕ ÆÐÅÏÀÇ ÇØ½¬ ÇÔ¼öÄ¡
unsigned long rkHash(unsigned long *dm, char *pattern, int patlen);
ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕ ÇÔ¼ö¿¡ ´ëÇØ
text (ÀÔ·Â) ÅØ½ºÆ®
len (ÀÔ·Â) ÅØ½ºÆ®ÀÇ ±æÀÌ
patlen (ÀÔ·Â) Á¶ÇÕ ÆÐÅÏÀÇ ±æÀÌ
patHash (ÀÔ·Â) Á¶ÇÕ ÆÐÅÏÀÇ ÇØ½¬ ÇÔ¼öÄ¡
dm (ÀÔ·Â) 256m-1 % q ÀÇ °ª
Á¶ÇÕ ÆÐÅÏÀÇ ÇØ½¬ ÇÔ¼öÄ¡ÀÇ ÇÔ¼ö¿¡ ´ëÇØ
dm (ÀÔÃâ·Â) 256m-1 % q ÀÇ °ª
pattern (ÀÔ·Â) Á¶ÇÕ ÆÐÅÏ
patlen (ÀÔ·Â) Á¶ÇÕ ÆÐÅÏÀÇ ±æÀÌ
ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕ ÇÔ¼ö¿¡ ´ëÇØ
Á¶ÇÕ ÆÐÅÏÀÌ ÅØ½ºÆ®·ÎºÎÅÍ ¹ß°ßµÇ¾úÀ» °æ¿ì´Â ±× Æ÷ÀÎÅÍ,
¹ß°ßµÇÁö ¾Ê¾Ò´ø °æ¿ì´Â 0 (NULL).
Á¶ÇÕ ÆÐÅÏÀÇ ÇØ½¬ ÇÔ¼öÄ¡ÀÇ ÇÔ¼ö¿¡ ´ëÇØ
Á¶ÇÕ ÆÐÅÏÀÇ ÇØ½¬ ÇÔ¼öÄ¡
rkPattern()¸¦ È£ÃâÇØ Á¶ÇÕ ÆÐÅÏÀÇ ÇØ½¬ ÇÔ¼öÄ¡¸¦ »êÃâÇÑ ÈÄ, ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕ ÇÔ¼ö rkMatch()¸¦ ÀÌ¿ëÇÏ´Â °Í.
#define Q 33554393L /* prime number */
#define LOG2D 8 /* 2^8 = 256 */
unsigned long rkHash(unsigned long *dm, char *pattern, int patlen)
{
int i;
unsigned long h1;
for (i = 1, *dm = 1; i < patlen; i++)
*dm = (*dm << LOG2D) % Q;
for (i = 0, h1 = 0; i < patlen; i++)
h1 = ((h1 << LOG2D) + pattern[i]) % Q;
return h1;
}
char *rkMatch(char *text, int len, int patlen,
unsigned long patHash, unsigned long dm)
{
int i;
char *textEnd;
unsigned long h2;
if (patlen == 0) return text;
if (len < patlen) return NULL;
for (i = 0, h2 = 0; i < patlen; i++)
h2 = ((h2 << LOG2D) + text[i]) % Q;
textEnd = text + (len - patlen) + 1;
while (text ! = textEnd) {
if (h2 == patHash) return text;
h2 = (h2 + (Q << LOG2D) - *text * dm) % Q;
h2 = ((h2 << LOG2D) + *(text + patlen)) % Q;
text++;
}
return NULL;
}
ÀÌ ¹æ¹ý¿¡¼´Â ¿ì¼± Á¶ÇÕ ÆÐÅÏÀÇ ÇØ½¬ ÇÔ¼öÄ¡ h1 ¸¦, ´ÙÀ½¿¡ ÅØ½ºÆ® ÃÖÃÊÀÇ m ¹®ÀÚ ºÐÀÇ ÇØ½¬ ÇÔ¼öÄ¡ h2 ¸¦ °è»êÇÑ´Ù. ±× ÈÄ ÅØ½ºÆ®»ó ÀÇ Á¶ÇÕ °³½Ã À§Ä¡¸¦ ¿À¸¥ÂÊÀ¸·Î ºñÄÑ ³õÀ¸¸é¼, ÇØ½¬ ÇÔ¼öÄ¡¸¦ Á¡È½Ä¿¡ ÀÇÇØ ÇÕ°è Çì¾Æ·Á, ±× °ª°ú h1 ¿ÍÀÇ ºñ±³¸¦ ¹Ýº¹ÇÑ´Ù.
ÀÌ ¹æ¹ýÀÇ °è»ê·® O(m+n)ÀÌ´Ù. ´Ù¸¥ ij¸¯ÅÍ ¶óÀÎÀÌ °°Àº ÇØ½¬ ÇÔ¼öÄ¡¸¦ °¡Áø´Ù (ÀÏ)°ÍÀº ÀÌ·ÐÀûÀ¸·Î´Â ºÎÁ¤ÇÒ ¼ö ¾øÁö¸¸, Å« ¼Ò¼ö q ¸¦ ¼±ÅÃÇÏ¸é ½Ç¿ë»ó ±× ¹®Á¦ (À»)¸¦ ¹«½ÃÇØµµ ÁÁ´Ù.