What if you could find any phrase in a huge book almost instantly without reading every word?
Why Rabin Karp String Matching in DSA C?
Imagine you have a huge book and you want to find every place where a short phrase appears. You try reading every word and comparing it to your phrase by hand.
This manual way is very slow and tiring. You keep checking each word one by one, and if the book is very long, it takes forever. You might also make mistakes by missing some matches or checking the same parts again and again.
Rabin Karp uses a clever math trick called hashing to quickly check if parts of the book might match your phrase. Instead of comparing every letter, it compares numbers that represent the words. This makes searching much faster and less error-prone.
for (int i = 0; i <= text_length - pattern_length; i++) { int j; for (j = 0; j < pattern_length; j++) { if (text[i + j] != pattern[j]) break; } if (j == pattern_length) printf("Match at %d\n", i); }
int pattern_hash = compute_hash(pattern, pattern_length); int text_hash = compute_hash(text, pattern_length); for (int i = 0; i <= text_length - pattern_length; i++) { if (pattern_hash == text_hash && compare_strings(text + i, pattern, pattern_length)) { printf("Match at %d\n", i); } if (i < text_length - pattern_length) { text_hash = roll_hash(text_hash, text[i], text[i + pattern_length]); } }
It enables fast and efficient searching of patterns in large texts by turning strings into numbers for quick comparison.
Finding a specific word or phrase in a large document, like searching for a name in thousands of pages of legal documents instantly.
Manual checking is slow and error-prone for large texts.
Rabin Karp uses hashing to speed up pattern searching.
This method makes searching large texts fast and reliable.
Practice
Rabin Karp String Matching algorithm?Solution
Step 1: Understand the algorithm's approach
Rabin Karp uses hashing to convert strings into numbers for quick comparison.Step 2: Compare hash values instead of characters
It compares hash values of the pattern and text substrings to find matches efficiently.Final Answer:
Use hashing to find pattern matches efficiently -> Option BQuick Check:
Hashing = Efficient matching [OK]
- Thinking it compares characters directly always
- Confusing with brute force matching
- Assuming sorting is involved
s[i..i+m-1] to s[i+1..i+m]?Solution
Step 1: Understand rolling hash update formula
Remove the leftmost character's weighted value, multiply by base, add new character.Step 2: Apply formula to substring shift
hash = (hash - s[i] * power) * base + s[i+m] correctly updates the hash.Final Answer:
hash = (hash - s[i] * power) * base + s[i+m] -> Option CQuick Check:
Remove left char, multiply, add right char [OK]
- Adding instead of subtracting old char
- Wrong order of operations
- Mixing indices of characters
#include
#include
#define base 256
#define prime 101
int main() {
char text[] = "ababc";
char pattern[] = "abc";
int n = strlen(text), m = strlen(pattern);
int p = 0, t = 0, h = 1, i, j;
for (i = 0; i < m-1; i++)
h = (h * base) % prime;
for (i = 0; i < m; i++) {
p = (base * p + pattern[i]) % prime;
t = (base * t + text[i]) % prime;
}
for (i = 0; i <= n - m; i++) {
if (p == t) {
for (j = 0; j < m; j++) {
if (text[i+j] != pattern[j])
break;
}
if (j == m)
printf("Pattern found at index %d\n", i);
}
if (i < n - m) {
t = (base * (t - text[i] * h) + text[i + m]) % prime;
if (t < 0) t = t + prime;
}
}
return 0;
}Solution
Step 1: Calculate initial hashes and check first substring
Pattern "abc" hash matches substring "aba" at index 0? No, characters differ.Step 2: Slide window and check next substring
At index 1, substring "bab" hash differs. At index 2, substring "abc" matches pattern exactly.Final Answer:
Pattern found at index 2 -> Option AQuick Check:
Match at index 2 = Pattern found at index 2 [OK]
- Assuming match at index 0 without verification
- Ignoring negative hash correction
- Not verifying characters after hash match
t = (base * (t - text[i] * h) + text[i + m]) % prime; if (t < 0) t = t - prime;
Solution
Step 1: Understand negative hash correction
If hash becomes negative after modulo, add prime to keep it positive.Step 2: Check given code's correction
Code subtracts prime when t < 0, which makes t more negative. It should add prime.Final Answer:
Should add prime instead of subtracting when t < 0 -> Option AQuick Check:
Negative hash fix = add prime [OK]
- Subtracting prime instead of adding
- Ignoring negative hash values
- Confusing modulo operation behavior
Solution
Step 1: Count possible substrings of length 3 in text
Text length 6, pattern length 3, so 6 - 3 + 1 = 4 substrings.Step 2: Check each substring for pattern match
All substrings "aaa" at indices 0,1,2,3 match pattern including overlaps.Final Answer:
4 matches, because overlapping occurrences are counted -> Option DQuick Check:
Overlapping matches counted = 4 [OK]
- Ignoring overlapping matches
- Assuming only non-overlapping matches count
- Confusing hash collisions with matches
Ready to prove it?
Pass the test and this pattern moves unknown
