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 ¸¦ ¼±ÅÃÇÏ¸é ½Ç¿ë»ó ±× ¹®Á¦ (À»)¸¦ ¹«½ÃÇصµ ÁÁ´Ù.