- Rabin karp algorithm is a pattern searching algorithm.
-
In this algo we check for every window of length M(pattern length) and slide the M length window on given text.
-
we first calculate hash value of pattern and hash value of M - length text.
-
for getting Hash value , we create a hash Function which gives us hash value for a given string.
-
Now one by one we slide the pattern on text and
-
if (Hahs_value_pattern == Hash_value_textWindow) , then we check every character of pattern and cuurent text and if they all match we retuen
True
. -
if(patterns not match then compute Hash value for Hash_value_text[i+1] using Hash_value_text[i]).
-
-
after loop termination we are sure that pattern is not present in the given text. So return
False
.
Input
Output
- Pattern is present in the text.
Implementation
C++ #include <bits/stdc++.h> using namespace std; #define d 256 const int m = 201;
int hashFun(string s, int n) { int val = 0; for (int i = 0; i < n; i++) { val = (val * d + s[i]) % m; } return val; }
bool Rk_Search(string text, string pat) { int N = text.length(), M = pat.length(); // calculating (d^(M-1)) % m int h = 1; for (int i = 0; i < M; i++) { h = (h * d) % m; }
int hash_pat = hashFun(pat, M);
int hash_text = hashFun(text, M);
for (int i = 0; i <= (N - M); i++)
{
if (hash_pat == hash_text)
{
bool flag = true;
// checking every character when we face spurious hit
for (int j = 0; j < M; j++)
{
if (text[i + j] != pat[j])
{
flag = false;
break;
}
}
if (flag)
{
return true;
}
}
//Compute hash_text(i+1) using hash_text(i)
if (i < N - M)
{
hash_text = ((d * (hash_text - text[i] * h)) + text[i + M]) % m;
// this corner case is for condition when hash_text become -ve.
if (hash_text < 0)
hash_text = hash_text + m;
}
}
return false;
}
int main() { string text, pat;
cout << "Enter text : ";
cin >> text;
cout << "Eneter pattern to be searched : ";
cin >> pat;
if (Rk_Search(text, pat))
{
cout << "Pattern is present in the text." << endl;
}
else
{
cout << "Pattern is not present in the text." << endl;
}
return 0;
}
Complexity Analysis
- Time
- Worst Case : O((N-M+1)*M) , worst case of this algorithm occurs when we get spusrious hit.
- Best Case : O(M+N) and better than Brute force Solution.
- Space
- O(1)
Spurious Hit
-
When the hash value of the pattern matches with the hash value of a window of the text but the window is not the actual pattern then it is called a spurious hit.
-
Spurious hit increases the time complexity of the algorithm. In order to minimize spurious hit, we use modulus. It greatly reduces the spurious hit.
- For pattern searching.
- For searching string in a large text.