3.8.3 · HinglishString Algorithms

Rabin-Karp — rolling hash, O(n+m) expected

1,411 words6 min readRead in English

3.8.3 · Coding › String Algorithms


Hum KON SA problem solve kar rahe hain?

Ek text diya hai jiskii length hai aur ek pattern diya hai jiskii length hai; hume har woh position dhundni hai jahan occur karta ho mein (yaani ).

Naive approach har windows ko characters compare karke check karta hai → worst case . Rabin-Karp ka target hai expected.


Hashing KYUN help karta hai

Agar , toh strings definitely alag hain — turant skip karo. Agar , toh woh probably equal hain, isliye hum verify karte hain. Equal strings ka hash hamesha equal hota hai, isliye hum koi match miss nahi karte. Ek hi risk hai false positive (collision), jisme extra check lagta hai.


KAISE: hash ko first principles se build karna

Ek string ko base mein ek number ki tarah treat karo (digits ki tarah socho). Ek string jo length ki hai, jiske character codes hain:

Rolling update derive karna

Hamare paas window ka hash hai:

Hume chahiye window ke liye. Teen operations:

  1. Remove karo leading char ko, jo contribute karta hai.
  2. Shift left (multiply by ): baaki har term ka exponent 1 badh jaata hai.
  3. Add karo naya trailing char .

Toh:

Yeh step KYUN? Subtract karne se purana high-order digit khatam hota hai; se multiply karne par sab shift ho jaate hain; add karne se naya low-order digit insert hota hai. Sab — yahi poora speedup hai.

Figure — Rabin-Karp — rolling hash, O(n+m) expected

Complexity — expected KYUN hai

  • aur precompute karo: .
  • windows par slide karo, har update : .
  • Sirf hash matches par verify karo. Ek acche prime se, spurious match ki probability roughly hoti hai, isliye expected verification cost tiny hai → total expected.
  • Worst case (har window collide kare, jaise small ke saath adversarial input).

Worked Example 1 — chhota sa haath se

dhundho mein. Base , , code lo.

  • .
  • Window 0 = "aa": . Kyun? digits hain . → skip.
  • Roll karo window 1 = "ab" par: . . Kyun? leading 'a'(=0) remove hua, shift hua, 'b'(=1) add hua. se match → verify → "ab"=="ab" ✓. Index 1 par match.

Worked Example 2 — ek collision (steel-man)

, jisme aise choose kiya ki do alag strings ka hash equal ho jaaye. Maano bad luck se.

  • Hashes match karte hain → hume zaroor char-by-char verify karna hai.
  • Verification fail hoti hai → hum correctly reject karte hain. Yeh kyun matter karta hai: hash ek filter hai, proof nahi. Verification skip karna fake match report karega.

Common Mistakes


Flashcards

Rabin-Karp ki core idea
Pattern ko hash karo; usse har text window ke rolling hash se mein compare karo; matches par verify karo.
Hash match ke baad verify kyun karte hain?
Hash equality necessary hai par sufficient nahi — alag strings collide ho sakti hain, jo false positives deti hain.
Rolling update formula
.
Roll mein se multiply KYUN karte hain?
Leading character drop karne ke baad baaki har digit ko ek place upar shift karne ke liye.
Expected vs worst time
Expected ; worst case jab har window collide kare.
Prime ka role
Numbers bounded rakhta hai aur collision probability ~ banata hai; bada prime → kam false positives.
rolls ke liye kya precompute karna padta hai?
(high-power weight).
Negative hash values se kaise bachein?
Final mod se pehle add karo: ((x) % q + q) % q.

Recall Feynman: ek 12-saal ke bacche ko explain karo

Socho har word ko uske letters se ek secret number mein convert kiya jaata hai, jaise ek fingerprint. Ek lambe sentence mein koi word dhundhne ke liye, tum ek window slide karte ho aur uska fingerprint compute karte ho. Har baar bilkul naya fingerprint compute karna slow hai — par yahan magic yeh hai: jab tum ek letter aage slide karte ho, tum bas pehle letter ka hissa mitaate ho aur naye letter ka hissa add karte ho, bahut fast. Agar do fingerprints match karein, tum actual letters double-check karte ho (kyunki kabhi-kabhi do alag words ka fingerprint same hota hai). Woh double-check tumhara safety net hai.


Connections

  • Hashing — polynomial / modular hash ke foundations
  • Modular Arithmetic — kyun hum prime use karte hain aur negatives se bachte hain
  • Knuth-Morris-Pratt — guaranteed (koi collision nahi) failure function ke zariye
  • Z-Algorithm — ek aur linear pattern matcher
  • String Hashing for Substring Comparison — same rolling idea range equality ke liye
  • Birthday Paradox — collision probability ka intuition

Concept Map

too slow

compares

based on

reduced by

updated by

remove shift add

mismatch

match

guards against

lowers

gives

adversarial

Naive match O of nm

Rabin-Karp

Hash of pattern vs window

Polynomial base-b hash

Mod large prime q

Rolling hash O of 1

Slide window

Skip instantly

Verify char-by-char

Hash collisions

O of n+m expected

Worst case O of nm