Rabin Karp Alqoritmi

Çətinlik səviyyəsi Ağır
Tez-tez soruşulur Akkolit Amazon MakeMyTrip MAQ Kahin PayU
Nümunə axtarışı SimBaxılıb 124

Sistem dizaynı ilə bağlı müsahibə sualları o qədər açıq ola bilər ki, düzgün hazırlaşmağı bilmək çox çətindir. İndi satın aldıqdan sonra Amazon, Microsoft və Adobe-nin dizayn dövrlərini sındıra bilirəm Bu kitabı. Gündəlik bir yenidən nəzərdən keçirin dizayn sualı və söz verirəm ki, dizayn dövrünü sındıra bilərsiniz.

Rabin Karp Alqoritmi naxışı tapmaq üçün istifadə olunur sim verilmiş mətn sətrində. Nümunə sətirini tapmaq üçün istifadə olunan çox sayda alqoritm və ya metod var. Bu alqoritmdə istifadə edirik Hashing naxış uyğunluğunu tapmaq üçün. Substring və model string üçün eyni hash kodunu əldə etmişiksə, başqa rəqəmlərin növbəti alt sətirə keçməsini yoxlayırıq. Bir simvolun bəzi kod dəyərlərindən istifadə edərək simli üçün hash kodu tapırıq. Daha yaxşı başa düşmək üçün bir nümunə görək.

Rabin Karp AlqoritmiPin

Simvollar üçün hash kodu aşağıda verilmişdir.

Rabin Karp AlqoritmiPin

Rabin Karp Alqoritminin işlənməsi

Step-1

Simvollar üçün təyin edilmiş hash kodunu istifadə edərək naxış sətrinin hash kod dəyərini tapın.

Rabin Karp AlqoritmiPin

Step-2

M naxış sətrinin uzunluğudursa, mətn sətrinin əvvəlindən M uzunluğu alt sətir götürməyə başlayırıq. Bundan sonra alt sətir üçün hash kodu dəyərini tapın və naxış sətrinin hash kod dəyəri ilə uyğun olub olmadığını yoxlayın. Eşleşirsə, onda bir-bir simvol yoxlayır, növbəti alt sətirə keçir.

Pin

Hash kodu dəyəri eyni deyil, sonra M (4) uzunluğunun növbəti alt sətirinə keçirik.

Step-3

Pin

Hash kodu dəyəri eyni deyil, sonra M uzunluğunun növbəti alt sətrinə keçirik.

Step-4

Pin

Hash kodu dəyəri burada da eyni deyil, buna görə növbəti alt sətirə keçirik.

Step-5

Pin

Hash kodu dəyəri burada eynidır, buna görə alt simvolları nümunə sətri ilə bir-bir yoxlayırıq.

Pin

Bütün simvollar uyğun gəldi sonra alt sətrin başlanğıc indeksini çap edirik və mümkünsə M uzunluğunun növbəti alt sətrinə keçirik.

Step-6

Pin

Cari alt sətrin hash kodunun dəyəri naxış sətrinin hash kodu dəyəri ilə uyğunlaşmır. Beləliklə, M uzunluğunun növbəti alt sətirinə keçin, əgər mümkündürsə dayandırın.

Step-7

Pin

Hash kodu dəyəri burada da uyğun gəlmir və bu M uzunluğunun son alt sətiridir. Beləliklə, prosesimizi burada dayandırırıq.

Qeyd: Qarışıq funksiyasını yaratmaq və ya müəyyənləşdirmək üçün müxtəlif yollar var, daha yaxşı başa düşmək üçün sadə bir hash funksiyasından istifadə edirəm. Tətbiq hissəsində, hash funksiyasını elə edərəm ki, hash kodu dəyərini tapmaq effektiv olsun O (1) vaxt.

Alqoritm

Step:1 Find the hash code value of the given pattern string of length M.
Step:2 For i in range 1 to N-M+1:
       i) Find the hash code value using hash function.
       ii) Check if the hash code match to the pattern string hash code value then print the starting index of substring.
       iii) If not matching then move to the next substring.

Həyata keçirilməsi

/*C++ Implementation of Rabin Karp Algorithm.*/ 
#include<bits/stdc++.h> 
using namespace std; 
/*function to find the pattern in effective way*/
void rabin_karp(string &text,string &pattern, int q)
{
    /*length of the pattern string*/
  int m = pattern.length();
  /*length of the text string*/
  int n = text.length();
  int p=0,t=0,h=1,d=26;// here p is the hash value for pattern and t is the hash value of the substring;
  /*h=pow(d,M-1) where d is 26 if the text contain only lowe case characters.*/
  for(int i=0;i<m-1;i++)
  {
    h=(h*d)%q;
    }
    /*calculate the hash value for the pattern string and the first substring of length m*/
  for(int i=0;i<m;i++)
  {
    p=(d*p+pattern[i])%q;//pattern string;
    t=(d*t+text[i])%q;//substring;
  }
  /*for remaining substring of length m*/
  for(int i=0;i<=n-m;i++)
  {
      /*if hash values are same then check charachter by character in substring and pattern string.*/
    if(p==t)
    {
        int flag=0;
      for(int j=0;j<m;j++)
      {
        if(text[i+j]!=pattern[j])
        {
            flag=1;
          break;
        }
      }
      /*if all the character are match then print the starting index of substring.*/
      if(flag==0)
      {
        cout<<"Pattern found at index: "<<i+1<<endl;
      }
    }
    /*find the hash value of the next substring by removinf the first character from previos substring
     and add next char to the end of the previous string*/
     /*it take O(1) time to find the hash values*/
    if(i<n-m)
    {
      t=(d*(t-text[i]*h)+text[i+m])%q;
      if(t<0)
      {
        t=(t+q);
      }
    }
  }
}
int main() 
{
    /*input values*/
    string text;
    cin>>text;
    string pattern;
    cin>>pattern;
    rabin_karp(text,pattern,97);
    return 0;
}
Input-1:
aevesapng
esap
Output-1:
Pattern found at index: 4
Input-2:
asadschdgdcaadvadwhemvaadvdeaadvs
aadv
Output-2:
Pattern found at index: 12
Pattern found at index: 23
Pattern found at index: 29

Zamanın mürəkkəbliyi

O (N * M) dır,-dir,-dur,-dür Ən pis halda bütün alt sətrin naxış sətirinə bərabər olduğu zaman mürəkkəbliyi. Çünki xaş dəyəri eyni olduqda, simvolları xarakterə görə yoxlayırıq, buna görə hər alt sətri yoxlamaq üçün O (M) vaxt tələb olunur. Ən yaxşı və orta zamanın mürəkkəbliyi O (N + M) burada N - mətn sətrinin uzunluğu və M - naxış sətrinin uzunluğu.

Kosmik Mürəkkəblik

O (1) kosmik mürəkkəblik deməkdir ki, nəticəni tapmaq üçün əlavə yer istifadə etmirik. Yalnızca hash dəyərini tapırıq və dəyişənlərdə saxlayırıq. Beləliklə, burada bir neçə dəyişəndən istifadə etdik, yəni böyük ölçülü yaddaşdan istifadə etmirik.

References

Crack Sistemi Dizayn Müsahibələri
Translate »