What if you could find a needle in a haystack by just checking the shape of the hay instead of every straw?
Why Rabin Karp String Matching in DSA Python?
Imagine you have a huge book and you want to find every place where a certain sentence appears. You try reading every word and comparing it to your sentence, one by one.
This manual way is very slow and tiring. You keep checking the same words again and again, and it's easy to make mistakes or miss some matches because you have to compare each letter every time.
Rabin Karp uses a clever trick: it turns each part of the text into a number (called a hash) and compares these numbers instead of letters. This way, it quickly skips parts that don't match and only checks letters when the numbers match, saving a lot of time.
for i in range(len(text) - len(pattern) + 1): if text[i:i+len(pattern)] == pattern: print('Found at', i)
pattern_hash = hash(pattern) for i in range(len(text) - len(pattern) + 1): if hash(text[i:i+len(pattern)]) == pattern_hash: print('Found at', i)
This method makes searching for patterns in large texts fast and efficient, even when the text is huge.
Search engines use this to quickly find your search words inside billions of web pages without checking every letter one by one.
Manual letter-by-letter search is slow and error-prone.
Rabin Karp uses hashing to speed up pattern matching.
It quickly skips non-matching parts and checks letters only when needed.
Practice
Rabin Karp String Matching algorithm?Solution
Step 1: Understand Rabin Karp's approach
The algorithm uses a hash function to convert the pattern and text substrings into numbers.Step 2: Use hashing for efficient matching
By comparing hash values instead of characters, it quickly finds potential matches.Final Answer:
It uses hashing to find pattern matches efficiently. -> Option AQuick Check:
Hashing = Efficient matching [OK]
- Thinking it compares characters directly without hashing
- Confusing it with sorting-based algorithms
- Assuming it uses recursion
Solution
Step 1: Recall rolling hash formula
Rolling hash removes the old char's contribution and adds the new char's value.Step 2: Apply formula correctly
It subtracts old_char * base^(m-1), multiplies by base, then adds new_char.Final Answer:
new_hash = (old_hash - old_char * base^(m-1)) * base + new_char -> Option CQuick Check:
Rolling hash formula = new_hash = (old_hash - old_char * base^(m-1)) * base + new_char [OK]
- Adding old_char instead of subtracting
- Dividing instead of multiplying by base
- Ignoring power of base for old_char
def rabin_karp(text, pattern):
base = 256
prime = 101
m = len(pattern)
n = len(text)
pattern_hash = 0
text_hash = 0
h = 1
for i in range(m-1):
h = (h * base) % prime
for i in range(m):
pattern_hash = (base * pattern_hash + ord(pattern[i])) % prime
text_hash = (base * text_hash + ord(text[i])) % prime
for i in range(n - m + 1):
if pattern_hash == text_hash:
if text[i:i+m] == pattern:
return i
if i < n - m:
text_hash = (base * (text_hash - ord(text[i]) * h) + ord(text[i + m])) % prime
if text_hash < 0:
text_hash += prime
return -1
print(rabin_karp('ababc', 'abc'))Solution
Step 1: Calculate pattern and initial text hash
Pattern 'abc' length 3, initial text substring 'aba'. Hashes differ, so move forward.Step 2: Slide over text and compare hashes
At index 1, substring 'bab' hash differs. At index 2, substring 'abc' hash matches pattern hash and strings match.Final Answer:
2 -> Option DQuick Check:
Pattern found at index 2 [OK]
- Returning first hash match without substring check
- Confusing index positions
- Ignoring negative hash adjustment
text_hash = (base * (text_hash - ord(text[i]) * h) + ord(text[i + m])) % prime
if text_hash < 0:
text_hash = text_hash - primeSolution
Step 1: Understand negative hash correction
If hash is negative after modulo, add prime to make it positive.Step 2: Identify incorrect operation
Code subtracts prime instead of adding it, causing wrong hash values.Final Answer:
The negative hash correction should add prime, not subtract. -> Option AQuick Check:
Negative hash fix = add prime [OK]
- Subtracting prime instead of adding
- Ignoring negative hash values
- Misplacing modulo operation
Solution
Step 1: Understand multiple pattern search challenge
Running Rabin Karp separately for each pattern is inefficient for many patterns.Step 2: Use combined hashing approach
Hash all patterns and store in a set. Then check each text substring's hash against this set for quick matches.Final Answer:
Use a combined hash set of all patterns and check text substrings against it. -> Option BQuick Check:
Combined hash set = efficient multi-pattern search [OK]
- Running separate searches for each pattern
- Sorting patterns instead of hashing
- Using recursion unnecessarily
Ready to prove it?
Pass the test and this pattern moves unknown
