RK¿¡ ÀÇÇÑ Ä³¸¯ÅÍ ¶óÀÎ Á¶ÇÕ


ÇÔ¼ö¸í
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()¸¦ ÀÌ¿ëÇÏ´Â °Í.
¿ë·Ê(rkMatch-test.c )

ÇÁ·Î±×·¥(rkMatch.c )
#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;
}
¼³¸í
ÅؽºÆ®¿¡ ³ªÅ¸³ª´Â, ±æÀÌ m (m´Â Á¶ÇÕ ÆÐÅÏÀÇ ±æÀÌ)ÀÇ Ä³¸¯ÅÍ ¶óÀÎ ¶ó°í¿¡ ´ëÇؼ­ Çؽ¬ ÇÔ¼öÀÇ °ªÀ» °è»êÇØ, ±× °ªÀÌ Á¶ÇÕ ÆÐÅÏÀÇ ±×°Í (¿Í)°ú ÀÏÄ¡ÇÒÁö ¾î¶³Áö¸¦ Á¶»çÇÏ´Â °ÍÀ¸·Î ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕÀ» ½Ç½ÃÇÏ´Â ¹æ¹ýÀÌ´Ù. À²¹ý¹Ú»ç ¿Í Ä«ÇÁ¿¡ ÀÇÇÑ´Ù. Çؽ¬ ÇÔ¼ö¿¡ h(k) = k mod q ¸¦ »ç¿ëÇÑ´Ù. ¿©±â¿¡, q(ÇؽÃÇ¥ÀÇ Å©±â)´Â Å« ¼Ò¼öÀÌ´Ù. ÇؽÃÇ¥´Â ½ÇÁ¦·Î Áغñ ÇÒ ÇÊ¿ä°¡ ¾ø´Â °ÍÀ¸·ÎºÎÅÍ q ·Î¼­ ¸Å¿ì Å« ¼Ò¼ö¸¦ ¼±ÅÃÇÒ ¼ö°¡ ÀÖ´Ù.

ÀÌ ¹æ¹ý¿¡¼­´Â ¿ì¼± Á¶ÇÕ ÆÐÅÏÀÇ Çؽ¬ ÇÔ¼öÄ¡ h1 ¸¦, ´ÙÀ½¿¡ ÅؽºÆ® ÃÖÃÊÀÇ m ¹®ÀÚ ºÐÀÇ Çؽ¬ ÇÔ¼öÄ¡ h2 ¸¦ °è»êÇÑ´Ù. ±× ÈÄ ÅؽºÆ®»ó ÀÇ Á¶ÇÕ °³½Ã À§Ä¡¸¦ ¿À¸¥ÂÊÀ¸·Î ºñÄÑ ³õÀ¸¸é¼­, Çؽ¬ ÇÔ¼öÄ¡¸¦ Á¡È­½Ä¿¡ ÀÇÇØ ÇÕ°è Çì¾Æ·Á, ±× °ª°ú h1 ¿ÍÀÇ ºñ±³¸¦ ¹Ýº¹ÇÑ´Ù.

ÀÌ ¹æ¹ýÀÇ °è»ê·® O(m+n)ÀÌ´Ù. ´Ù¸¥ ij¸¯ÅÍ ¶óÀÎÀÌ °°Àº Çؽ¬ ÇÔ¼öÄ¡¸¦ °¡Áø´Ù (ÀÏ)°ÍÀº ÀÌ·ÐÀûÀ¸·Î´Â ºÎÁ¤ÇÒ ¼ö ¾øÁö¸¸, Å« ¼Ò¼ö q ¸¦ ¼±ÅÃÇÏ¸é ½Ç¿ë»ó ±× ¹®Á¦ (À»)¸¦ ¹«½ÃÇصµ ÁÁ´Ù.

°ü·Ã ÇÔ¼ö
¼Ò¹Ú¹ý¿¡ µû¸£´Â ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕ, KMP¹ý¿¡ µû¸£´Â ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕ, BM¹ý¿¡ µû¸£´Â ij¸¯ÅÍ ¶óÀÎ Á¶ÇÕ, Á¤±Ô Ç¥Çö¿¡ ÀÇÇÑ Ä³¸¯ÅÍ ¶óÀÎ Á¶ÇÕ