📖 Scenario: You are building a simple text search tool that finds if a small pattern exists inside a larger text. This is like searching for a word in a book.
🎯 Goal: Implement the Rabin Karp algorithm to find the first position of a pattern string inside a text string using hashing.
📋 What You'll Learn
Create variables for the text and pattern strings
Set up variables for the hashing base and modulus
Calculate initial hash values for pattern and first window of text
Slide over the text to check for matching hash and then verify characters
Print the starting index of the first match or -1 if no match
💡 Why This Matters
🌍 Real World
Text search is used in search engines, editors, and DNA sequence analysis to quickly find patterns.
💼 Career
Understanding Rabin Karp helps in roles involving text processing, software development, and algorithm optimization.
Progress0 / 4 steps
1
Create the text and pattern strings
Create a variable called text and set it to the string "abracadabra". Create another variable called pattern and set it to the string "cada".
DSA Python
Hint
Use simple string assignment like text = "abracadabra".
2
Set up hashing base and modulus
Create a variable called base and set it to 256. Create another variable called modulus and set it to 101. These will be used for hashing.
DSA Python
Hint
Use base = 256 and modulus = 101 exactly.
3
Calculate initial hashes and implement Rabin Karp logic
Create variables pattern_hash and text_hash and set them to 0. Create a variable h and set it to 1. Calculate h as (base ** (len(pattern) - 1)) % modulus. Use a for loop with variable i from 0 to len(pattern) - 1 to calculate the initial hash values for pattern_hash and text_hash. Then use a for loop with variable i from 0 to len(text) - len(pattern) + 1 to slide over the text, check if hashes match, and if so, verify characters one by one. If a match is found, set a variable result to the starting index i and break the loop. If no match is found, set result to -1.
DSA Python
Hint
Calculate h first, then initial hashes, then slide over text checking hashes and characters.
4
Print the result index
Write a print statement to display the value of the variable result.
DSA Python
Hint
Use print(result) to show the index.
Practice
(1/5)
1. What is the main idea behind the Rabin Karp String Matching algorithm?
easy
A. It uses hashing to find pattern matches efficiently.
B. It compares each character one by one without hashing.
C. It sorts the text before searching for the pattern.
D. It uses recursion to find the pattern in the text.
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 A
Quick Check:
Hashing = Efficient matching [OK]
Hint: Remember: Rabin Karp uses hashing for fast pattern search [OK]
Common Mistakes:
Thinking it compares characters directly without hashing
Confusing it with sorting-based algorithms
Assuming it uses recursion
2. Which of the following is the correct way to compute the rolling hash in Rabin Karp for the next substring?
easy
A. new_hash = old_hash * old_char + new_char
B. new_hash = old_hash + old_char - new_char
C. new_hash = (old_hash - old_char * base^(m-1)) * base + new_char
D. new_hash = old_hash / base + new_char * base^(m-1)
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 C
Quick Check:
Rolling hash formula = new_hash = (old_hash - old_char * base^(m-1)) * base + new_char [OK]
Hint: Subtract old char, multiply by base, add new char [OK]
Common Mistakes:
Adding old_char instead of subtracting
Dividing instead of multiplying by base
Ignoring power of base for old_char
3. What will be the output of the following code snippet using Rabin Karp to find pattern 'abc' in text 'ababc'?
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'))
medium
A. 0
B. 1
C. -1
D. 2
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 D
Quick Check:
Pattern found at index 2 [OK]
Hint: Check hash then substring; match at index 2 [OK]
Common Mistakes:
Returning first hash match without substring check
Confusing index positions
Ignoring negative hash adjustment
4. Identify the bug in this Rabin Karp implementation snippet:
text_hash = (base * (text_hash - ord(text[i]) * h) + ord(text[i + m])) % prime
if text_hash < 0:
text_hash = text_hash - prime
medium
A. The negative hash correction should add prime, not subtract.
B. The subtraction of ord(text[i]) * h is incorrect.
C. The modulo operation should be done after adding prime.
D. The base should be added, not multiplied.
Solution
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 A
Quick Check:
Negative hash fix = add prime [OK]
Hint: Add prime if hash is negative, never subtract [OK]
Common Mistakes:
Subtracting prime instead of adding
Ignoring negative hash values
Misplacing modulo operation
5. Given a large text and multiple patterns, which modification to Rabin Karp helps efficiently find all patterns in the text?
hard
A. Run Rabin Karp separately for each pattern without optimization.
B. Use a combined hash set of all patterns and check text substrings against it.
C. Sort all patterns and use binary search on text substrings.
D. Use recursion to search each pattern in the text.