কম্পিউটার

রাবিন-কার্প অ্যালগরিদম


Rabin-Karp হল আরেকটি প্যাটার্ন সার্চিং অ্যালগরিদম যাতে প্যাটার্নটিকে আরও দক্ষ উপায়ে খুঁজে বের করা যায়। এটি একের পর এক উইন্ডো সরানোর মাধ্যমে প্যাটার্নটিও পরীক্ষা করে, কিন্তু সমস্ত ক্ষেত্রে সমস্ত অক্ষর পরীক্ষা না করে, এটি হ্যাশ মান খুঁজে পায়। যখন হ্যাশ মান মিলে যায়, তখনই এটি প্রতিটি অক্ষর চেক করার চেষ্টা করে। এই পদ্ধতিটি অ্যালগরিদমকে আরও দক্ষ করে তোলে৷

সময়ের জটিলতা হল O(m+n), কিন্তু সবচেয়ে খারাপ ক্ষেত্রে এটি হল O(mn)।

ইনপুট এবং আউটপুট

Input:
Main String: “ABAAABCDBBABCDDEBCABC”, Pattern “ABC”
Output:
Pattern found at position: 4
Pattern found at position: 10
Pattern found at position: 18

অ্যালগরিদম

rabinKarpSearch(text, pattern, prime)

ইনপুট - মূল পাঠ্য এবং প্যাটার্ন। হ্যাশ অবস্থান খোঁজার আরেকটি প্রধান সংখ্যা

আউটপুট - অবস্থান যেখানে নিদর্শন পাওয়া যায়

Begin
   patLen := pattern Length
   strLen := string Length
   patHash := 0 and strHash := 0, h := 1
   maxChar := total number of characters in character set

   for index i of all character in pattern, do
      h := (h*maxChar) mod prime
   done

   for all character index i of pattern, do
      patHash := (maxChar*patHash + pattern[i]) mod prime
      strHash := (maxChar*strHash + text[i]) mod prime
   done

   for i := 0 to (strLen - patLen), do
      if patHash = strHash, then
         for charIndex := 0 to patLen -1, do
            if text[i+charIndex] ≠ pattern[charIndex], then
               break the loop
         done

         if charIndex = patLen, then
            print the location i as pattern found at i position.
      if i < (strLen - patLen), then
         strHash := (maxChar*(strHash – text[i]*h)+text[i+patLen]) mod prime, then
      if strHash < 0, then
         strHash := strHash + prime
   done
End

উদাহরণ

#include<iostream>
#define MAXCHAR 256
using namespace std;

void rabinKarpSearch(string mainString, string pattern, int prime, int array[], int *index) {
   int patLen = pattern.size();
   int strLen = mainString.size();
   int charIndex, pattHash = 0, strHash = 0, h = 1;

   for(int i = 0; i<patLen-1; i++) {
      h = (h*MAXCHAR) % prime;    //calculating h = {d^(M-1)} mod prime
   }
   
   for(int i = 0; i<patLen; i++) {
      pattHash = (MAXCHAR*pattHash + pattern[i]) % prime;    //pattern hash value
      strHash = (MAXCHAR*strHash + mainString[i]) % prime;   //hash for first window
   }
   
   for(int i = 0; i<=(strLen-patLen); i++) {
      if(pattHash == strHash) {      //when hash values are same check for matching
         for(charIndex = 0; charIndex < patLen; charIndex++) {
            if(mainString[i+charIndex] != pattern[charIndex])
               break;
         }

         if(charIndex == patLen) {    //the pattern is found
            (*index)++;
            array[(*index)] = i;
         }
      }

      if(i < (strLen-patLen)) {    //find hash value for next window
         strHash = (MAXCHAR*(strHash - mainString[i]*h) + mainString[i+patLen])%prime;
         if(strHash < 0) {
            strHash += prime;    //when hash value is negative, make it positive
         }
      }
   }
}

int main() {
   string mainString = "ABAAABCDBBABCDDEBCABC";
   string pattern = "ABC";
   int locArray[mainString.size()];
   int prime = 101;
   int index = -1;
   rabinKarpSearch(mainString, pattern, prime, locArray, &index);

   for(int i = 0; i <= index; i++) {
      cout << "Pattern found at position: " << locArray[i]<<endl;
   }
}

আউটপুট

Pattern found at position: 4
Pattern found at position: 10
Pattern found at position: 18

  1. ফোর্ড ফুলকারসন অ্যালগরিদম

  2. ফ্লয়েড ওয়ারশাল অ্যালগরিদম

  3. C++ এ প্যাটার্ন অনুসন্ধানের জন্য আহো-কোরাসিক অ্যালগরিদম

  4. C++ এ Z অ্যালগরিদম (লিনিয়ার টাইম প্যাটার্ন সার্চিং অ্যালগরিদম)